欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2016年09月03日 11:36:03   作者:CodingDang  
在項目開發(fā)中我們經(jīng)常會遇到表中的字段名和表對應(yīng)實體類的屬性名稱不一定都是完全相同的。下面小編給大家介紹下這種情況下如何解決字段名與實體類屬性名不相同的沖突問題。下面小編給大家?guī)砹薓ybatis實體類和表映射的解決方法,小伙伴們一起學(xué)習(xí)吧

本文是小編給大家?guī)淼膍ybatis中實體類和表映射問題的知識,學(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(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)容如下:

<?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文件去除后綴)

-->
<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 Test2 {
@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,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的標(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,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的標(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,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é)

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

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

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

相關(guān)文章

  • java多線程中的生產(chǎn)者和消費(fèi)者隊列詳解

    java多線程中的生產(chǎn)者和消費(fèi)者隊列詳解

    這篇文章主要介紹了java多線程中的生產(chǎn)者和消費(fèi)者隊列詳解,隊列,是一種數(shù)據(jù)結(jié)構(gòu),除了優(yōu)先級隊列和LIFO隊列外,隊列都是以FIFO(先進(jìn)先出)的方式對各個元素進(jìn)行排序的,需要的朋友可以參考下
    2024-01-01
  • Java中實現(xiàn)線程的超時中斷方法實例

    Java中實現(xiàn)線程的超時中斷方法實例

    之前在使用Java實現(xiàn)熔斷降級組件的時候,需要實現(xiàn)接口請求的超時中斷,通過查找相關(guān)資料了解了相關(guān)的方法,下面這篇文章主要給大家介紹了關(guān)于Java中實現(xiàn)線程的超時中斷的相關(guān)資料,需要的朋友可以參考下
    2018-06-06
  • 解決IDEA service層跳轉(zhuǎn)實現(xiàn)類的快捷圖標(biāo)消失問題

    解決IDEA service層跳轉(zhuǎn)實現(xiàn)類的快捷圖標(biāo)消失問題

    這篇文章主要介紹了解決IDEA service層跳轉(zhuǎn)實現(xiàn)類的快捷圖標(biāo)消失問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • 關(guān)于JAVA中stream流的基礎(chǔ)處理(獲取對象字段和對象批量處理等)

    關(guān)于JAVA中stream流的基礎(chǔ)處理(獲取對象字段和對象批量處理等)

    這篇文章主要介紹了關(guān)于JAVA中stream流的基礎(chǔ)處理,包含獲取對象字段、按字段排序、按字段去重、對象批量處理、指定字段轉(zhuǎn)數(shù)組等內(nèi)容,需要的朋友可以參考下
    2023-03-03
  • Java讀取文件方法匯總

    Java讀取文件方法匯總

    這篇文章主要為大家詳細(xì)介紹了Java讀取文件方法,按字節(jié)讀取文件內(nèi)容、按字符讀取文件內(nèi)容、隨機(jī)讀取文件內(nèi)容等,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • SpringBoot中@ConfigurationProperties實現(xiàn)配置自動綁定的方法

    SpringBoot中@ConfigurationProperties實現(xiàn)配置自動綁定的方法

    本文主要介紹了SpringBoot中@ConfigurationProperties實現(xiàn)配置自動綁定的方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Java線程生命周期及轉(zhuǎn)換過程

    Java線程生命周期及轉(zhuǎn)換過程

    這篇文章主要介紹了Java線程生命周期及轉(zhuǎn)換過程,線程的生命周期指的是線程從創(chuàng)建到銷毀的整個過程初始狀態(tài)、可運(yùn)行狀態(tài)、運(yùn)行狀態(tài)、休眠狀態(tài)、終止?fàn)顟B(tài),更多詳細(xì)介紹,需要的小伙伴可以參考下面文章內(nèi)容
    2022-05-05
  • Java基于WebMagic爬取某豆瓣電影評論的實現(xiàn)

    Java基于WebMagic爬取某豆瓣電影評論的實現(xiàn)

    這篇文章主要介紹了Java基于WebMagic爬取某豆瓣電影評論的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Java使用poi操作excel實例解析

    Java使用poi操作excel實例解析

    這篇文章主要為大家詳細(xì)介紹了Java使用poi操作excel的簡單實例,感興趣的小伙伴們可以參考一下
    2016-05-05
  • JAVA驗證碼工具實例代碼

    JAVA驗證碼工具實例代碼

    這篇文章主要介紹了JAVA驗證碼工具實例代碼,需要的朋友可以參考下
    2018-03-03

最新評論