MyBatis 中 resultMap 的使用。

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 语句查询结果使用别名 as
此方法效率高,因为是在 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>
  • 使用 MyBatis 的 resultMap

先定义对应关系 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 也能成功封装。

发布了47 篇原创文章 · 获赞 1 · 访问量 1160

猜你喜欢

转载自blog.csdn.net/lyfGeek/article/details/104799221