Mybatis實(shí)體類和表映射問(wèn)題(推薦)
本文是小編給大家?guī)?lái)的mybatis中實(shí)體類和表映射問(wèn)題的知識(shí),學(xué)習(xí)本教程能夠快速幫助我們解決字段名與實(shí)體類屬性名不相同的沖突問(wèn)題,需要的朋友一起看看吧!
一、準(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);
二、定義實(shí)體類
package me.gacl.domain;
/**
* @author gacl
* 定義orders表對(duì)應(yīng)的實(shí)體類
*/
public class Order {
/**
*
CREATE TABLE orders(
order_id INT PRIMARY KEY AUTO_INCREMENT,
order_no VARCHAR(20),
order_price FLOAT
);
*/
//Order實(shí)體類中屬性名和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+ "]";
}
}
三、編寫測(cè)試代碼
3.1、編寫SQL的xml映射文件
1、創(chuàng)建一個(gè)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"> <!-- 為這個(gè)mapper指定一個(gè)唯一的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查詢得到一個(gè)order對(duì)象,使用這個(gè)查詢是查詢不到我們想要的結(jié)果的,
這主要是因?yàn)閷?shí)體類的屬性名和數(shù)據(jù)庫(kù)的字段名對(duì)應(yīng)不上的原因,因此無(wú)法查詢出對(duì)應(yīng)的記錄
-->
<select id="getOrderById" parameterType="int"
resultType="me.gacl.domain.Order">
select * from orders where order_id=#{id}
</select>
<!--
根據(jù)id查詢得到一個(gè)order對(duì)象,使用這個(gè)查詢是可以正常查詢到我們想要的結(jié)果的,
這是因?yàn)槲覀儗⒉樵兊淖侄蚊计鹨粋€(gè)和實(shí)體類屬性名相同的別名,這樣實(shí)體類的屬性名和查詢結(jié)果中的字段名就可以一一對(duì)應(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查詢得到一個(gè)order對(duì)象,使用這個(gè)查詢是可以正常查詢到我們想要的結(jié)果的,
這是因?yàn)槲覀兺ㄟ^(guò)<resultMap>映射實(shí)體類屬性名和表的字段名一一對(duì)應(yīng)關(guān)系 -->
<select id="selectOrderResultMap" parameterType="int" resultMap="orderResultMap">
select * from orders where order_id=#{id}
</select>
<!--通過(guò)<resultMap>映射實(shí)體類屬性名和表的字段名對(duì)應(yīng)關(guān)系 -->
<resultMap type="me.gacl.domain.Order" id="orderResultMap">
<!-- 用id屬性來(lái)映射主鍵字段 -->
<id property="id" column="order_id"/>
<!-- 用result屬性來(lái)映射非主鍵字段 -->
<result property="orderNo" column="order_no"/>
<result property="price" column="order_price"/>
</resultMap>
</mapper>
2、在conf.xml文件中注冊(cè)orderMapper.xml映射文件
<mappers> <!-- 注冊(cè)orderMapper.xml文件, orderMapper.xml位于me.gacl.mapping這個(gè)包下,所以resource寫成me/gacl/mapping/orderMapper.xml--> <mapper resource="me/gacl/mapping/orderMapper.xml"/> </mappers>
3.2、編寫單元測(cè)試代碼
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)識(shí)字符串,
* me.gacl.mapping.orderMapper是orderMapper.xml文件中mapper標(biāo)簽的namespace屬性的值,
* getOrderById是select標(biāo)簽的id屬性值,通過(guò)select標(biāo)簽的id屬性值就可以找到要執(zhí)行的SQL
*/
String statement = "me.gacl.mapping.orderMapper.getOrderById";//映射sql的標(biāo)識(shí)字符串
//執(zhí)行查詢操作,將查詢結(jié)果自動(dòng)封裝成Order對(duì)象返回
Order order = sqlSession.selectOne(statement,1);//查詢orders表中id為1的記錄
//使用SqlSession執(zhí)行完SQL之后需要關(guān)閉SqlSession
sqlSession.close();
System.out.println(order);//打印結(jié)果:null,也就是沒(méi)有查詢出相應(yīng)的記錄
}
@Test
public void testGetOrderById2(){
SqlSession sqlSession = MyBatisUtil.getSqlSession();
/**
* 映射sql的標(biāo)識(shí)字符串,
* me.gacl.mapping.orderMapper是orderMapper.xml文件中mapper標(biāo)簽的namespace屬性的值,
* selectOrder是select標(biāo)簽的id屬性值,通過(guò)select標(biāo)簽的id屬性值就可以找到要執(zhí)行的SQL
*/
String statement = "me.gacl.mapping.orderMapper.selectOrder";//映射sql的標(biāo)識(shí)字符串
//執(zhí)行查詢操作,將查詢結(jié)果自動(dòng)封裝成Order對(duì)象返回
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)識(shí)字符串,
* me.gacl.mapping.orderMapper是orderMapper.xml文件中mapper標(biāo)簽的namespace屬性的值,
* selectOrderResultMap是select標(biāo)簽的id屬性值,通過(guò)select標(biāo)簽的id屬性值就可以找到要執(zhí)行的SQL
*/
String statement = "me.gacl.mapping.orderMapper.selectOrderResultMap";//映射sql的標(biāo)識(shí)字符串
//執(zhí)行查詢操作,將查詢結(jié)果自動(dòng)封裝成Order對(duì)象返回
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í)行單元測(cè)試的結(jié)果:
1、testGetOrderById方法執(zhí)行查詢后返回一個(gè)null。
2、testGetOrderById2方法和testGetOrderById3方法執(zhí)行查詢后可以正常得到想要的結(jié)果。
四、總結(jié)
上面的測(cè)試代碼演示當(dāng)實(shí)體類中的屬性名和表中的字段名不一致時(shí),使用MyBatis進(jìn)行查詢操作時(shí)無(wú)法查詢出相應(yīng)的結(jié)果的問(wèn)題以及針對(duì)問(wèn)題采用的兩種辦法:
解決辦法一: 通過(guò)在查詢的sql語(yǔ)句中定義字段名的別名,讓字段名的別名和實(shí)體類的屬性名一致,這樣就可以表的字段名和實(shí)體類的屬性名一一對(duì)應(yīng)上了,這種方式是通過(guò)在sql語(yǔ)句中定義別名來(lái)解決字段名和屬性名的映射關(guān)系的。
解決辦法二: 通過(guò)來(lái)映射字段名和實(shí)體類屬性名的一一對(duì)應(yīng)關(guān)系。這種方式是使用MyBatis提供的解決方式來(lái)解決字段名和屬性名的映射關(guān)系的。
相關(guān)文章
Java 實(shí)現(xiàn)并發(fā)的幾種方式小結(jié)
這篇文章主要介紹了Java 實(shí)現(xiàn)并發(fā)的幾種方式小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05
SpringCloud Feign服務(wù)調(diào)用請(qǐng)求方式總結(jié)
這篇文章主要介紹了SpringCloud Feign服務(wù)調(diào)用方式總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
java 基礎(chǔ)之JavaBean屬性命名規(guī)范問(wèn)題
這篇文章主要介紹了java 基礎(chǔ)之JavaBean屬性命名規(guī)范問(wèn)題的相關(guān)資料,需要的朋友可以參考下2017-05-05
Java如何通過(guò)枚舉實(shí)現(xiàn)有限狀態(tài)機(jī)
這篇文章主要介紹了Java如何通過(guò)枚舉實(shí)現(xiàn)有限狀態(tài)機(jī),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
Java教程package和import訪問(wèn)控制的步驟詳解
這篇文章主要為大家介紹了Java教程package和import訪問(wèn)控制的步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
springBoot中的CORS跨域注解@CrossOrigin詳解
這篇文章主要介紹了springBoot中的CORS跨域注解@CrossOrigin詳解,通常,服務(wù)于?JS?的主機(jī)(例如?example.com)與服務(wù)于數(shù)據(jù)的主機(jī)(例如?api.example.com)是不同的,在這種情況下,CORS?可以實(shí)現(xiàn)跨域通信,需要的朋友可以參考下2023-12-12
springboot yml中profiles的巧妙用法(小白必看多環(huán)境配置)
這篇文章主要介紹了springboot yml中profiles的巧妙用法,非常適合多環(huán)境配置場(chǎng)景,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04

