項目地址:傳送門
在平時的開發(fā)中,我們表中的字段名和表對應(yīng)實體類的屬性名稱不一定都是完全相同的虐拓,下面來演示一下這種情況下的如何解決字段名與實體類屬性名不相同的沖突心俗。
一、準(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 com.shi.mybatis;
/**
* @author AFinalStone
* 定義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="com.shi.mapping.orderMapper"就是com.shi.mapping(包名)+orderMapper(orderMapper.xml文件去除后綴)
-->
<mapper namespace="com.shi.mapping.orderMapper">
<!--
根據(jù)id查詢得到一個order對象喘垂,使用這個查詢是查詢不到我們想要的結(jié)果的,
這主要是因為實體類的屬性名和數(shù)據(jù)庫的字段名對應(yīng)不上的原因绍撞,因此無法查詢出對應(yīng)的記錄
-->
<select id="getOrderById" parameterType="int"
resultType="Order">
select * from orders where order_id=#{id}
</select>
<!--
根據(jù)id查詢得到一個order對象正勒,使用這個查詢是可以正常查詢到我們想要的結(jié)果的,
這是因為我們將查詢的字段名都起一個和實體類屬性名相同的別名傻铣,這樣實體類的屬性名和查詢結(jié)果中的字段名就可以一一對應(yīng)上
-->
<select id="selectOrder" parameterType="int"
resultType="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="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映射文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 引用db.properties配置文件 -->
<properties resource="db.properties"/>
<!--不要把typeAliases放在頭部或者尾部鸭限,否則會報錯-->
<typeAliases>
<!-- <typeAlias type="com.shi.mybatis.User" alias="UserModel"/>-->
<package name="com.shi.mybatis"/>
</typeAliases>
<!--
development : 開發(fā)模式
work : 工作模式
-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<!-- 配置數(shù)據(jù)庫連接信息 -->
<dataSource type="POOLED">
<!-- value屬性值引用db.properties配置文件中配置的值 -->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${name}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- 注冊userMapper.xml文件,
userMapper.xml位于com.shi.mapping這個包下两踏,所以resource寫成com/shi/mapping/orderMapper.xml.xml-->
<mapper resource="com/shi/mapping/orderMapper.xml"/>
</mappers>
</configuration>
3.2败京、編寫單元測試代碼
package com.shi.mybatis;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
public class TestOrder {
@Test
public void testGetOrderById(){
SqlSession sqlSession = MyBatisUtil.getSqlSession();
/**
* 映射sql的標(biāo)識字符串,
* com.shi.mapping.orderMapper是orderMapper.xml文件中mapper標(biāo)簽的namespace屬性的值梦染,
* getOrderById是select標(biāo)簽的id屬性值赡麦,通過select標(biāo)簽的id屬性值就可以找到要執(zhí)行的SQL
*/
String statement = "com.shi.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)識字符串隧甚,
* com.shi.mapping.orderMapper是orderMapper.xml文件中mapper標(biāo)簽的namespace屬性的值,
* selectOrder是select標(biāo)簽的id屬性值渡冻,通過select標(biāo)簽的id屬性值就可以找到要執(zhí)行的SQL
*/
String statement = "com.shi.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)識字符串,
* com.shi.mapping.orderMapper是orderMapper.xml文件中mapper標(biāo)簽的namespace屬性的值族吻,
* selectOrderResultMap是select標(biāo)簽的id屬性值帽借,通過select標(biāo)簽的id屬性值就可以找到要執(zhí)行的SQL
*/
String statement = "com.shi.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)系的。
解決辦法二: 通過<resultMap>來映射字段名和實體類屬性名的一一對應(yīng)關(guān)系桃焕。這種方式是使用MyBatis提供的解決方式來解決字段名和屬性名的映射關(guān)系的剑肯。