MyBatis 中 resultMap 的使用。
文章目录
问题引入。
MyBatis 是半自动的 orm 框架,底层实现了将数据库的记录自动封装为 JavaBean。
但前提条件是 JavaBean 的属性名和数据库表的列名完全一致。
eg.
表的列名
public class User implements Serializable {
private Integer id;
private String username;
private String address;
private String sex;
private Date birthday;
但如果,JavaBean 的属性名不一致,
public class User implements Serializable {
private Integer userId;
private String userName;
private String userAddress;
private String userSex;
private Date userBirthday;
查询的结果封装到 JavaBean 就是 null。(无法成功封装)。
User{userId=null, userName='geek', userAddress='null', userSex='null', userBirthday=null}
User{userId=null, userName='geek_insert_test', userAddress='null', userSex='null', userBirthday=null}
User{userId=null, userName='update_test', userAddress='null', userSex='null', userBirthday=null}
User{userId=null, userName='geek_insert_test', userAddress='null', userSex='null', userBirthday=null}
User{userId=null, userName='李逸凡', userAddress='null', userSex='null', userBirthday=null}
User{userId=null, userName='李逸凡 geek', userAddress='null', userSex='null', userBirthday=null}
User{userId=null, userName='last_insert_id()_test', userAddress='null', userSex='null', userBirthday=null}
User{userId=null, userName='last_insert_id()_test', userAddress='null', userSex='null', userBirthday=null}
User{userId=null, userName='SELECT LAST_INSERT_ID()', userAddress='null', userSex='null', userBirthday=null}
User{userId=null, userName='resultMapTest', userAddress='null', userSex='null', userBirthday=null}
User{userId=null, userName='resultMapTest', userAddress='null', userSex='null', userBirthday=null}
这里如果不修改 JavaBean 属性名,并且也不修改数据库表列名。
(如果修改 JavaBean 属性名,代码将 …)
有两种解决办法。
此方法效率高,因为是在 SQL 语句层面上解决问题。
<?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.geek.dao.IUserDao"><!-- 接口全限定名。-->
<!-- 配置查询所有。-->
<select id="findAll" resultType="com.geek.domain.User">
-- select * from users;
select id as userId, username as userName, birthday as userAddress, sex as userSex, address as userAdress
from users;
</select>
</mapper>
先定义对应关系 mapper。
<?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.geek.dao.IUserDao"><!-- 接口全限定名。-->
<!-- 配置查询结果的列名和实体类属性名的对应关系。-->
<resultMap id="userMap" type="com.geek.domain.User">
<!-- 主键字段的对应。-->
<id property="userId" column="id"/>
<!-- 非主键字段的对应。-->
<result property="userName" column="username"/>
<result property="userAddress" column="userAddress"/>
<result property="userSex" column="userSex"/>
<result property="userBirthday" column="userBirthday"/>
</resultMap>
property="" ——> 对应 JavaBean 的属性。
Column="" ——> 对应数据库表的列名。
使用该 mapper。
// 在 SQL 语句执行完成后,使用 userMap
进行封装。
因为要多解析一段 xml,执行效率不如前者。
但开发效率高了(<mapper></mapper>
中所有的 <select>
都可以指定 resultMap
)。
<!-- 配置查询所有。(使用 map。)-->
<select id="findAll" resultMap="userMap">
select * from users;
</select>
</mapper>
再次运行,即使 JavaBean 的属性名和数据库表的列名不一致,MyBatis 也能成功封装。