当数据表的字段名和实体类的成员变量名不同时
//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基础'}
//根据映射规则,成功将查询结果封装到实体类中并返回
相关文章
暂无评论...