MyBatis使用resultMap如何解決列名和屬性名不一致
使用resultMap如何解決列名和屬性名不一致
resultType可以指定將查詢結(jié)果映射為pojo,但需要pojo的屬性名和sql查詢的列名一致方可映射成功。
如果sql查詢字段名和pojo的屬性名不一致,可以通過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ù)別名解決列名和屬性名不一致的問題
<?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í)體屬性名與表字段名不匹配問題
問題
<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)查詢出來的字段和屬性呢?只有在實(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)文章
詳解Java模擬棧的實(shí)現(xiàn)以及Stack類的介紹
棧是一種數(shù)據(jù)結(jié)構(gòu),它按照后進(jìn)先出的原則來存儲(chǔ)和訪問數(shù)據(jù)。Stack是一個(gè)類,表示棧數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)。本文就來和大家介紹一下Java模擬棧的實(shí)現(xiàn)以及Stack類的使用,需要的可以參考一下2023-04-04spring boot @PathVariable傳遞帶反斜杠參數(shù) / 的處理
這篇文章主要介紹了spring boot @PathVariable傳遞帶反斜杠參數(shù) / 的處理操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-02-02基于springboot 長(zhǎng)輪詢的實(shí)現(xiàn)操作
這篇文章主要介紹了基于springboot 長(zhǎng)輪詢的實(shí)現(xiàn)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01基于SpringBoot與Mybatis實(shí)現(xiàn)SpringMVC Web項(xiàng)目
這篇文章主要介紹了基于SpringBoot與Mybatis實(shí)現(xiàn)SpringMVC Web項(xiàng)目的相關(guān)資料,需要的朋友可以參考下2017-04-04