[TOC]
# 表字段名與實體類屬性名不同的解決方案
在實際開發過程中,表中的字段名和表對應實體類的屬性名稱不一定都是完全相同的。
## 一、創建訂單表,并插入數據
~~~
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.ntqingniao.mybatis.entity;
/**
* 定義orders表對應的實體類
*
* @author CUI
*
*/
public class Order {
// 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
+ "]";
}
}
~~~
## 三、編寫 SQL 的 xml 映射文件
### 1、定義 sql 映射的接口
OrderMapper 接口的代碼如下:
~~~
package com.ntqingniao.mybatis.mapping;
import com.ntqingniao.mybatis.entity.Order;
public interface OrderMapper {
/**
* 根據id查詢得到一個order對象
*
* @param id
* @return Order
*/
public Order getOrderById(int id);
/**
* 根據id查詢得到一個order對象(SQL查詢語句采用別名)
*
* @param id
* @return Order
*/
public Order selectOrder(int id);
/**
* 根據id查詢得到一個order對象(采用resultMap進行配置)
*
* @param id
* @return Order
*/
public Order selectOrderResultMap(int id);
}
~~~
### 2、創建 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="com.ntqingniao.mybatis.mapping.orderMapper"就是com.ntqingniao.mybatis.mapping(包名)+orderMapper(OrderMapper.java文件去除后綴) -->
<mapper namespace="com.ntqingniao.mybatis.mapping.OrderMapper">
<!-- 根據id查詢得到一個order對象,使用這個查詢是查詢不到我們想要的結果的, 這主要是因為實體類的屬性名和數據庫的字段名對應不上的原因,因此無法查詢出對應的記錄 -->
<select id="getOrderById" parameterType="int" resultType="com.ntqingniao.mybatis.entity.Order">
select
* from orders where order_id=#{id}
</select>
<!-- 方法一 -->
<!-- 根據id查詢得到一個order對象,使用這個查詢是可以正常查詢到我們想要的結果的, 這是因為我們查詢的字段名都起一個和實體類屬性名相同的別名,這樣實體類的屬性名和查詢結果中的字段名就可以一一對應上 -->
<select id="selectOrder" parameterType="int" resultType="com.ntqingniao.mybatis.entity.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="com.ntqingniao.mybatis.entity.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>
~~~
### 3、在 conf.xml 文件中添加 orderMapper.xml 映射文件
~~~
<mappers>
<!-- 注冊orderMapper.xml文件,
orderMapper.xml位于com.ntqingniao.mybatis.mapping這個包下,所以resource寫成com/ntqingniao/mybatis/mapping/orderMapper.xml-->
<mapper resource="com/ntqingniao/mybatis/mapping/orderMapper.xml"/>
</mappers>
~~~
### 4、測試代碼
測試類代碼如下:
~~~
package com.ntqingniao.mybatis.test;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.ntqingniao.mybatis.entity.Order;
import com.ntqingniao.mybatis.entity.User;
import com.ntqingniao.mybatis.mapping.OrderMapper;
import com.ntqingniao.mybatis.mapping.UserMapper;
public class Test1 {
public static void main(String[] args) {
// mybatis的配置文件
String resource = "conf.xml";
// 使用類加載器加載mybatis的配置文件(它也加載關聯的映射文件)
InputStream is = Test.class.getClassLoader().getResourceAsStream(
resource);
// 構建sqlSession的工廠
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder()
.build(is);
// 使用MyBatis提供的Resources類加載mybatis的配置文件(它也加載關聯的映射文件)
// Reader reader = Resources.getResourceAsReader(resource);
// 構建sqlSession的工廠
// SqlSessionFactory sessionFactory = new
// SqlSessionFactoryBuilder().build(reader);
// 創建能執行映射文件中sql的sqlSession
SqlSession session = sessionFactory.openSession();
// 通過getMapper()方法獲取UserMapper接口
OrderMapper orderMapper = session.getMapper(OrderMapper.class);
Order order = new Order();
// 查詢orders表中id為1的記錄,執行查詢操作,將查詢結果自動封裝成Order返回
order = orderMapper.getOrderById(1);
// 打印結果:null,也就是沒有查詢出相應的記錄
System.out.println(order);
// 執行查詢操作,將查詢結果自動封裝成Order返回(SQL查詢語句采用別名)
order = orderMapper.selectOrder(1);
// 打印結果:Order [id=1, orderNo=aaaa, price=23.0]
System.out.println(order);
// 執行查詢操作,將查詢結果自動封裝成Order返回(采用resultMap進行配置)
order = orderMapper.selectOrderResultMap(1);
// 打印結果:Order [id=1, orderNo=aaaa, price=23.0]
System.out.println(order);
// 使用SqlSession執行完SQL之后需要關閉SqlSession
session.close();
}
}
~~~
> 測試結果:
> 1、getOrderById() 方法執行查詢后返回一個 null。
> 2、selectOrder() 方法和 selectOrderResultMap() 方法執行查詢后,可以正常得到想要的結果。
## 四、總結
當實體類中的屬性名和表中的字段名不一致時,使用 MyBatis 進行查詢操作時無法查詢出相應的結果的問題以及針對問題采用的兩種辦法:
> 解決辦法一: 通過在查詢的 sql 語句中定義字段名的別名,讓字段名的別名和實體類的屬性名一致,這樣就可以表的字段名和實體類的屬性名一一對應上了,這種方式是通過在 sql 語句中定義別名來解決字段名和屬性名的映射關系的。
>
> 解決辦法二: 通過`<resultMap>`來映射字段名和實體類屬性名的一一對應關系。這種方式是使用MyBatis提供的解決方式來解決字段名和屬性名的映射關系的。
- 前言
- 計算機概論
- 數據庫
- 數據庫介紹
- MySQL的安裝
- SQL
- 表基本操作
- 修改數據語句
- 數據檢索操作
- 多表數據操作
- 表結構設計
- 綜合應用
- JAVA
- JAVA 介紹
- JAVA 運行原理
- JDK 配置
- 類和對象
- 數據類型
- 變量
- 直接量
- 運算符
- 流程控制
- 數組結構
- 面向對象
- 隱藏和封裝
- 深入構造器
- 類的繼承
- 多態
- 包裝類
- final 修飾符
- 抽象類
- 接口
- 集合框架
- 常用類學習
- 異常處理
- 設計模式-單例模式
- JDBC
- JSP&Servlet
- Web應用
- Tomcat
- JSP
- Scriptlet
- Page 指令
- 包含指令
- 跳轉指令
- 用戶注冊實例
- JSP練習
- 內置對象
- Servlet
- 過濾器
- Web分層思想
- EL表達式
- JSTL
- 分頁實現
- AJAX&JSON
- 開發步驟
- 路徑問題
- Log4j
- 電子書城
- 案例分析
- 核心代碼
- Java 高級
- 文件操作
- 泛型
- 類加載機制和反射
- 注解 Annotation
- Mybatis框架
- 框架介紹
- Mybatis簡單實現
- 表基本操作
- 優化配置文件
- 表字段名與實體類屬性名不同的解決方案
- 一對一關聯
- 一對多關聯
- 教學管理
- 學員名錄
- 周測統計
- 2017-10-27
- 2017-11-03
- 2017-11-10
- 2017-11-17
- 課堂作業
- 班會紀要
- 2017-10-24
- 缺勤記錄
- 班級備忘錄
- 違紀統計
- 編程素養
- Day001
- Day002
- Day003
- Day004
- Day005
- Day006
- Day007
- Day008
- Day009
- Day010
- Day011
- Day012
- Day013
- Day014
- Day015
- Day016
- Day017
- Day018
- Day019