本文是小編給大家帶來的mybatis中實體類和表映射問題的知識,學習本教程能夠快速幫助我們解決字段名與實體類屬性名不相同的沖突問題,需要的朋友一起看看吧!
一、準備演示需要使用的表和數據
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_idprivate String orderNo; //orderNo===>order_noprivate float price; //price===>order_pricepublic 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;}@Overridepublic String toString() {return "Order [id=" + id + ", orderNo=" + orderNo + ", price=" + price+ "]";}}三、編寫測試代碼
3.1、編寫SQL的xml映射文件
1、創建一個orderMapper.xml文件,orderMapper.xml的內容如下:
<?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"><!-- 根據id查詢得到一個order對象,使用這個查詢是查詢不到我們想要的結果的,這主要是因為實體類的屬性名和數據庫的字段名對應不上的原因,因此無法查詢出對應的記錄--><select id="getOrderById" parameterType="int" resultType="me.gacl.domain.Order">select * from orders where order_id=#{id}</select><!-- 根據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><!-- 根據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 {@Testpublic 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,1);//查詢orders表中id為1的記錄//使用SqlSession執行完SQL之后需要關閉SqlSessionsqlSession.close();System.out.println(order);//打印結果:null,也就是沒有查詢出相應的記錄}@Testpublic void testGetOrderById2(){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,1);//查詢orders表中id為1的記錄//使用SqlSession執行完SQL之后需要關閉SqlSessionsqlSession.close();System.out.println(order);//打印結果:Order [id=1, orderNo=aaaa, price=23.0]}@Testpublic void testGetOrderById3(){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,1);//查詢orders表中id為1的記錄//使用SqlSession執行完SQL之后需要關閉SqlSessionsqlSession.close();System.out.println(order);//打印結果:Order [id=1, orderNo=aaaa, price=23.0]}}執行單元測試的結果:
1、testGetOrderById方法執行查詢后返回一個null。
2、testGetOrderById2方法和testGetOrderById3方法執行查詢后可以正常得到想要的結果。
四、總結
上面的測試代碼演示當實體類中的屬性名和表中的字段名不一致時,使用MyBatis進行查詢操作時無法查詢出相應的結果的問題以及針對問題采用的兩種辦法:
解決辦法一: 通過在查詢的sql語句中定義字段名的別名,讓字段名的別名和實體類的屬性名一致,這樣就可以表的字段名和實體類的屬性名一一對應上了,這種方式是通過在sql語句中定義別名來解決字段名和屬性名的映射關系的。
解決辦法二: 通過來映射字段名和實體類屬性名的一一對應關系。這種方式是使用MyBatis提供的解決方式來解決字段名和屬性名的映射關系的。
新聞熱點
疑難解答