MyBatis學習筆記(二)優化MyBatis配置,解耦合,提高複用性
阿新 • • 發佈:2019-01-26
我們接著上篇的環境,優化MyBatis配置
1.連線資料庫的配置放在properties檔案中
在src下建立db.properties檔案,寫連線資料庫需要使用到的資料庫驅動,連線URL地址,使用者名稱,密碼;內容如下
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis
username=root
password=123456
在MyBatis配置檔案conf.xml中引用db.properties,如下所示:
<?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>
<typeAlias type="com.model.Users" alias="Users" />
</typeAliases>
<environments default="development" >
<environment id="development">
<!-- 事務由JDBC控制 -->
<transactionManager type="JDBC" />
<!-- 配置資料庫連線資訊 ,POOLED表示可以配置JDBC連線池-->
<dataSource type="POOLED">
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
<mappers>
<!-- 註冊UsersMapper.xml檔案 -->
<mapper resource="com/mapping/UsersMapper.xml"/>
</mappers>
</configuration>
2.建立公用的工具類MyBatisUtil管理SqlSessionFactory & Sesison
我們基於SqlSessionFactory 的最佳範圍是應用範圍,採用單例;SqlSession 的最佳範圍是請求或方法範圍,該例項不是執行緒安全的,因此是不能被共享的,建立MyBatisUtil如下
package com.util;
import java.io.IOException;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
/**
*
* @author wenjuanhenxing
* @version MyBatisUtil.java 2015年12月2日 上午9:39:13
*/
// 提供獲取SqlSessionFactory物件或管理Sesison的操作,解耦合,方便複用
public class MyBatisUtil {
public static final String CONFIG_PATH = "com/mybatis/resource/conf.xml";
// 每一個MyBatis的應用程式都以一個SqlSessionFactory物件的例項為核心
// 使用SqlSessionFactory的最佳實踐是在應用執行期間不要重複建立多次,最佳範圍是應用範圍
private static SqlSessionFactory sqlSessionFactory = null;
static {
Reader read = null;
try {
read = Resources.getResourceAsReader(CONFIG_PATH);
} catch (IOException e) {
System.out.println("Read資原始檔異常");
e.printStackTrace();
}
sqlSessionFactory = new SqlSessionFactoryBuilder().build(read);
}
public static SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
// 獲取session
public static SqlSession getSqlsession() {
return sqlSessionFactory.openSession();
}
// 關閉session
public static void closeSession(SqlSession sqlSession) {
if (sqlSession != null) {
sqlSession.close();
}
}
/**
* 獲取SqlSession
*
* @param isAutoCommit
* true 表示建立的SqlSession物件在執行完SQL之後會自動提交事務 false
* 不會自動提交事務,這時就需要我們手動呼叫sqlSession. commit()提交事務
* @return SqlSession
*/
public static SqlSession getSqlSession(boolean isAutoCommit) {
return getSqlSessionFactory().openSession(isAutoCommit);
}
}
3.定義別名,簡化mapper對映檔案
這個在上篇已經用到,即在conf.xml中添加了如下配置:
<typeAliases>
<typeAlias type="com.model.Users" alias="Users" />
</typeAliases>
這樣一來UsersMapper.xml檔案中就不需要實體類Users的全類名(包名+類名)
此外,還可以批量為某個包下的所有實體類設定別名,如下:
<typeAliases>
<!-- 為com.model包下的所有實體類配置別名,MyBatis預設的設
置別名的方式就是去除類所在的包後的簡單的類名
如com.model.Users實體類別名被設定成Users
-->
<package name="com.model"/>
</typeAliases>