MyBatis進修教程(四)-若何疾速處理字段名與實體類屬性名不雷同的抵觸成績。本站提示廣大學習愛好者:(MyBatis進修教程(四)-若何疾速處理字段名與實體類屬性名不雷同的抵觸成績)文章只能為提供參考,不一定能成為您想要的結果。以下是MyBatis進修教程(四)-若何疾速處理字段名與實體類屬性名不雷同的抵觸成績正文
在項目開辟中,我們常常會碰到表中的字段名和表對應實體類的屬性稱號紛歧建都是完整雷同的情形,上面小編給年夜家演示一下這類情形下的若何處理字段名與實體類屬性名不雷同的抵觸成績,感興致的同伙一路進修吧。
1、預備演示須要應用的表和數據
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);
2、界說實體類
package me.gacl.domain; /** * @author gacl * 界說orders表對應的實體類 */ 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、編寫測試代碼
3.1、編寫SQL的xml映照文件
1、創立一個orderMapper.xml文件,orderMapper.xml的內容以下:
<?xml version="." encoding="UTF-" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper .//EN" "http://mybatis.org/dtd/mybatis--mapper.dtd"> <!-- 為這個mapper指定一個獨一的namespace,namespace的值習氣上設置成包名+sql映照文件名,如許就可以夠包管namespace的值是獨一的 例如namespace="me.gacl.mapping.orderMapper"就是me.gacl.mapping(包名)+orderMapper(orderMapper.xml文件去除後綴) --> <mapper namespace="me.gacl.mapping.orderMapper"> <!--
依據id查詢獲得一個order對象,應用這個查詢是查詢不到我們想要的成果的,這重要是由於實體類的屬性名和數據庫的字段名對應不上的緣由,是以沒法查詢出對應的記載
--> <select id="getOrderById" parameterType="int" resultType="me.gacl.domain.Order"> select * from orders where order_id=#{id} </select> <!--
依據id查詢獲得一個order對象,應用這個查詢是可以正常查詢到我們想要的成果的,
這是由於我們將查詢的字段名都起一個和實體類屬性名雷同的別號,如許實體類的屬性名和查詢成果中的字段名便可以逐個對應上
--> <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> <!--
依據id查詢獲得一個order對象,應用這個查詢是可以正常查詢到我們想要的成果的,這是由於我們經由過程<resultMap>映照實體類屬性名和表的字段名逐個對應關系 -->
<select id="selectOrderResultMap" parameterType="int" resultMap="orderResultMap"> select * from orders where order_id=#{id} </select> <!--經由過程<resultMap>映照實體類屬性名和表的字段名對應關系 --> <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的標識字符串, * me.gacl.mapping.orderMapper是orderMapper.xml文件中mapper標簽的namespace屬性的值, * getOrderById是select標簽的id屬性值,經由過程select標簽的id屬性值便可以找到要履行的SQL */ String statement = "me.gacl.mapping.orderMapper.getOrderById";//映照sql的標識字符串 //履行查詢操作,將查詢成果主動封裝成Order對象前往 Order order = sqlSession.selectOne(statement,);//查詢orders表中id為的記載 //應用SqlSession履行完SQL以後須要封閉SqlSession sqlSession.close(); System.out.println(order);//打印成果:null,也就是沒有查詢出響應的記載 } @Test public void testGetOrderById(){ SqlSession sqlSession = MyBatisUtil.getSqlSession(); /** * 映照sql的標識字符串, * me.gacl.mapping.orderMapper是orderMapper.xml文件中mapper標簽的namespace屬性的值, * selectOrder是select標簽的id屬性值,經由過程select標簽的id屬性值便可以找到要履行的SQL */ String statement = "me.gacl.mapping.orderMapper.selectOrder";//映照sql的標識字符串 //履行查詢操作,將查詢成果主動封裝成Order對象前往 Order order = sqlSession.selectOne(statement,);//查詢orders表中id為的記載 //應用SqlSession履行完SQL以後須要封閉SqlSession sqlSession.close(); System.out.println(order);//打印成果:Order [id=, orderNo=aaaa, price=.] } @Test public void testGetOrderById(){ SqlSession sqlSession = MyBatisUtil.getSqlSession(); /** * 映照sql的標識字符串, * me.gacl.mapping.orderMapper是orderMapper.xml文件中mapper標簽的namespace屬性的值, * selectOrderResultMap是select標簽的id屬性值,經由過程select標簽的id屬性值便可以找到要履行的SQL */ String statement = "me.gacl.mapping.orderMapper.selectOrderResultMap";//映照sql的標識字符串 //履行查詢操作,將查詢成果主動封裝成Order對象前往 Order order = sqlSession.selectOne(statement,);//查詢orders表中id為的記載 //應用SqlSession履行完SQL以後須要封閉SqlSession sqlSession.close(); System.out.println(order);//打印成果:Order [id=, orderNo=aaaa, price=.] } }
履行單位測試的成果:
1、testGetOrderById辦法履行查詢後前往一個null。
2、testGetOrderById2辦法和testGetOrderById3辦法履行查詢後可以正常獲得想要的成果。
4、總結
下面的測試代碼演示當實體類中的屬性名和表中的字段名紛歧致時,應用MyBatis停止查詢操作時沒法查詢出響應的成果的成績和針對成績采取的兩種方法:
處理方法一: 經由過程在查詢的sql語句中界說字段名的別號,讓字段名的別號和實體類的屬性名分歧,如許便可以表的字段名和實體類的屬性名逐個對應上了,這類方法是經由過程在sql語句中界說別號來處理字段名和屬性名的映照關系的。
處理方法二: 經由過程<resultMap>來映照字段名和實體類屬性名的逐個對應關系。這類方法是應用MyBatis供給的處理方法來處理字段名和屬性名的映照關系的。
以上所述是小編給年夜家引見的MyBatis進修教程(四)-若何疾速處理字段名與實體類屬性名不雷同的抵觸成績 ,願望對年夜家有所贊助,假如年夜家有任何疑問請給我留言,小編會實時答復年夜家的。在此也異常感激年夜家對網站的支撐!