MyBatis使用resultMap如何解決列名和屬性名不一致
使用resultMap如何解決列名和屬性名不一致
resultType可以指定將查詢結(jié)果映射為pojo,但需要pojo的屬性名和sql查詢的列名一致方可映射成功。
如果sql查詢字段名和pojo的屬性名不一致,可以通過resultMap將字段名和屬性名作一個對應(yīng)關(guān)系 ,resultMap實質(zhì)上還需要將查詢結(jié)果映射到pojo對象中。
需求:查詢訂單表orders的所有數(shù)據(jù)
SELECT id,user_id,number,createtime,note FROM orders,這里的數(shù)據(jù)庫表user_id與pojo的Order對象中的userId不一致
orders表:

Order對象:

OrderMapper.xml配置
其中注釋掉了另一種使用數(shù)據(jù)庫別名解決列名和屬性名不一致的問題
<?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.sea.crm.mapper.OrderMapper"> <!-- 使用as 給列取別名解決類名和屬性名不一致的情況 --> <!--<select id="queryAll" resultType="Order"> SELECT id,user_id as userId,number,createtime,note FROM orders </select> --> <!-- 使用resultMap解決列名和屬性名不一致的情況 --> <!-- 配置一個resultMap映射列和屬性 --> <resultMap type="Order" id="orderMap"> <!-- id:設(shè)置ResultMap的id --> <!-- 定義主鍵 ,非常重要。如果是多個字段,則定義多個id --> <!-- property:主鍵在pojo中的屬性名 --> <!-- column:主鍵在數(shù)據(jù)庫中的列名 --> <id column="id" property="id" /> <!-- 映射其他普通列 --> <result column="user_id" property="userId" /> <result property="number" column="number" /> <result property="createtime" column="createtime" /> </resultMap> <!-- 方法的返回值可以使用 --> <select id="queryAll" resultMap="orderMap"> SELECT id,user_id ,number,createtime,note FROM orders </select> </mapper>
單元測試
public class OrderMapperTest {
SqlSessionFactory factory = null;
private OrderMapper orderMapper = null;
@Before
public void testInit() {
// 1. 創(chuàng)建SqlSessionFactoryBuilder對象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
// 2. 加載SqlMapConfig.xml配置文件
// /20181013_mybatis/config/SqlMapConfig.xml
InputStream in = MyBatisTest.class.getResourceAsStream("/SqlMapConfig.xml");
// 3. 創(chuàng)建SqlSessionFactory對象
factory = builder.build(in);
}
@Test
public void testqueryAll() {
SqlSession session = factory.openSession();
OrderMapper orderMapper = session.getMapper(OrderMapper.class);
List<Order> orders = orderMapper.queryAll();
System.out.println(orders);
}
}
實體屬性名與表字段名不匹配問題
問題
<select id="getUser" parameterType="String"
resultType="User">
select * from user where username=#{username}
</select>- 這是映射文件的配置,myBatis在查詢出結(jié)果之后,會幫我們把查詢結(jié)果一一對應(yīng)地填充到User對象中
- 但是,它怎么知道如何去對應(yīng)查詢出來的字段和屬性呢?只有在實體的屬性名和表的字段名相同時,才能自動一一對應(yīng)。
- 那么,如果屬性名和表的字段名不一樣怎么辦?有兩種解決方案
現(xiàn)有實體類Order:

數(shù)據(jù)庫表orders:

解決方案一
<select id="getOrder" parameterType="int"
resultType="Order">
select order_id id,order_name orderName from orders where order_id=#{id}
</select>查詢的時候使用別名,就可以解決
解決方案二
<!-- 配置一個映射關(guān)系 -->
<resultMap type="Order" id="orderResultMap">
<id property="id" column="order_id"/>
<result property="orderName" column="order_name"/>
</resultMap>
<!-- 查詢結(jié)果集引用配好的映射關(guān)系 -->
<select id="getOrder" parameterType="int"
resultMap="orderResultMap">
select order_id ,order_name from orders where order_id=#{id}
</select>resultMap中,id標(biāo)簽專門為主鍵服務(wù),當(dāng)然,全部都用resultproperty為實體類屬性column為表的列名
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot整合Security實現(xiàn)權(quán)限控制框架(案例詳解)
Spring Security是一個能夠為基于Spring的企業(yè)應(yīng)用系統(tǒng)提供聲明式的安全訪問控制解決方案的安全框,是一個重量級的安全管理框架,本文給大家介紹的非常詳細,需要的朋友參考下吧2021-08-08
java實現(xiàn)excel導(dǎo)出合并單元格的步驟詳解
這篇文章主要介紹了java實現(xiàn)excel導(dǎo)出合并單元格,通過使用Apache POI庫,我們可以方便地創(chuàng)建Excel文件、填充數(shù)據(jù)、合并單元格和導(dǎo)出Excel文件,需要的朋友可以參考下2023-04-04
Mybatis之@ResultMap,@Results,@Result注解的使用
這篇文章主要介紹了Mybatis之@ResultMap,@Results,@Result注解的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
springsecurity實現(xiàn)用戶登錄認證快速使用示例代碼(前后端分離項目)
這篇文章主要介紹了springsecurity實現(xiàn)用戶登錄認證快速使用示例代碼(前后端分離項目),本文通過示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-03-03
java開源調(diào)度如何給xxljob加k8s執(zhí)行器
這篇文章主要介紹了java開源調(diào)度如何給xxljob加一個k8s執(zhí)行器,?xxljob?在設(shè)計上,抽象出了執(zhí)行器的接口,所以實現(xiàn)一個語言的執(zhí)行器并不復(fù)雜,這里主要探索下,如何利用k8s的pod?的能力,使用?xxljob?調(diào)度?pod?運行,實現(xiàn)一個通用的和語言無關(guān)的執(zhí)行器2022-02-02

