Mybatis 当实体属性与数据库字段不一致时的解决方案
程序员文章站
2024-03-04 10:42:35
...
Mybatis 当实体属性与数据库字段不一致时的解决方案
学习要点
Mybatis 当实体属性与数据库字段不一致时的解决方案
Mybatis 当实体属性与数据库字段不一致时的解决方案
1. MyBatis简单项目搭建参考
2. 修改代码
1.项目结构
2.添加User1实体类
package com.pkk.entity;
/**
* @author peikunkun
* @version V1.0
* @Title: MyBatisProject
* @Package com.pkk.entity
* @Description: <用户测试用户字段名与实体名称不一致的实体类>
* @date 2017/12/31 19:31
*/
public class User1 {
private Integer id;
private String name;
private String password;
public User1() {
}
public User1(String name, String password) {
this.name = name;
this.password = password;
}
public User1(Integer id, String name, String password) {
this.id = id;
this.name = name;
this.password = password;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User1{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
'}';
}
}
3.扩展配置文件userExtendMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.pkk.test.mappertest.userExtendMapper">
<select id="selectUserByDiffProperties" resultType="com.pkk.entity.User1" parameterType="int">
SELECT * FROM USER where id = #{id}
</select>
</mapper>
4.select实体类添加方法public void select2() {}
/**
* @param
* @return void
* @Description: <验证数据库字段与实体字段不一致的解决方案>
* @author peikunkun
* @date 2017年2018/1/22 17:32
* @version V1.0
*/
@Test
public void select2() {
List<User1> user1s = session.selectList("com.pkk.test.mappertest.userExtendMapper.selectUserByDiffProperties", 2);
System.out.println(user1s.iterator().next().toString());
}
运行结果:
User1{id=2, name='null', password='密码1392339818'}
5.问题说明:
使用Mybatis的时候,Mybatis根据数据库的字段找到对应实体类的属性,通过set方法对属性进行注入。
如果实体类的属性名和数据库的字段名不相同,从上面可以发现,没有通过set方法进行注入,而且user1对象的name的值为NULL.
6.问题解决:
- 方法一:修改查询语句增加别名
- 修改userExtendMapper.xml(com.pkk.test.mappertest.userExtendMapper.selectUserByDiffProperties)文件的查询,如下,也就是改查询字段起个别名来实现。
<mapper namespace="com.pkk.test.mappertest.userExtendMapper">
<select id="selectUserByDiffProperties" resultType="com.pkk.entity.User1" parameterType="int">
SELECT id,username as name,password FROM USER where id = #{id}
</select>
</mapper>- 运行结果:
User1{id=2, name='账号-1056232709', password='密码1392339818'}
- 方法二:添加关联映射
- 增加关联映射,查询时候不在使用resultType而是使用resultMap引用设置的resultMap的id
- 代码:
查询方法:
/**
* @param
* @return void
* @Description: <验证数据库字段与实体字段不一致的解决方案----关联映射>
* @author peikunkun
* @date 2017年2018/1/22 17:32
* @version V1.0
*/
@Test
public void select3() {
List<User1> user1s = session.selectList("com.pkk.test.mappertest.userExtendMapper.selectUserByDiffProperties_1", 2);
System.out.println(user1s.iterator().next().toString());
}
运行结果:
User1{id=2, name='账号-1056232709', password='密码1392339818'}
两种方法都可以解决实体属性和数据库字段不一致的问题,不过一般都是使用第二种,通过添加关联映射来解决该问题。