一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - MyBatis學習教程(四)-如何快速解決字段名與實體類屬性名不相同的沖突問題

MyBatis學習教程(四)-如何快速解決字段名與實體類屬性名不相同的沖突問題

2020-05-04 14:38孤傲蒼狼 JAVA教程

我們經常會遇到表中的字段名和表對應實體類的屬性名稱不一定都是完全相同的情況,如何解決呢?下面腳本之家小編給大家介紹MyBatis學習教程(四)-如何快速解決字段名與實體類屬性名不相同的沖突問題,一起學習吧

在項目開發中,我們經常會遇到表中的字段名和表對應實體類的屬性名稱不一定都是完全相同的情況,下面小編給大家演示一下這種情況下的如何解決字段名與實體類屬性名不相同的沖突問題,感興趣的朋友一起學習吧。

一、準備演示需要使用的表和數據

?
1
2
3
4
5
6
7
8
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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.1、編寫SQL的xml映射文件

  1、創建一個orderMapper.xml文件,orderMapper.xml的內容如下:

?
1
2
3
4
5
6
7
<?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對象,使用這個查詢是查詢不到我們想要的結果的,這主要是因為實體類的屬性名和數據庫的字段名對應不上的原因,因此無法查詢出對應的記錄

?
1
2
3
4
5
6
-->
<select id="getOrderById" parameterType="int"
resultType="me.gacl.domain.Order">
select * from orders where order_id=#{id}
</select>
<!--

根據id查詢得到一個order對象,使用這個查詢是可以正常查詢到我們想要的結果的,
這是因為我們將查詢的字段名都起一個和實體類屬性名相同的別名,這樣實體類的屬性名和查詢結果中的字段名就可以一一對應上

?
1
2
3
4
5
6
-->
<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>映射實體類屬性名和表的字段名一一對應關系 -->

?
1
2
3
4
5
6
7
8
9
10
11
12
<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映射文件

?
1
2
3
4
5
<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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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方法執行查詢后可以正常得到想要的結果。

四、總結

  上面的測試代碼演示當實體類中的屬性名和表中的字段名不一致時,使用MyBatis進行查詢操作時無法查詢出相應的結果的問題以及針對問題采用的兩種辦法:

  解決辦法一: 通過在查詢的sql語句中定義字段名的別名,讓字段名的別名和實體類的屬性名一致,這樣就可以表的字段名和實體類的屬性名一一對應上了,這種方式是通過在sql語句中定義別名來解決字段名和屬性名的映射關系的。

  解決辦法二: 通過<resultMap>來映射字段名和實體類屬性名的一一對應關系。這種方式是使用MyBatis提供的解決方式來解決字段名和屬性名的映射關系的。

以上所述是小編給大家介紹的MyBatis學習教程(四)-如何快速解決字段名與實體類屬性名不相同的沖突問題 ,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产成人亚洲精品乱码在线观看 | 天天草天天| 国产在线98福利播放视频免费 | 亚洲AV无码A片在线观看蜜桃 | 国产成人精品免费视频大全五级 | 亚洲欧美优优色在线影院 | 日本一区二区精品88 | 小sao货ji巴cao死你视频 | 午夜大片在线观看 | 成品人视频w免费观看w | 国产成人cao在线 | 精品国产一区二区三区国产馆 | 婷婷丁香色综合狠狠色 | 五月天婷婷亚洲 | 国产99精品 | 公交车强校花系列小说 | 国产一区二区三区在线 | 日韩欧美不卡视频 | yellow最新视频2019 | 四虎成人影院 | 亚洲AV久久无码精品九号软件 | 亚洲国产成人久久精品影视 | 亚洲图片一区二区 | 羞羞漫画免费漫画页面在线看漫画秋蝉 | 午夜 在线播放 | 色播导航 | 精品日韩欧美一区二区三区 | 国产在线步兵一区二区三区 | 国产福利不卡一区二区三区 | 都市风流贵妇激情 | 99久久精品国产免看国产一区 | 免费大秀视频在线播放 | 色婷婷综合和线在线 | 精品久久成人免费第三区 | 国产精品久久久久a影院 | 美女曰逼视频 | 国色天香论坛社区在线视频 | 韩国美女被的免费视频 | 国产午夜亚洲精品一区网站 | 欧美成人精品福利网站 | 亚洲男人天堂久久 |