mybatis 12: 查询结果与实体类的封装规则

2年前 (2022) 程序员胖胖胖虎阿
144 0 0

当数据表的字段名和实体类的成员变量名不同时

//Book实体类

private Integer id;
private String name;
//BookMapper.java接口

List<Book> getAllBooks();
<!-- BookMapper.xml -->

<!--
     //获取全部图书
     List<Book> getAllBooks();
 -->
 <select id="getAllBooks" resultType="book">
     select
         bookid, bookname
     from
         books
 </select>

//测试代码

@Test
public void testBookMapper(){
    List<Book> books =  bookMapper.getAllBooks();
    books.forEach(System.out::println);
}
//输出结果

==>  Preparing: select bookid, bookname from books
==> Parameters: 
<==    Columns: bookid, bookname
<==        Row: 1, java基础
<==        Row: 2, 基础
<==      Total: 2
null
null
  • 由输出结果可知,成功从books表中查询出了两条记录,但是由于book实体类的属性名与查询结果的字段名不一致,查询出的数据无法顺利封装返回

解决方案1

  • 给数据表的查询结果起别名,注意:别名和Book实体类的属性名一致
<!-- 修改后的sql标签 -->

<select id="getAllBooks" resultType="book">
     select
         bookid id, bookname name
     from
         books
 </select>
//此时输出结果

==>  Preparing: select bookid id, bookname name from books
==> Parameters: 
<==    Columns: id, name
<==        Row: 1, java基础
<==        Row: 2, sql基础
<==      Total: 2
Book{id=1, name='java基础'}
Book{id=2, name='sql基础'}

//成功查询数据并封装返回

解决方案2

  • 使用< resultMap >手工完成实体类的属性和数据表字段名的绑定映射
<!-- sql标签 -->

<!-- 定义查询结果的映射规则 -->
<resultMap id="bookMap" type="book">
    <!-- 主键映射 -->
    <id property="id" column="bookid"/>

    <!-- 非主键映射 -->
    <result property="name" column="bookname"/>
</resultMap>

<select id="getAllBooks" resultMap="bookMap">
    select
        bookid, bookname
    from
        books
</select>
  • < resultMap >标签分析
    • id:指明该查询结果的映射规则对哪个sql标签适用,需要应用该规则的sql标签的resultMap属性值和< resultMap >标签的id属性值一致即可
    • type:虽然定义了查询结果的映射规则,但是每条查询记录需要封装成的数据类型还要通过该属性单独指明
    • 标签内部:分别定义数据表的主键映射和非主键映射,指明查询结果的字段值注入到实体类的哪个属性中
//查询结果

==>  Preparing: select bookid, bookname from books
==> Parameters: 
<==    Columns: bookid, bookname
<==        Row: 1, java基础
<==        Row: 2, sql基础
<==      Total: 2
Book{id=1, name='java基础'}
Book{id=2, name='sql基础'}

//根据映射规则,成功将查询结果封装到实体类中并返回
版权声明:程序员胖胖胖虎阿 发表于 2022年10月11日 上午2:08。
转载请注明:mybatis 12: 查询结果与实体类的封装规则 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...