一、連接數據庫的配置單獨放在一個properties文件中
之前,我們是直接將數據庫的連接配置信息寫在了MyBatis的conf.xml文件中,如下:
其實我們完全可以將數據庫的連接配置信息寫在一個properties文件中,然後在conf.xml文件中引用properties文件,具體做法如下:
1、在src目錄下新建一個db.properties文件,如下圖所示:
在db.properties文件編寫連接數據庫需要使用到的數據庫驅動,連接URL地址,用戶名,密碼,如下:
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/mybatis name=root password=XDP
2、在MyBatis的conf.xml文件中引用db.properties文件,如下:
二、爲實體類定義別名,簡化sql映射xml文件中的引用
之前,我們在sql映射xml文件中的引用實體類時,需要寫上實體類的全類名(包名+類名),如下:
<!-- 創建用戶(Create) --> <insert id="addUser" parameterType="me.gacl.domain.User"> insert into users(name,age) values(#{name},#{age}) </insert>
parameterType="me.gacl.domain.User"這裏寫的實體類User的全類名me.gacl.domain.User,每次都寫這麼一長串內容挺麻煩的,而我們希望能夠簡寫成下面的形式
<insert id="addUser2" parameterType="_User"> insert into users(name,age) values(#{name},#{age}) </insert>
parameterType="_User"這樣寫就簡單多了,爲了達到這種效果,我們需要在conf.xml文件中爲實體類="me.gacl.domain.User"定義一個別名爲"_User",具體做法如下:
在conf.xml文件中<configuration></configuration>標籤中添加如下配置:
<typeAliases> <typeAlias type="me.gacl.domain.User" alias="_User"/> </typeAliases>
這樣就可以爲me.gacl.domain.User類定義了一個別名爲_User,以後_User就代表了me.gacl.domain.User類,這樣sql映射xml文件中的凡是需要引用me.gacl.domain.User類的地方都可以使用_User來代替,這就達到了一個簡化實體類引用的目的。
除了可以使用<typeAliastype="me.gacl.domain.User" alias="_User"/>這種方式單獨爲某一個實體類設置別名之外,我們還可以使用如下的方式批量爲某個包下的所有實體類設置別名,如下:
-
- <!-- 配置實體類的別名,配置實體類別名的目的是爲了在引用實體類時可以使用實體類的別名來代替實體類,達到簡寫的目的 -->
- <typeAliases>
- <!-- 爲實體類me.gacl.domain.User配置一個別名_User -->
- <!-- <typeAlias type="me.gacl.domain.User" alias="_User"/> -->
- <!-- 爲me.gacl.domain包下的所有實體類配置別名,MyBatis默認的設置別名的方式就是去除類所在的包後的簡單的類名
- 比如me.gacl.domain.User這個實體類的別名就會被設置成User
- -->
- <package name="me.gacl.domain"/>
- </typeAliases>
-
<package name="me.gacl.domain"/>就表示爲這個包下面的所有實體類設置別名。MyBatis默認的設置別名的方式就是去除類所在的包後的簡單的類名,比如me.gacl.domain.User這個實體類的別名就會被設置成User。
在平時的開發中,我們表中的字段名和表對應實體類的屬性名稱不一定都是完全相同的,下面來演示一下這種情況下的如何解決字段名與實體類屬性名不相同的衝突。
一、準備演示需要使用的表和數據
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、創建一個orderMapper.xml文件,orderMapper.xml的內容如下:
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、編寫單元測試代碼
執行單元測試的結果:
1、testGetOrderById方法執行查詢後返回一個null。
2、testGetOrderById2方法和testGetOrderById3方法執行查詢後可以正常得到想要的結果。
四、總結
上面的測試代碼演示當實體類中的屬性名和表中的字段名不一致時,使用MyBatis進行查詢操作時無法查詢出相應的結果的問題以及針對問題採用的兩種辦法:
解決辦法一: 通過在查詢的sql語句中定義字段名的別名,讓字段名的別名和實體類的屬性名一致,這樣就可以表的字段名和實體類的屬性名一一對應上了,這種方式是通過在sql語句中定義別名來解決字段名和屬性名的映射關係的。
解決辦法二: 通過<resultMap>來映射字段名和實體類屬性名的一一對應關係。這種方式是使用MyBatis提供的解決方式來解決字段名和屬性名的映射關係的。