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

Order對(duì)象:

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

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

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

