1. 程式人生 > >MyBatis學習筆記(二)優化MyBatis配置,解耦合,提高複用性

MyBatis學習筆記(二)優化MyBatis配置,解耦合,提高複用性

我們接著上篇的環境,優化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>