MyBatis學(xué)習(xí)教程(四)-如何快速解決字段名與實體類屬性名不相同的沖突問題
在項目開發(fā)中,我們經(jīng)常會遇到表中的字段名和表對應(yīng)實體類的屬性名稱不一定都是完全相同的情況,下面小編給大家演示一下這種情況下的如何解決字段名與實體類屬性名不相同的沖突問題,感興趣的朋友一起學(xué)習(xí)吧。
一、準(zhǔn)備演示需要使用的表和數(shù)據(jù)
CREATE TABLE orders( order_id INT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(20), order_price FLOAT ); INSERT INTO orders(order_no, order_price) VALUES('aaaa', 23); INSERT INTO orders(order_no, order_price) VALUES('bbbb', 33); INSERT INTO orders(order_no, order_price) VALUES('cccc', 22);
二、定義實體類
package me.gacl.domain; /** * @author gacl * 定義orders表對應(yīng)的實體類 */ public class Order { /** * CREATE TABLE orders( order_id INT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(), order_price FLOAT ); */ //Order實體類中屬性名和orders表中的字段名是不一樣的 private int id; //id===>order_id private String orderNo; //orderNo===>order_no private float price; //price===>order_price public int getId() { return id; } public void setId(int id) { this.id = id; } public String getOrderNo() { return orderNo; } public void setOrderNo(String orderNo) { this.orderNo = orderNo; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } @Override public String toString() { return "Order [id=" + id + ", orderNo=" + orderNo + ", price=" + price+ "]"; } }
三、編寫測試代碼
3.1、編寫SQL的xml映射文件
1、創(chuàng)建一個orderMapper.xml文件,orderMapper.xml的內(nèi)容如下:
<?xml version="." encoding="UTF-" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper .//EN" "http://mybatis.org/dtd/mybatis--mapper.dtd"> <!-- 為這個mapper指定一個唯一的namespace,namespace的值習(xí)慣上設(shè)置成包名+sql映射文件名,這樣就能夠保證namespace的值是唯一的 例如namespace="me.gacl.mapping.orderMapper"就是me.gacl.mapping(包名)+orderMapper(orderMapper.xml文件去除后綴) --> <mapper namespace="me.gacl.mapping.orderMapper"> <!--
根據(jù)id查詢得到一個order對象,使用這個查詢是查詢不到我們想要的結(jié)果的,這主要是因為實體類的屬性名和數(shù)據(jù)庫的字段名對應(yīng)不上的原因,因此無法查詢出對應(yīng)的記錄
--> <select id="getOrderById" parameterType="int" resultType="me.gacl.domain.Order"> select * from orders where order_id=#{id} </select> <!--
根據(jù)id查詢得到一個order對象,使用這個查詢是可以正常查詢到我們想要的結(jié)果的,
這是因為我們將查詢的字段名都起一個和實體類屬性名相同的別名,這樣實體類的屬性名和查詢結(jié)果中的字段名就可以一一對應(yīng)上
--> <select id="selectOrder" parameterType="int" resultType="me.gacl.domain.Order"> select order_id id, order_no orderNo,order_price price from orders where order_id=#{id} </select> <!--
根據(jù)id查詢得到一個order對象,使用這個查詢是可以正常查詢到我們想要的結(jié)果的,這是因為我們通過<resultMap>映射實體類屬性名和表的字段名一一對應(yīng)關(guān)系 -->
<select id="selectOrderResultMap" parameterType="int" resultMap="orderResultMap"> select * from orders where order_id=#{id} </select> <!--通過<resultMap>映射實體類屬性名和表的字段名對應(yīng)關(guān)系 --> <resultMap type="me.gacl.domain.Order" id="orderResultMap"> <!-- 用id屬性來映射主鍵字段 --> <id property="id" column="order_id"/> <!-- 用result屬性來映射非主鍵字段 --> <result property="orderNo" column="order_no"/> <result property="price" column="order_price"/> </resultMap> </mapper>
2、在conf.xml文件中注冊orderMapper.xml映射文件
<mappers> <!-- 注冊orderMapper.xml文件, orderMapper.xml位于me.gacl.mapping這個包下,所以resource寫成me/gacl/mapping/orderMapper.xml--> <mapper resource="me/gacl/mapping/orderMapper.xml"/> </mappers>
3.2、編寫單元測試代碼
package me.gacl.test; import me.gacl.domain.Order; import me.gacl.util.MyBatisUtil; import org.apache.ibatis.session.SqlSession; import org.junit.Test; public class Test { @Test public void testGetOrderById(){ SqlSession sqlSession = MyBatisUtil.getSqlSession(); /** * 映射sql的標(biāo)識字符串, * me.gacl.mapping.orderMapper是orderMapper.xml文件中mapper標(biāo)簽的namespace屬性的值, * getOrderById是select標(biāo)簽的id屬性值,通過select標(biāo)簽的id屬性值就可以找到要執(zhí)行的SQL */ String statement = "me.gacl.mapping.orderMapper.getOrderById";//映射sql的標(biāo)識字符串 //執(zhí)行查詢操作,將查詢結(jié)果自動封裝成Order對象返回 Order order = sqlSession.selectOne(statement,);//查詢orders表中id為的記錄 //使用SqlSession執(zhí)行完SQL之后需要關(guān)閉SqlSession sqlSession.close(); System.out.println(order);//打印結(jié)果:null,也就是沒有查詢出相應(yīng)的記錄 } @Test public void testGetOrderById(){ SqlSession sqlSession = MyBatisUtil.getSqlSession(); /** * 映射sql的標(biāo)識字符串, * me.gacl.mapping.orderMapper是orderMapper.xml文件中mapper標(biāo)簽的namespace屬性的值, * selectOrder是select標(biāo)簽的id屬性值,通過select標(biāo)簽的id屬性值就可以找到要執(zhí)行的SQL */ String statement = "me.gacl.mapping.orderMapper.selectOrder";//映射sql的標(biāo)識字符串 //執(zhí)行查詢操作,將查詢結(jié)果自動封裝成Order對象返回 Order order = sqlSession.selectOne(statement,);//查詢orders表中id為的記錄 //使用SqlSession執(zhí)行完SQL之后需要關(guān)閉SqlSession sqlSession.close(); System.out.println(order);//打印結(jié)果:Order [id=, orderNo=aaaa, price=.] } @Test public void testGetOrderById(){ SqlSession sqlSession = MyBatisUtil.getSqlSession(); /** * 映射sql的標(biāo)識字符串, * me.gacl.mapping.orderMapper是orderMapper.xml文件中mapper標(biāo)簽的namespace屬性的值, * selectOrderResultMap是select標(biāo)簽的id屬性值,通過select標(biāo)簽的id屬性值就可以找到要執(zhí)行的SQL */ String statement = "me.gacl.mapping.orderMapper.selectOrderResultMap";//映射sql的標(biāo)識字符串 //執(zhí)行查詢操作,將查詢結(jié)果自動封裝成Order對象返回 Order order = sqlSession.selectOne(statement,);//查詢orders表中id為的記錄 //使用SqlSession執(zhí)行完SQL之后需要關(guān)閉SqlSession sqlSession.close(); System.out.println(order);//打印結(jié)果:Order [id=, orderNo=aaaa, price=.] } }
執(zhí)行單元測試的結(jié)果:
1、testGetOrderById方法執(zhí)行查詢后返回一個null。
2、testGetOrderById2方法和testGetOrderById3方法執(zhí)行查詢后可以正常得到想要的結(jié)果。
四、總結(jié)
上面的測試代碼演示當(dāng)實體類中的屬性名和表中的字段名不一致時,使用MyBatis進(jìn)行查詢操作時無法查詢出相應(yīng)的結(jié)果的問題以及針對問題采用的兩種辦法:
解決辦法一: 通過在查詢的sql語句中定義字段名的別名,讓字段名的別名和實體類的屬性名一致,這樣就可以表的字段名和實體類的屬性名一一對應(yīng)上了,這種方式是通過在sql語句中定義別名來解決字段名和屬性名的映射關(guān)系的。
解決辦法二: 通過<resultMap>來映射字段名和實體類屬性名的一一對應(yīng)關(guān)系。這種方式是使用MyBatis提供的解決方式來解決字段名和屬性名的映射關(guān)系的。
以上所述是小編給大家介紹的MyBatis學(xué)習(xí)教程(四)-如何快速解決字段名與實體類屬性名不相同的沖突問題 ,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
java實現(xiàn)獲取網(wǎng)站的keywords,description
這篇文章主要介紹了java實現(xiàn)獲取網(wǎng)站的keywords,description的相關(guān)資料,需要的朋友可以參考下2015-03-03Java GUI進(jìn)階之流式布局管理器FlowLayout專項精講
FlowLayout-流式布局管理器,按水平方向依次排列放置組件,排滿一行,換下一行繼續(xù)排列。排列方向(左到右 或 右到左)取決于容器的componentOrientation屬性2022-04-04Java實體映射工具M(jìn)apStruct使用方法詳解
MapStruct是用于代碼中JavaBean對象之間的轉(zhuǎn)換,例如DO轉(zhuǎn)換為DTO,DTO轉(zhuǎn)換為VO,或Entity轉(zhuǎn)換為VO等場景,這篇文章主要給大家介紹了關(guān)于Java實體映射工具M(jìn)apStruct使用的相關(guān)資料,需要的朋友可以參考下2021-11-11Mybatis傳入List實現(xiàn)批量更新的示例代碼
這篇文章主要介紹了Mybatis傳入List實現(xiàn)批量更新的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10SpringBoot實現(xiàn)yml配置文件為變量賦值
這篇文章主要介紹了SpringBoot實現(xiàn)yml配置文件為變量賦值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02SpringBoot?中使用?Validation?校驗參數(shù)的方法詳解
Validation?是用于檢查程序代碼中參數(shù)的有效性的框架,作為?Spring?框架中的一個參數(shù)校驗工具,集成在?spring-context?包中,這篇文章主要介紹了SpringBoot?中使用?Validation?校驗參數(shù),需要的朋友可以參考下2022-05-05