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

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

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

服務(wù)器之家 - 編程語言 - JAVA教程 - Mybatis實體類和表映射問題(推薦)

Mybatis實體類和表映射問題(推薦)

2020-06-10 11:21CodingDang JAVA教程

在項目開發(fā)中我們經(jīng)常會遇到表中的字段名和表對應(yīng)實體類的屬性名稱不一定都是完全相同的。下面小編給大家介紹下這種情況下如何解決字段名與實體類屬性名不相同的沖突問題。下面小編給大家?guī)砹薓ybatis實體類和表映射的解

本文是小編給大家?guī)淼膍ybatis中實體類和表映射問題的知識,學(xué)習(xí)本教程能夠快速幫助我們解決字段名與實體類屬性名不相同的沖突問題,需要的朋友一起看看吧!

一、準備演示需要使用的表和數(shù)據(jù)

?
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表對應(yīng)的實體類
*/
public class Order {
/**
*
CREATE TABLE orders(
order_id INT PRIMARY KEY AUTO_INCREMENT,
order_no VARCHAR(20),
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)容如下:

?
1
2
3
<?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,namespace的值習(xí)慣上設(shè)置成包名+sql映射文件名,這樣就能夠保證namespace的值是唯一的

例如namespace="me.gacl.mapping.orderMapper"就是me.gacl.mapping(包名)+orderMapper(orderMapper.xml文件去除后綴)

?
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
-->
<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映射文件

?
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 Test2 {
@Test
public void testGetOrderById(){
SqlSession sqlSession = MyBatisUtil.getSqlSession();
/**
* 映射sql的標識字符串,
* me.gacl.mapping.orderMapper是orderMapper.xml文件中mapper標簽的namespace屬性的值,
* getOrderById是select標簽的id屬性值,通過select標簽的id屬性值就可以找到要執(zhí)行的SQL
*/
String statement = "me.gacl.mapping.orderMapper.getOrderById";//映射sql的標識字符串
//執(zhí)行查詢操作,將查詢結(jié)果自動封裝成Order對象返回
Order order = sqlSession.selectOne(statement,1);//查詢orders表中id為1的記錄
//使用SqlSession執(zhí)行完SQL之后需要關(guān)閉SqlSession
sqlSession.close();
System.out.println(order);//打印結(jié)果:null,也就是沒有查詢出相應(yīng)的記錄
}
@Test
public void testGetOrderById2(){
SqlSession sqlSession = MyBatisUtil.getSqlSession();
/**
* 映射sql的標識字符串,
* me.gacl.mapping.orderMapper是orderMapper.xml文件中mapper標簽的namespace屬性的值,
* selectOrder是select標簽的id屬性值,通過select標簽的id屬性值就可以找到要執(zhí)行的SQL
*/
String statement = "me.gacl.mapping.orderMapper.selectOrder";//映射sql的標識字符串
//執(zhí)行查詢操作,將查詢結(jié)果自動封裝成Order對象返回
Order order = sqlSession.selectOne(statement,1);//查詢orders表中id為1的記錄
//使用SqlSession執(zhí)行完SQL之后需要關(guān)閉SqlSession
sqlSession.close();
System.out.println(order);//打印結(jié)果:Order [id=1, orderNo=aaaa, price=23.0]
}
@Test
public void testGetOrderById3(){
SqlSession sqlSession = MyBatisUtil.getSqlSession();
/**
* 映射sql的標識字符串,
* me.gacl.mapping.orderMapper是orderMapper.xml文件中mapper標簽的namespace屬性的值,
* selectOrderResultMap是select標簽的id屬性值,通過select標簽的id屬性值就可以找到要執(zhí)行的SQL
*/
String statement = "me.gacl.mapping.orderMapper.selectOrderResultMap";//映射sql的標識字符串
//執(zhí)行查詢操作,將查詢結(jié)果自動封裝成Order對象返回
Order order = sqlSession.selectOne(statement,1);//查詢orders表中id為1的記錄
//使用SqlSession執(zhí)行完SQL之后需要關(guān)閉SqlSession
sqlSession.close();
System.out.println(order);//打印結(jié)果:Order [id=1, orderNo=aaaa, price=23.0]
}
}

執(zhí)行單元測試的結(jié)果:

  1、testGetOrderById方法執(zhí)行查詢后返回一個null。

  2、testGetOrderById2方法和testGetOrderById3方法執(zhí)行查詢后可以正常得到想要的結(jié)果。

四、總結(jié)

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

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

解決辦法二: 通過來映射字段名和實體類屬性名的一一對應(yīng)關(guān)系。這種方式是使用MyBatis提供的解決方式來解決字段名和屬性名的映射關(guān)系的。

原文鏈接:http://blog.csdn.net/u012849872/article/details/51607285

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 免费三及片 | 精品一区二区三区免费视频 | 日本免费在线观看 | 欧美色图日韩色图 | 亚洲女bbwxxxx另类 | 亚洲系列国产精品制服丝袜第 | 欧美一区二区三区在线观看不卡 | 插入逼 | 趴好撅高打屁股sp调教h | 国产自在自线午夜精品之la | 日本伊人色| 久久综合网久久综合 | 国产欧美一区二区精品性色99 | 国产毛片在线观看 | 大又大又粗又爽女人毛片 | 乌克兰13一14娇小 | 人禽l交视频在线播放 视频 | 歪歪视频在线播放无遮挡 | 日本爽p大片免费观看 | 亚洲精品久久碰 | 日本中文字幕在线视频 | freesex1718处xx | 视频一区二区国产 | 大象视频污| 国产高清一区二区三区免费视频 | 免费网址在线观看入口推荐 | 四虎在线视频免费观看视频 | 午夜亚洲视频 | 乳女教师欲乱动漫无修版动画3d | 99视频福利| 日韩成本大片35分钟免费播放 | 欧美激情精品久久久久久不卡 | 农夫69小说小雨与农村老太 | 十大免费批日的软件 | 我年轻漂亮的继坶2中字在线播放 | 暖暖日本在线观看免费 | 91小视频在线观看免费版高清 | 日日碰日日操 | 色成人综合网 | 三级欧美在线 | 精品国产一区二区三区国产馆 |