MyBatis解决在开发过程中实体类属性和数据库列名不一致的问题
记:之前我们规定 编写实体类的时候, 属性和数据库列名 必须保持 一致。
思考:二开、业务变化等等的时候,此时数据库中的列名和实体类的属性名就是不一致,怎么解决?
实体类属性和数据库列名不一致,如下图所示:
演示 属性和数据库列名 不一情况下,数据库 改 操作
提示:这里只演示改操作。
记:在修改配置文件 IUserDao.xml 后,增删改操作基本可以满足开发需要。
------
新建实体类:UserV2.java
代码如下:
------
public class UserV2 {
private int userId;
private String userName;
private Date userBirthday;
private String userSex;
private String userAddress;
...
------
接口:IUserDao.java,新增 updateUserV2 方法
代码如下:
-------
/**
* 用户修改v2
* @param userv2
*/
void updateUserV2(UserV2 userv2);
-------
配置文件: IUserDao.xml ,代码如下:
-------
<!--更新用户操作V2-->
<update id="updateUser" parameterType="com.abc2.domain.UserV2">
UPDATE USER SET \`username\`=#{userName},\`address\`=#{userAddress},\`sex\`=#{userSex},\`birthday\`=#{userBirthday} WHERE id=#{userId};
</update>
测试文件,代码如下:
@Test
public void updateUserV2Test() {
UserV2 user = new UserV2();
user.setUserId(70);
user.setUsername("小明");
user.setUserAddress("外星球-月球22");
user.setUserSex("女");
user.setUserBirthday(new Date());
//更新用户
userDao.updateUserV2(user);
//执行提交
sqlSession.commit();
}
结果如下,修改成功!
总结:
一般来说,增删改的方法,就算实体属性和数据库列名不一致,通过配置后,也可以正常运行。
但是,在查询的时候,如果不一致,就会出异常!
演示 属性和数据库列名 不一情况下,数据库 查 操作
查询的时候,列名无法对齐,导致数据出现异常。
接口:IUserDao.java
/**
* 查询所有数据V2
* @return
**/
List<UserV2> findAllV2();
配置文件:IUserDao.xml
<!--配置查询所有 指定id,resultType结果集类型 -->
<select id="findAllV2" resultType="com.abc2.domain.UserV2">
select \* from user
</select>
测试类:Test
@Test
public void findAllV2Test() {
List<UserV2> allV2 = userDao.findAllV2();
System.out.println("-------");
for (UserV2 item : allV2) {
System.out.println(item);
}
System.out.println("-------");
}
运行结果,如下图所示:
提示:mysql数据库在windows系统下不区分大小写。如果是linux系统下,是严格区分大小写的。
解决方案:
- 设置查询别名(了解);
- 配置 查询结果的列名和实体类的属性名的对应关系(推荐使用!理由:这个resultMap可以复用,修改起来也方便);
修改配置文件:IUserDao.xml
<!--配置:查询结果的列名和实体类的属性名对应关系-->
<resultMap id="userMap2" type="com.abc2.domain.UserV2"\>
<!--主键字段的对应-->
<id property="userId" column="id"></id>
<!--非主键字段对应-->
<result property="userName" column="username"></result>
<result property="userBirthday" column="birthday"></result>
<result property="userSex" column="sex"></result>
<result property="userAddress" column="address"></result>
</resultMap>
<!--配置查询所有 指定id,resultType结果集类型 -->
<select id="findAllV2" resultMap\="userMap2">
<!-- 使用查询别名-了解即可! -->
<!-- select id as userId,username as userName,birthday as userBirthday,sex as userSex,address as userAddress from user;-->
select \* from user;
</select>
测试类:Test
@Test
public void findAllV2Test() {
List<UserV2> allV2 = userDao.findAllV2();
System.out.println("-------");
for (UserV2 item : allV2) {
System.out.println(item);
}
System.out.println("-------");
}
查询结果如下:
欢迎大家来评论!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。