一、 Mybatis 簡述
MyBatis 本是 apache 的一個開源項目 iBatis, 2010 年這個項目由
apache software foundation 遷移到了 google code, 并且改名為 MyBatis 。
2013 年 11 月遷移到 Github。
iBATIS 一詞來源于"internet" 和"abatis" 的組合, 是一個基于 Java
的持久層框架。 iBATIS 提供的持久層框架包括 SQL Maps 和 Data Access
Objects(DAO)
MyBatis 是一個支持普通 SQL 查詢, 存儲過程和高級映射的優(yōu)秀持久層
框架。 MyBatis 消除了幾乎所有的 JDBC
代碼和參數(shù)的手工設(shè)置以及對結(jié)果集的檢索封裝。 MyBatis 可以使用簡單的 XML
或注解用于配置和原始映射, 將接口和 Java 的 POJO(Plain Old Java
Objects, 普通的 Java 對象) 映射成數(shù)據(jù)庫中的記錄。
mybatis 不是一個完全的 orm 框架, Mybatis 需要程序員自己寫 sql, 但
是也存在映射(輸入?yún)?shù)映射, 輸出結(jié)果映射) , 學(xué)習(xí)門檻 mybatis 比
hibernate 低; 同時靈活性高, 特別適用于業(yè)務(wù)模型易變的項目, 使用范圍
廣。
簡單概括:更加簡化 jdbc 代碼,簡化持久層,sql 語句從代碼中分離,利用反
射,將表中數(shù)據(jù)與 java bean 屬性一一映射 即 ORM(Object Relational
Mapping 對象關(guān)系映射).
使用范圍:
在日常的開發(fā)項目中, 如中小型項目, 例如 ERP,需求與關(guān)系模型相對固
定建議使用 Hibernate, 對于需求不固定的項目, 比如: 互聯(lián)網(wǎng)項目,
建議使用 mybatis, 因為需要經(jīng)常靈活去編寫 sql 語句。 總之, mybatis
成為當下必須學(xué)習(xí)掌握的一個持久層框架。
二、 MyBatis 功能架構(gòu)圖

從上面我們可以看到 mybatis 的功能架構(gòu)分為三層:
API 接口層:提供給外部使用的接口 API,開發(fā)人員通過這些本地 API
來操縱
數(shù)據(jù)庫。接口層接收到調(diào)用請求就會調(diào)用數(shù)據(jù)處理層來完成具體的數(shù)據(jù)處理。
數(shù)據(jù)處理層:負責具體的 SQL 查找、SQL 解析、SQL
執(zhí)行和執(zhí)行結(jié)果映射處
理等。它主要的目的是根據(jù)調(diào)用的請求完成一次數(shù)據(jù)庫操作。
基礎(chǔ)支撐層:負責最基礎(chǔ)的功能支撐,包括連接管理、事務(wù)管理、配置加載和
緩存處理,這些都是共用的東西,將他們抽取出來作為最基礎(chǔ)的組件。為上層的數(shù)據(jù)
處理層提供最基礎(chǔ)的支撐。
三、 MyBatis 框架體系結(jié)構(gòu)

1、 Configuration-mybatis 配置
1)、 與 spring 一樣,可以通過配置文件或注解的形式進行配置;
2)、 SqlMapConfig.xml, 此文件作為 mybatis 的全局配置文件, 配置了
mybatis 的運行環(huán)境等信息;
3)、 mapper 文件即 sql 映射文件, 文件中配置了操作數(shù)據(jù)庫的 sql 語句。
此文件需要在 SqlMapConfig.xml 中加載。
4)、 有了配置文件后, 通過 mybatis 環(huán)境等配置信息構(gòu)造
SqlSessionFactory即會話工廠
5)、 由會話工廠創(chuàng)建 sqlSession 即會話, 操作數(shù)據(jù)庫需要通過 sqlSession
進行
6)、 sqlSession 使用 Executor(數(shù)據(jù)庫操作執(zhí)行器口)操作數(shù)據(jù)庫, 同
Executor 具體實現(xiàn)類實現(xiàn)指定 dao 層數(shù)據(jù)訪問操作。
2、 Mapped Statement
框架底層封裝對象(sql 語句、 輸入?yún)?shù)、 輸出結(jié)果類型) , 它包裝了
mybatis 配置信息及 sql 映射信息等, mapper 文件(即 Mapper.xml)中一個
sql對應(yīng)一個 Mapped Statement 對象, sql 的 id 即是 Mapped statement 的
id。
3、 Sql 的輸入映射參數(shù)
基本和簡單類型、 HashMap、 自定義 POJO 等。 輸入?yún)?shù)映射就是 jdbc 編
程中對 preparedStatement 設(shè)置參數(shù), Executor 通過 Mapped Statement
在執(zhí)行 sql 前將輸入的 java 對象映射至 sql 中。
4、 Sql 的輸出映射參數(shù)
基本和簡單類型、 HashMap、 自定義 POJO。 Statement 對 sql 執(zhí)行輸出
結(jié)果進行定義, 輸出結(jié)果映射過程相當于 jdbc 編程中對結(jié)果的解析處理過程,
Executor 通過 Mapped Statement 在執(zhí)行 sql 后將輸出結(jié)果映射至 java
對象中。
這里使用 Maven 工程, 對應(yīng)的 mybatis jar 包下載通過 maven 倉庫統(tǒng)一
管理下載。
四、 Mybatis 環(huán)境搭建
1.新建 Maven 項目
新建 maven 項目 ,pom 文件添加依賴 jar
<dependency>
<!-- junit 測試 jar -->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- mybatis jar 包依賴 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<!-- 數(shù)據(jù)庫驅(qū)動 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.39</version>
</dependency>
<!-- log4j 日志打印 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
2.log4j 日志添加
在 src/main/resources 資源包下添加 log4j 日志輸出
properties 文件, 便于查看日志輸出信息
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
3.resources 目錄下主配置文件添加
新建 mybatis.xml 文件, 并加入配置信息如下(數(shù)據(jù)庫名mybatis,表 user)
<?xml version="1.0" encoding="UTF-8" ?>
<!-- mybatis 框架頭文件聲明,類似spring環(huán)境,均需要加入頭文件 -->
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- 添加數(shù)據(jù)庫連接相關(guān)配置信息 -->
<configuration>
<environments default="development">
<environment id="development">
<!-- 加入事務(wù)控制 -->
<transactionManager type="jdbc"/>
<!-- 配置數(shù)據(jù)庫連接信息 -->
<dataSource type="pooled">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="shsxt"/>
</dataSource>
</environment>
</environments>
<!-- mapper 配置文件指定 文件數(shù)量可配置多個-->
<mappers>
<mapper resource="com/shsxt/mapper/UserMapper.xml"/>
</mappers>
</configuration>
4.映射文件添加, 新建 UserMapper.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">
<!--
1.命名空間配置 全局唯一 包名+文件名
2.配置Mapped Statement
3. statement配置
id 值聲明statement編號 同一命名空間(同一文件)下不可重復(fù)
parameterType 輸入?yún)?shù)即占位符的數(shù)據(jù)類型 類型可以是 基本數(shù)據(jù)類型,字符串,java bean ,map,list等
resultType 輸出結(jié)果 類型可以是基本數(shù)據(jù)類型,字符串,java bean,map等
statement 描述 即待執(zhí)行的sql
#{id} 占位符 變量名為id/value 均可 ${value} 變量名必須為value 字符串拼接形式 無法避免sql 注入
-->
<mapper namespace="com.shsxt.mapper.UserMapper">
<select id="queryUserById" parameterType="int" resultType="com.shsxt.po.User">
select id,user_name as userName,user_pwd as userPwd from user where id=#{id}
</select>
<!--
<update id=""></update>
<delete id=""></delete>
<insert id=""></insert>
-->
</mapper>
5.1修改 pom 配置,設(shè)置資源文件夾路徑(使java類下的xml包含進配置)
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
<include>**/*.tld</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
6.新建user類

package com.shsxt.po;
/**
* Created by xlf on 2019/7/8.
*/
public class User {
private Integer id;
private String userName;
private String userPwd;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPwd() {
return userPwd;
}
public void setUserPwd(String userPwd) {
this.userPwd = userPwd;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", userName='" + userName + '\'' +
", userPwd='" + userPwd + '\'' +
'}';
}
}
7.創(chuàng)建單元測試MybaitsTest
package com.shsxt;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import com.shsxt.po.User;
import java.io.IOException;
import java.io.InputStream;
/**
* test mybatis環(huán)境搭建
*/
public class MyBatisTest {
@Test
public void test01() throws IOException {
/**
a)、讀取mybatis的配置文件
b)、加載配置文件創(chuàng)建SqlSessionFactory
c)、根據(jù)SqlSessionFactory創(chuàng)建SqlSession
d)、通過sqlSession操作數(shù)據(jù)庫
e)、處理結(jié)果
f)、關(guān)閉session
*/
InputStream is= Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(is);
SqlSession session = build.openSession();
User user = session.selectOne("com.shsxt.mapper.UserMapper.queryUserById", 6);
System.out.println(user);
session.close();
}
@Test
public void test02() throws IOException {
InputStream is= Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(is, "test");
SqlSession session = build.openSession();
User user = session.selectOne("com.shsxt.mapper.UserMapper.queryUserById", 6);
System.out.println(user);
session.close();
}
}

五、 Mybatis 配置文件解釋
1. properties
這些屬性都是可外部配置且可動態(tài)替換的,既可以在典型的 Java 屬性文件中配
置,亦可通過 properties 元素的子元素來傳遞。例如:
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://127.0.0.1:3306/mybatis" />
<property name="username" value="root" />
<property name="password" value="root" />
其中的屬性就可以在整個配置文件中使用來替換需要動態(tài)配置的屬性值。比如:
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
如何配?
在 config.xml 文件中<configuration>引入子標簽
<properties resource="jdbc.properties"></properties>
并修改原有數(shù)據(jù)源連接相關(guān)配置如下:
<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>
即可完成。
2. settings(了解)
這是 MyBatis 修改操作運行過程細節(jié)的重要的步驟。下方這個表格描述了這些設(shè)
置項、含義和默認值。一般我們用默認即可(詳細解釋見官網(wǎng)文檔)

對應(yīng) xml 配置如下(開發(fā)中一般采用默認配置即可):
3.typeAliases
類型別名是為 Java 類型設(shè)置一個短的名字。它只和 XML 配置有關(guān),存在的意義
僅在于用來減少類完全限定名的冗余。例如:
Configuration 標簽下添加(properties標簽之后,environment之前加入)
<typeAliases>
<typeAlias alias="User" type="com.shsxt.mybatis.po.User" />
</typeAliases>
修改 UserMapper.xml 文件
<mapper namespace="com.shsxt.mybatis.mapper.UserMapper">
<select id="queryUserById" parameterType="int
"resultType="User">
select id,userName,userPwd from user where id=#{id}
</select>
</mapper>
也可以指定一個包名(大家最喜歡的方式),MyBatis
會在包名下面搜索需要的 Java
Bean,(包掃描自動取別名)比如:
<typeAliases>
<!-- <typeAlias alias="User" type="com.shsxt.mybatis.po.User" /> -->
<!-- 包掃描 -->
<package name="com.shsxt.mybatis.po"/>
</typeAliases>
每一個在包 com.shsxt.mybatis.po 中的 Java
Bean,在沒有注解的情況下,會使用
Bean 的首字母小寫的非限定類名來作為它的別名。 比如
com.shsxt.mybatis.po.User 的別名為 user;
若有注解,則別名為其注解值。 注解名@Alias(value="user")
同樣 mybatis 已經(jīng)為我們內(nèi)建了相應(yīng)的類型別名,
它們都是大小寫不敏感的,需要注意的是由基本類型名稱重復(fù)導(dǎo)致的特殊處理。

4.typeHandlers 類型處理器
無論是 MyBatis 在預(yù)處理語句(PreparedStatement)中設(shè)置一個參數(shù)時,還是
從結(jié)果集中取出一個值時, 都會用類型處理器將獲取的值以合適的方式轉(zhuǎn)換成
Java
類型。下表描述了一些默認的類型處理器。


你可以重寫類型處理器或創(chuàng)建你自己的類型處理器來處理不支持的或非標準的類型。
具體做法為:實現(xiàn) org.apache.ibatis.type.TypeHandler 接口, 或繼承
一個很便利的類 org.apache.ibatis.type.BaseTypeHandler, 然后可以
選擇性地將它映射到一個 JDBC 類型。
5. 對象工廠(objectFactory)
MyBatis 每次創(chuàng)建結(jié)果對象的新實例時,它都會使用一個對象工廠
(ObjectFactory)實例來完成。默認的對象工廠需要做的僅僅是實例化目標類,要么通過默認構(gòu)造方法,要么在參數(shù)映射存在的時候通過參數(shù)構(gòu)造方法來實例化。默認情
況下,我們不需要配置,mybatis 會調(diào)用默認實現(xiàn)的
objectFactory。從這個類的外部
看,這個類的主要作用就是根據(jù)一個類的類型得到該類的一個實體對象,比如,我們
給他一個 User 的 type,他將會給我們一個 Tiger 的實體對象,我們給他一個
java.lang.List 對象,他將會給我們一個 List 的實體對象。**類似于 spring
工廠實例化bean
**6. plugins 插件
MyBatis 允許你在已映射語句執(zhí)行過程中的某一點進行攔截調(diào)用。默認情況下,
MyBatis 允許使用插件來攔截的方法調(diào)用包括:
? Executor (sql 執(zhí) 行 時 , update, query, flushStatements, commit,
rollback,
getTransaction, close, isClosed)
? ParameterHandler (參數(shù)的處理, getParameterObject, setParameters)
? ResultSetHandler (結(jié)果集的處理, handleResultSets,
handleOutputParameters)
? StatementHandler (申明語句的處理, prepare, parameterize, batch,
update,query)
這些類中方法的細節(jié)可以通過查看每個方法的簽名來發(fā)現(xiàn),或者直接查看
MyBatis
的發(fā)行包中的源代碼。
假設(shè)你想做的不僅僅是監(jiān)控方法的調(diào)用,那么你應(yīng)該很好的了
解正在重寫的方法的行為。
因為如果在試圖修改或重寫已有方法的行為的時候,你很
可能在破壞 MyBatis 的核心模塊。
這些都是更低層的類和方法,所以使用插件的時候
要特別當心。
通過 MyBatis 提供的強大機制,使用插件是非常簡單的,只需實現(xiàn) Interceptor
接口,并指定了想要攔截的方法簽名即可。
總配置添加
<plugins>
<plugin interceptor="com.shsxt.plugins.ExamplePlugin">
<property name="hello" value="100" />
</plugin>
</plugins>
插件 demo:
@Intercepts({
@Signature(
type=Executor.class,
/**
* 攔截所有方法
*/
method="query",
/**
* 參數(shù)定義
*/
args={MappedStatement.class,Object.class,RowBounds.class,ResultHandler.class}
)
})
public class ExamplePlugin implements Interceptor {
/**
* 每個插件必須實現(xiàn)以下三個方法
*/
/**
* Object intercept(Invocation invocation)是實現(xiàn)攔截邏輯的地方,
* 內(nèi)部要通過 invocation.proceed()顯式地推進責任鏈前進,也就是調(diào)用下一個攔
截器攔截目標方法。
*/
public Object intercept(Invocation invocation) throws Throwable {
System.out.println("intercept");
return invocation.proceed();
} /
**
* Object plugin(Object target) 就是用當前這個攔截器生成對目標 target 的代
理,
* 實際是通過 Plugin.wrap(target,this) 來完成的,把目標 target 和攔截器 this
傳給了包裝函數(shù)。
*/
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
/**
* setProperties(Properties properties)用于設(shè)置額外的參數(shù),參數(shù)配置在攔截器
的 Properties 節(jié)點里。
*/
public void setProperties(Properties properties) {
System.out.println(properties.get("hello"));
}
}

7. 配置環(huán)境(environments) (熟悉 配多個數(shù)據(jù)源)
MyBatis 可以配置成適應(yīng)多種環(huán)境, 這種機制有助于將 SQL 映射應(yīng)用于多種
數(shù)據(jù)庫之中, 現(xiàn)實情況下有多種理由需要這么做。 例如, 開發(fā)、
測試和生產(chǎn)環(huán)境需要有不同的配置; 或者共享相同 Schema 的多個生產(chǎn)數(shù)據(jù)庫,
想使用相同的 SQL 映射。 許多類似的用例。
不過要記?。?盡管可以配置多個環(huán)境, 每個 SqlSessionFactory
實例只能選
擇其一。
所以, 如果你想連接兩個數(shù)據(jù)庫, 就需要創(chuàng)建兩個 SqlSessionFactory 實
例, 每個數(shù)據(jù)庫對應(yīng)一個。 而如果是三個數(shù)據(jù)庫, 就需要三個實例,
依此類推, 記起來很簡單.
? 每個數(shù)據(jù)庫對應(yīng)一個 SqlSessionFactory 實例
7.1配置mybatis.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!-- mybatis 框架頭文件聲明,類似spring環(huán)境,均需要加入頭文件 -->
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- 添加數(shù)據(jù)庫連接相關(guān)配置信息 -->
<configuration>
<properties resource="db.properties"></properties>
<typeAliases>
<!-- 定義別名 -->
<!--<typeAlias alias="user" type="com.shsxt.po.User"></typeAlias>-->
<!-- 包掃描 -->
<package name="com.shsxt.po"/>
</typeAliases>
<environments default="development">
<environment id="development">
<!-- 加入事務(wù)控制 -->
<transactionManager type="jdbc" />
<!-- 配置數(shù)據(jù)庫連接信息 -->
<dataSource type="pooled">
<!--<property name="driver" value="com.mysql.jdbc.Driver" />-->
<!--<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis" />-->
<!--<property name="username" value="root" />-->
<!--<property name="password" value="123456" />-->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
<environment id="test">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${driver2}" />
<property name="url" value="${url2}" />
<property name="username" value="${username2}" />
<property name="password" value="${password2}" />
</dataSource>
</environment>
</environments>
<!-- mapper 配置文件指定 文件數(shù)量可配置多個-->
<mappers>
<!-- 第一種 使用配置文件 -->
<!--<mapper resource="com/shsxt/mapper/UserMapper.xml" />-->
<!-- 第二種 絕對路徑(不用)-->
<!-- 第三種 接口+注解 -->
<!--<mapper class="com.shsxt.dao.CardDao"></mapper>-->
<!-- 第四種 包掃描 -->
<package name="com.shsxt.mapper"/>
<!--
條件:
1. 通過存在 mapper.xml 和 mapper.java
2. 必須在同一個包里面
-->
</mappers>
</configuration>
7.2 db.properties添加另一個數(shù)據(jù)庫連接
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/mybatis
username=root
password=123456
driver2=com.mysql.jdbc.Driver
url2=jdbc:mysql://127.0.0.1:3306/mybatis_test
username2=root
password2=123456
7.3測試 sqlSessionFactory
第一個test對應(yīng)查詢mybatis數(shù)據(jù)庫,第二個test對應(yīng)mybatis_test數(shù)據(jù)庫
*/
public class MyBatisTest {
@Test
public void test01() throws IOException {
/**
a)、讀取mybatis的配置文件
b)、加載配置文件創(chuàng)建SqlSessionFactory
c)、根據(jù)SqlSessionFactory創(chuàng)建SqlSession
d)、通過sqlSession操作數(shù)據(jù)庫
e)、處理結(jié)果
f)、關(guān)閉session
*/
InputStream is= Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(is);
SqlSession session = build.openSession();
User user = session.selectOne("com.shsxt.mapper.UserMapper.queryUserById", 6);
System.out.println(user);
session.close();
}
@Test
public void test02() throws IOException {
InputStream is= Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(is, "test");
SqlSession session = build.openSession();
User user = session.selectOne("com.shsxt.mapper.UserMapper.queryUserById", 6);
System.out.println(user);
session.close();
}
}
8. 事務(wù)管理器(transactionManager) (了解)
在 MyBatis 中有兩種類型的事務(wù)管理器(也就
type="[JDBC|MANAGED]") :
? JDBC -- 這個配置就是直接使用了 JDBC 的提交和回滾設(shè)置, 它依賴于
從數(shù)據(jù)源得到的連接來管理事務(wù)范圍。
? MANAGED -- 這個配置幾乎沒做什么。 它從來不提交或回滾一個連接,
而是讓容器來管理事務(wù)的整個生命周期。 默認情況下它會關(guān)閉連接, 然而
一些容器并不希望這樣, 因此需要將 closeConnection 屬性設(shè)置為 false 來
阻止它默認的關(guān)閉行為。 例如:
<transactionManager type="MANAGED">
<property name="closeConnection" value="false"/>
</transactionManager>
如果你正在使用 Spring + MyBatis, 則沒有必要配置事務(wù)管理器, 因為
Spring 模塊會使用自帶的管理器來覆蓋前面的配置。
9.dataSource 數(shù)據(jù)源(了解)
dataSource 元素使用標準的 JDBC 數(shù)據(jù)源接口來配置 JDBC 連接對象的資源。
數(shù)據(jù)源類型有三種:UNPOOLED,POOLED,JNDI
9.1UNPOOLED
這個數(shù)據(jù)源的實現(xiàn)只是每次被請求時打開和關(guān)閉連接。雖然有一點慢,它對在及時
可用連接方面沒有性能要求的簡單應(yīng)用程序是一個很好的選擇。
不同的數(shù)據(jù)庫在這方
面表現(xiàn)也是不一樣的,所以對某些數(shù)據(jù)庫來說使用連接池并不重要,這個配置也是理
想的。
? driver -- 這是 JDBC 驅(qū)動的 Java 類的完全限定名(并不是 JDBC
驅(qū)動中可能
包含的數(shù)據(jù)源類)。
? url -- 這是數(shù)據(jù)庫的 JDBC URL 地址。
? username -- 登錄數(shù)據(jù)庫的用戶名。
? password -- 登錄數(shù)據(jù)庫的密碼。
? defaultTransactionIsolationLevel -- 默認的連接事務(wù)隔離級別。
作為可選項,你也可以傳遞屬性給數(shù)據(jù)庫驅(qū)動。要這樣做,屬性的前綴為"driver.",例
如:
? driver.encoding=UTF8
這將通過 DriverManager.getConnection(url,driverProperties)方法傳遞值
為 UTF8 的 encoding 屬性給數(shù)據(jù)庫驅(qū)動。
**9.2POOLED
**這種數(shù)據(jù)源的實現(xiàn)利用"池"的概念將 JDBC
連接對象組織起來,避免了創(chuàng)建新的連
接實例時所必需的初始化和認證時間。 這是一種使得并發(fā) Web
應(yīng)用快速響應(yīng)請求的
流行處理方式。(一般選用這種)
? poolMaximumActiveConnections -- 在任意時間可以存在的活動(也就是正
在使用)連接數(shù)量,默認值:10
? poolMaximumIdleConnections -- 任意時間可能存在的空閑連接數(shù)。
? poolMaximumCheckoutTime -- 在 被 強 制 返 回 之 前 , 池 中 連 接 被
檢 出
(checked out)時間,默認值:20000 毫秒(即 20 秒)
? poolTimeToWait --
這是一個底層設(shè)置,如果獲取連接花費的相當長的時間,它會給連接池打印狀態(tài)日志并重新嘗試獲取一個連接(避免在誤配置的情況下一直安靜的失?。?,默認值:20000
毫秒(即 20 秒)。
? poolPingQuery -- 發(fā)送到數(shù)據(jù)庫的偵測查詢,用來檢驗連接是否處在正常工
作秩序中并準備接受請求。默認是"NO PING QUERY SET" ,這會導(dǎo)致多數(shù)數(shù)
據(jù)庫驅(qū)動失敗時帶有一個恰當?shù)腻e誤消息。
? poolPingEnabled -- 是否啟用偵測查詢。若開啟,也必須使用一個可執(zhí)行的
SQL 語句設(shè)置 poolPingQuery 屬性(最好是一個非常快的 SQL),默認
值:false。
? poolPingConnectionsNotUsedFor -- 配置 poolPingQuery 的使用頻度。這
可以被設(shè)置成匹配具體的數(shù)據(jù)庫連接超時時間,來避免不必要的偵測,默認
值:0(即所有連接每一時刻都被偵測 --- 當然僅當 poolPingEnabled 為
true 時適用)。
?
**9.3JNDI
**這個數(shù)據(jù)源的實現(xiàn)是為了能在如 EJB 或應(yīng)用服務(wù)器這類容器中使用,容器可以
集中或在外部配置數(shù)據(jù)源,然后放置一個 JNDI 上下文的引用。
? initial_context -- 這個屬性用來在 InitialContext 中尋找上下文(即,
initialContext.lookup(initial_context)) 。 這是個可選屬性, 如果忽略,
那么
data_source 屬性將會直接從 InitialContext 中尋找。
? data_source -- 這是引用數(shù)據(jù)源實例位置的上下文的路徑。 提供了
initial_context 配置時會在其返回的上下文中進行查找,
沒有提供時則直接在
InitialContext 中查找。和其他數(shù)據(jù)源配置類似,
可以通過添加前綴"env."直接把屬性傳遞給初始上下文。 比如:
? env.encoding=UTF8
這就會在初始上下文(InitialContext) 實例化時往它的構(gòu)造方法傳遞值
為 UTF8 的 encoding 屬性。
10.mappers 映射器(四種配置) (熟悉)
這里是告訴 mybatis 去哪尋找映射 SQL 的語句??梢允褂妙惵窂街械馁Y源引
用,或者使用字符,輸入確切的 URL 引用。
<!— sqlmapper 配置文件路徑 -->
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
<!—url 絕對路徑形式-->
<mappers>
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
<mapper url="file:///var/mappers/BlogMapper.xml"/>
<mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>
<!—接口 列表配置形式 注解 sql-->
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
<mapper class="org.mybatis.builder.BlogMapper"/>
<mapper class="org.mybatis.builder.PostMapper"/>
</mappers>
<!—映射包下所有接口-->
<mappers>
<package name="com.shsxt.mapper"/>
</mappers>
包掃描條件:
1.同時存在mapper.xml和mapper.java
2.必須在同一個包里面
這些配置會告訴了 MyBatis 去哪里找映射文件,剩下的細節(jié)就應(yīng)該是每個 SQL
映射文
件。
六、 封裝 Dao
新建接口 UserDao 以及對應(yīng)實現(xiàn)類 UserDaoImpl
6.1接口定義:
public interface UserMapper {
public User queryUserById(int id);
}
6.2實現(xiàn)類
public class UserDaoImpl implements UserMapper {
private SqlSessionFactory build;
public UserDaoImpl(SqlSessionFactory build) {
this.build = build;
}
@Override
public User queryUserById(Integer id){
SqlSession session = build.openSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = userMapper.queryUserById(id);
session.close();
return user;
}
6.3測試test
public class UserDaoImplTest {
SqlSessionFactory build;
UserDaoImpl userDao;
@Before
public void init() throws IOException {
InputStream is= Resources.getResourceAsStream("mybatis.xml");
build = new SqlSessionFactoryBuilder().build(is);
userDao = new UserDaoImpl(build);
}
@Test
public void queryUserById() throws Exception {
User user = userDao.queryUserById(6);
System.out.println(user);
}