1. 程式人生 > >Mybatis入門(一)

Mybatis入門(一)

目錄

MyBatis入門

Editor:SimpleWu

MyBatis簡介

  • MyBatis 本是apache的一個開源專案iBatis, 2010年這個專案由apache software foundation 遷移到了google code,並且改名為MyBatis 。2013年11月遷移到Github。
  • MyBatis 是支援定製化 SQL、儲存過程以及高階對映的優秀的持久層框架。MyBatis 避免了幾乎所有的 JDBC 程式碼和手動設定引數以及獲取結果集。MyBatis 可以對配置和原生Map使用簡單的 XML 或註解,將介面和 Java 的 POJOs(Plain Old Java Objects,普通的 Java物件)對映成資料庫中的記錄。

MyBatis參考資料官網

http://www.mybatis.org/mybatis-3/zh/index.html

MyBatis下載地址

https://github.com/mybatis/mybatis-3

MyBatis的優勢

  • 開源的優秀的持久層框架
  • SQL語句與程式碼分離
  • 面向配置的程式設計
  • 良好支援複雜資料對映
  • 動態SQL

MyBatis開發步驟

1.新增需要的jar包

1)mybatis-3.3.0 核心包(如果需要日誌操作,可以匯入依賴包)

2)資料庫驅動(mysql-connector-java-5.1.22-bin)

2.建立資料庫,新增測試資料
create table `tal_employee` (
    `id` int (11),
    `last_name` varchar (360),
    `email` varchar (300),
    `gender` char (9)
); 
INSERT INTO `tal_employee` (`id`, `last_name`, `email`, `gender`) VALUES('1','韓信','[email protected]','男');
INSERT INTO `tal_employee` (`id`, `last_name`, `email`, `gender`) VALUES('2','LiBaihH','[email protected]','男');
INSERT INTO `tal_employee` (`id`, `last_name`, `email`, `gender`) VALUES('3','孫尚香','
[email protected]
','女'); INSERT INTO `tal_employee` (`id`, `last_name`, `email`, `gender`) VALUES('4','安琪拉','[email protected]','女'); INSERT INTO `tal_employee` (`id`, `last_name`, `email`, `gender`) VALUES('5','Hello','[email protected]','男'); INSERT INTO `tal_employee` (`id`, `last_name`, `email`, `gender`) VALUES('6','Miya','[email protected]','男');
3.建立實體類
public class Employee {
    private Integer id;
    private String lastName;
    private String email;
    private String gender;
    //此處省略get set toString。。。
}
4.建立實體類對映配置檔案
<?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="EmployeeMapper">
    <!-- 定義一個查詢方法  resultType 返回值型別-->
    <select id="findAll" resultType="com.simple.mybatis.entitys.Employee">
        select * from tal_employee
    </select>
</mapper>
5.建立mybatis主配置檔案
<?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>
    <!-- 配置環境  default預設使用環境名字-->
    <environments default="development">
        <!-- 配置一個環境 -->
        <environment id="development">
            <!-- 使用事務JDBC事務管理器 -->
            <transactionManager type="JDBC" />
            <!-- 配置資料庫連線 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
                <property name="username" value="root" />
                <property name="password" value="root" />
            </dataSource>
        </environment>
    </environments>
    <!-- 載入對映 -->
    <mappers>
        <mapper resource="com/simple/mybatis/entitys/EmployeeMapper.xml" />
    </mappers>
</configuration>

編寫程式碼見下文

獲取SqlSessionFactory物件

private SqlSessionFactory sqlSessionFactory;
    @Before
    public void init() throws IOException{
        //讀取mybatis主配置檔案
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        /**
         * 例項化SqlSessionFactory
         * 如果沒有指定預設環境,可以在這裡指定使用的環境ID,比如我先在有個DEV環境
         * sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream,"DEV");
         * 我這裡已經使用了預設環境所以我就不用這種方式建立了
         */
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    }

訪問資料庫

獲取SqlSession物件,作用於與資料庫的一次回話作用於與資料庫的一次回話

SqlSession session = sqlSessionFactory.openSession();

獲取所有員工記錄

EmployeeMapper就是我們實體類對映檔案的名稱空間,findAll就是我們select標籤的ID

List<Employee> employees = session.selectList("EmployeeMapper.findAll");
        for (Employee employee : employees) {
            System.out.println(employee);
        }

訪問結果:

Employee [id=1, lastName=null, [email protected], gender=男]
Employee [id=2, lastName=null, [email protected], gender=男]
Employee [id=3, lastName=null, [email protected], gender=女]
Employee [id=4, lastName=null, [email protected], gender=女]
Employee [id=5, lastName=null, [email protected], gender=男]
Employee [id=6, lastName=null, [email protected], gender=男]

在這裡我們訪問資料庫是正常的,為什麼lastName為空呢?

解決表字段與類屬性名不對應

原因:應為我們這裡實體類上的屬性叫做lastName與資料庫列last_name名字不對應所以獲取的值為空

解決方案1:將實體類對映檔案的中select標籤中的取別名

<select id="findAll" resultType="com.simple.mybatis.entitys.Employee">
        select id,last_name AS lastName,email,gender from tal_employee
</select>

解決方案2:在mybatis主配置檔案中配置駝峰式命名,需要將配置排在前面否則XML報錯

<settings>
    <!-- 開啟駝峰式命名規則 -->
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

使用方案2我們類中屬性lastName會匹配資料庫欄位last_name

使用日誌檢視SQL語句等

首先我們需要新增mybatis依賴包

新增log4j.properties

#設定輸出級別和輸出位置
log4j.rootLogger=debug,Console
#設定控制檯相關的引數
log4j.appender.Console=org.apache.log4j.ConsoleAppender  
log4j.appender.Console.layout=org.apache.log4j.PatternLayout  
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n  
#設定MyBatis的輸出內容
log4j.logger.java.sql.ResultSet=INFO  
log4j.logger.org.apache=INFO  
log4j.logger.java.sql.Connection=DEBUG  
log4j.logger.java.sql.Statement=DEBUG  
log4j.logger.java.sql.PreparedStatement=DEBUG

這樣我們就可以使用log4j來檢視我們的sql語句啊,傳入的引數啊。。等等

MyBatis的配置檔案

  • 通過前面簡單的MyBatis案例,大家應該瞭解到了MyBatis框架的基本結構,和Hibernate一樣,MyBatis包含了一個核心配置檔案和對映檔案。
  • 核心配置檔案(mybatis-config.xml):包含了對Mybatis的核心配置,包含連線池資訊,事務,載入對映檔案,引數設定等配置。
  • 對映檔案(EmployeeMapper.xml):主要實現實體物件對資料庫的對映,關聯關係,Sql語句等。

核心配置檔案

標籤 說明
配置環境
一些外部屬性,這些屬性可以被替換
Mybatis中極為重要的調整設定,會改變Mybatis的預設行為。
為Java型別設定一個別名,它只和xml配置有關。
對映器,載入MyBatis的對映檔案。
外掛,Mybatis允許使用者在對映的某一點進行攔截。

環境配置

  1. Mybatis可以通過配置多種環境,比如開發環境、測試環境和生產環境等。
  2. 不過要記住,儘管可以配置多個環境,但是SqlSessionFactory物件只能載入一個。如果你需要同時連線多個數據庫,需要建立多個SqlSessionFactory例項。

事務管理

在 MyBatis 來進行事務的設定,其中有兩種型別的事務管理器。

  1. JDBC:這個配置就是直接使用了 JDBC 的提交和回滾設定,它依賴於從資料來源得到的連線來管理事務範圍。
  2. MANAGED:這個配置幾乎沒做什麼。它從來不提交或回滾一個連線,而是讓容器來管理事務的整個生命週期(比如 JEE 應用伺服器的上下文)。 預設情況下它會關閉連線,然而一些容器並不希望這樣,因此需要將 closeConnection 屬性設定為 false 來阻止它預設的關閉行為。
<transactionManager type="MANAGED">
    <property name="closeConnection" value="false"/>
</transactionManager>

如果你正在使用 Spring + MyBatis,則沒有必要配置事務管理器, 因為 Spring 模組會使用自帶的管理器來覆蓋前面的配置。

資料來源

使用標準的 JDBC 資料來源介面來配置 JDBC 連線物件的資源。有三種資料來源型別

  1. UNPOOLED:這個資料來源的實現只是每次被請求時開啟和關閉連線。
  2. POOLED:這種資料來源的實現利用“池”的概念將 JDBC 連線物件組織起來, 避免了建立新的連線例項時所必需的初始化和認證時間。
  3. JNDI:使用JNDI在外部配置資料來源。

properties標籤

properties為外部屬性,比如資料庫連線資訊可以配置到一個單獨的properties檔案中,然後在xml中進行引入。

新增一個db.properties檔案

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
username=root
password=root

在mybatis主配置檔案中引用

<properties resource="db.properties" />
<environments default="development">
    <environment id="development">
        <transactionManager type="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>

對映器

通常MyBatis中將對映關係(非必須)和SQL語句寫入到對映檔案中,在配置檔案中需要手動進行載入對映檔案。載入對映檔案使用進行載入。Mybatis中有4種載入方式。

1.使用resource,載入classpath路徑進行載入。

<mappers>
    <mapper resource="com/simple/mybatis/entitys/EmployeeMapper.xml"/>
</mappers>

2.使用url路徑進行載入。

<mappers>
    <mapper url="file:///var/mappers/AuthorMapper.xml"/>
</mappers>

3.使用calss進行載入,註解方式。

<!– 載入class類-->
<mappers>
    <mapper class="使用註解的全類名"/>
</mappers>

4.使用package進行載入,註解方式。

<!– 載入某個包下的所有class檔案-->
<mappers>
    <package name="com.simple.mybatis.entitys"/>
</mappers>

別名的使用

之前,我們在sql對映xml檔案中的引用實體類時,resultType需要寫上實體類的全類名(包名+類名),如下:

<select id="findAll" resultType="com.simple.mybatis.entitys.Employee">
        select id,last_name AS lastName,email,gender from tal_employee
</select>

在mybatis主配置檔案中加入

<typeAliases>
    <typeAlias type=“com.simple.mybatis.entitys.Employee" alias="Employee"/>
</typeAliases>

這樣在resultType中就可以直接使用Employee型別了。這個別名是不區分大小寫的。