在平時的開發中,我們表中的字段名和表對應實體類的屬性名稱不一定都是完全相同的,下面來演示一下這種情況下的如何解決字段名與實體類屬性名不相同的沖突。
一、准備演示需要使用的表和數據
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);
二、定義實體類
1 package me.gacl.domain;
2
3 /**
4 * @author gacl
5 * 定義orders表對應的實體類
6 */
7 public class Order {
8 /**
9 *
10 CREATE TABLE orders(
11 order_id INT PRIMARY KEY AUTO_INCREMENT,
12 order_no VARCHAR(20),
13 order_price FLOAT
14 );
15 */
16
17 //Order實體類中屬性名和orders表中的字段名是不一樣的
18 private int id; //id===>order_id
19 private String orderNo; //orderNo===>order_no
20 private float price; //price===>order_price
21
22 public int getId() {
23 return id;
24 }
25
26 public void setId(int id) {
27 this.id = id;
28 }
29
30 public String getOrderNo() {
31 return orderNo;
32 }
33
34 public void setOrderNo(String orderNo) {
35 this.orderNo = orderNo;
36 }
37
38 public float getPrice() {
39 return price;
40 }
41
42 public void setPrice(float price) {
43 this.price = price;
44 }
45
46 @Override
47 public String toString() {
48 return "Order [id=" + id + ", orderNo=" + orderNo + ", price=" + price+ "]";
49 }
50 }
三、編寫測試代碼
3.1、編寫SQL的xml映射文件
1、創建一個orderMapper.xml文件,orderMapper.xml的內容如下:
1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
3 <!-- 為這個mapper指定一個唯一的namespace,namespace的值習慣上設置成包名+sql映射文件名,這樣就能夠保證namespace的值是唯一的
4 例如namespace="me.gacl.mapping.orderMapper"就是me.gacl.mapping(包名)+orderMapper(orderMapper.xml文件去除后綴)
5 -->
6 <mapper namespace="me.gacl.mapping.orderMapper">
7
8 <!--
9 根據id查詢得到一個order對象,使用這個查詢是查詢不到我們想要的結果的,
10 這主要是因為實體類的屬性名和數據庫的字段名對應不上的原因,因此無法查詢出對應的記錄
11 -->
12 <select id="getOrderById" parameterType="int"
13 resultType="me.gacl.domain.Order">
14 select * from orders where order_id=#{id}
15 </select>
16
17 <!--
18 根據id查詢得到一個order對象,使用這個查詢是可以正常查詢到我們想要的結果的,
19 這是因為我們將查詢的字段名都起一個和實體類屬性名相同的別名,這樣實體類的屬性名和查詢結果中的字段名就可以一一對應上
20 -->
21 <select id="selectOrder" parameterType="int"
22 resultType="me.gacl.domain.Order">
23 select order_id id, order_no orderNo,order_price price from orders where order_id=#{id}
24 </select>
25
26 <!--
27 根據id查詢得到一個order對象,使用這個查詢是可以正常查詢到我們想要的結果的,
28 這是因為我們通過<resultMap>映射實體類屬性名和表的字段名一一對應關系 -->
29 <select id="selectOrderResultMap" parameterType="int" resultMap="orderResultMap">
30 select * from orders where order_id=#{id}
31 </select>
32 <!--通過<resultMap>映射實體類屬性名和表的字段名對應關系 -->
33 <resultMap type="me.gacl.domain.Order" id="orderResultMap">
34 <!-- 用id屬性來映射主鍵字段 -->
35 <id property="id" column="order_id"/>
36 <!-- 用result屬性來映射非主鍵字段 -->
37 <result property="orderNo" column="order_no"/>
38 <result property="price" column="order_price"/>
39 </resultMap>
40
41 </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、編寫單元測試代碼
1 package me.gacl.test;
2
3 import me.gacl.domain.Order;
4 import me.gacl.util.MyBatisUtil;
5 import org.apache.ibatis.session.SqlSession;
6 import org.junit.Test;
7
8 public class Test2 {
9
10 @Test
11 public void testGetOrderById(){
12 SqlSession sqlSession = MyBatisUtil.getSqlSession();
13 /**
14 * 映射sql的標識字符串,
15 * me.gacl.mapping.orderMapper是orderMapper.xml文件中mapper標簽的namespace屬性的值,
16 * getOrderById是select標簽的id屬性值,通過select標簽的id屬性值就可以找到要執行的SQL
17 */
18 String statement = "me.gacl.mapping.orderMapper.getOrderById";//映射sql的標識字符串
19 //執行查詢操作,將查詢結果自動封裝成Order對象返回
20 Order order = sqlSession.selectOne(statement,1);//查詢orders表中id為1的記錄
21 //使用SqlSession執行完SQL之后需要關閉SqlSession
22 sqlSession.close();
23 System.out.println(order);//打印結果:null,也就是沒有查詢出相應的記錄
24 }
25
26 @Test
27 public void testGetOrderById2(){
28 SqlSession sqlSession = MyBatisUtil.getSqlSession();
29 /**
30 * 映射sql的標識字符串,
31 * me.gacl.mapping.orderMapper是orderMapper.xml文件中mapper標簽的namespace屬性的值,
32 * selectOrder是select標簽的id屬性值,通過select標簽的id屬性值就可以找到要執行的SQL
33 */
34 String statement = "me.gacl.mapping.orderMapper.selectOrder";//映射sql的標識字符串
35 //執行查詢操作,將查詢結果自動封裝成Order對象返回
36 Order order = sqlSession.selectOne(statement,1);//查詢orders表中id為1的記錄
37 //使用SqlSession執行完SQL之后需要關閉SqlSession
38 sqlSession.close();
39 System.out.println(order);//打印結果:Order [id=1, orderNo=aaaa, price=23.0]
40 }
41
42 @Test
43 public void testGetOrderById3(){
44 SqlSession sqlSession = MyBatisUtil.getSqlSession();
45 /**
46 * 映射sql的標識字符串,
47 * me.gacl.mapping.orderMapper是orderMapper.xml文件中mapper標簽的namespace屬性的值,
48 * selectOrderResultMap是select標簽的id屬性值,通過select標簽的id屬性值就可以找到要執行的SQL
49 */
50 String statement = "me.gacl.mapping.orderMapper.selectOrderResultMap";//映射sql的標識字符串
51 //執行查詢操作,將查詢結果自動封裝成Order對象返回
52 Order order = sqlSession.selectOne(statement,1);//查詢orders表中id為1的記錄
53 //使用SqlSession執行完SQL之后需要關閉SqlSession
54 sqlSession.close();
55 System.out.println(order);//打印結果:Order [id=1, orderNo=aaaa, price=23.0]
56 }
57 }
