mybatis某些字段無法映射成功的解決
隨筆記錄下:
剛剛遇到一個mybatis中reultMap定義正確column與property也都正確,字段的getset方法也都有,但是返回對象時,有些字段可以對應上有一些則不可以。
找了好久才發(fā)現(xiàn)在sql語句中的 resultMap 寫成了 resultType。。。
很low但是痛。改成resultMap一切正常!
補充知識:MyBatis學習總結——解決字段名與實體類屬性名不相同的沖突
在平時的開發(fā)中,我們表中的字段名和表對應實體類的屬性名稱不一定都是完全相同的,下面來演示一下這種情況下的如何解決字段名與實體類屬性名不相同的沖突。
一、準備演示需要使用的表和數(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表對應的實體類
*/
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的值習慣上設置成包名+sql映射文件名,這樣就能夠保證namespace的值是唯一的
例如namespace="me.gacl.mapping.orderMapper"就是me.gacl.mapping(包名)+orderMapper(orderMapper.xml文件去除后綴)
-->
<mapper namespace="me.gacl.mapping.orderMapper">
<!--
根據(jù)id查詢得到一個order對象,使用這個查詢是查詢不到我們想要的結果的,
這主要是因為實體類的屬性名和數(shù)據(jù)庫的字段名對應不上的原因,因此無法查詢出對應的記錄
-->
<select id="getOrderById" parameterType="int"
resultType="me.gacl.domain.Order">
select * from orders where order_id=#{id}
</select>
<!--
根據(jù)id查詢得到一個order對象,使用這個查詢是可以正常查詢到我們想要的結果的,
這是因為我們將查詢的字段名都起一個和實體類屬性名相同的別名,這樣實體類的屬性名和查詢結果中的字段名就可以一一對應上
-->
<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對象,使用這個查詢是可以正常查詢到我們想要的結果的,
這是因為我們通過<resultMap>映射實體類屬性名和表的字段名一一對應關系 -->
<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映射文件
<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的標識字符串,
* me.gacl.mapping.orderMapper是orderMapper.xml文件中mapper標簽的namespace屬性的值,
* getOrderById是select標簽的id屬性值,通過select標簽的id屬性值就可以找到要執(zhí)行的SQL
*/
String statement = "me.gacl.mapping.orderMapper.getOrderById";//映射sql的標識字符串
//執(zhí)行查詢操作,將查詢結果自動封裝成Order對象返回
Order order = sqlSession.selectOne(statement,1);//查詢orders表中id為1的記錄
//使用SqlSession執(zhí)行完SQL之后需要關閉SqlSession
sqlSession.close();
System.out.println(order);//打印結果:null,也就是沒有查詢出相應的記錄
}
@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í)行查詢操作,將查詢結果自動封裝成Order對象返回
Order order = sqlSession.selectOne(statement,1);//查詢orders表中id為1的記錄
//使用SqlSession執(zhí)行完SQL之后需要關閉SqlSession
sqlSession.close();
System.out.println(order);//打印結果: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í)行查詢操作,將查詢結果自動封裝成Order對象返回
Order order = sqlSession.selectOne(statement,1);//查詢orders表中id為1的記錄
//使用SqlSession執(zhí)行完SQL之后需要關閉SqlSession
sqlSession.close();
System.out.println(order);//打印結果:Order [id=1, orderNo=aaaa, price=23.0]
}
}
執(zhí)行單元測試的結果:
1、testGetOrderById方法執(zhí)行查詢后返回一個null。
2、testGetOrderById2方法和testGetOrderById3方法執(zhí)行查詢后可以正常得到想要的結果。
四、總結
上面的測試代碼演示當實體類中的屬性名和表中的字段名不一致時,使用MyBatis進行查詢操作時無法查詢出相應的結果的問題以及針對問題采用的兩種辦法:
解決辦法一:
通過在查詢的sql語句中定義字段名的別名,讓字段名的別名和實體類的屬性名一致,這樣就可以表的字段名和實體類的屬性名一一對應上了,這種方式是通過在sql語句中定義別名來解決字段名和屬性名的映射關系的。
解決辦法二:
通過<resultMap>來映射字段名和實體類屬性名的一一對應關系。這種方式是使用MyBatis提供的解決方式來解決字段名和屬性名的映射關系的。
以上這篇mybatis某些字段無法映射成功的解決就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
通過端口1433連接到主機127.0.0.1的 TCP/IP 連接失敗,錯誤:“connect timed out”的解
這篇文章主要介紹了通過端口1433連接到主機127.0.0.1的 TCP/IP 連接失敗,錯誤:“connect timed out”的解決方法,需要的朋友可以參考下2015-08-08
Java數(shù)據(jù)結構之LinkedList從鏈表到實現(xiàn)
LinkedList是Java中常用的數(shù)據(jù)結構之一,實現(xiàn)了鏈表的特性,支持快速添加、刪除元素,可以用于實現(xiàn)隊列、棧、雙向隊列等數(shù)據(jù)結構。LinkedList的內(nèi)部實現(xiàn)采用了雙向鏈表,其中每個節(jié)點都包含前驅節(jié)點和后繼節(jié)點的引用,可以直接訪問鏈表的頭尾元素2023-04-04
Spring mvc工作原理_動力節(jié)點Java學院整理
這篇文章主要為大家詳細介紹了Spring mvc工作原理的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-08-08

