1.Mybatis
MyBatis 本來是apache的一個(gè)開源軟件iBatis,2010年這一工程由Apache Software Foundation轉(zhuǎn)移到Google Code,而且更名為MyBatis,2013年11月轉(zhuǎn)移到GitHub。它是一款出色的持久層架構(gòu),它支撐自定 SQL、sql語句及其高級投射(ORM),適用XML或是注釋來配制和投射原生態(tài)種類、插口和java的POJO(Plain Old Java Objects,一般傳統(tǒng)的Java目標(biāo))數(shù)據(jù)庫查詢中的紀(jì)錄。。
2.免費(fèi)下載MyBatis
2.1.github
https://github.com/mybatis/mybatis-3/releases
2.2Maven庫房
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
3.新手入門
3.1推動與依靠
選用mavenhttps://search.maven.org/ 查看有關(guān)的推動。
<dependencies>
<!--dependency>
<groupId>org.wyl</groupId>
<artifactId>[the artifact id of the block to be mounted]</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency-->
<!-- mysql推動 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<!-- 融合log4j -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.4</version>
</dependency>
<!-- 檢測junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
右鍵pom.xml->meave 重新加載新項(xiàng)目。包免費(fèi)下載完就可以。
將 mybatis-x.x.x.jar 文檔放置 classpath 中就可以。
3.2.MyBatis的作用構(gòu)架
3.2.1.構(gòu)架
API插口層:給予給外界應(yīng)用的插口API,開發(fā)者根據(jù)這種當(dāng)?shù)谹PI來操作數(shù)據(jù)庫查詢。插口層一接受到啟用要求便會啟用數(shù)據(jù)處理方法層來進(jìn)行主要的數(shù)據(jù)處理方法。
數(shù)據(jù)處理方法層:承擔(dān)主要的SQL搜索、SQL分析、SQL實(shí)行和運(yùn)行結(jié)果投射解決等。它具體的效果是依據(jù)啟用的要求進(jìn)行一次數(shù)據(jù)庫操作。
- 主要參數(shù)投射(主要參數(shù)分析和主要參數(shù)關(guān)聯(lián)):獲得并解析映射文檔中的 Statement標(biāo)識以及特性(parameterType)。也就是分析SQL句子并為 SQL句子提前準(zhǔn)備必須完成關(guān)聯(lián)的主要參數(shù)
- SQL分析:對 Statement【
<select>
、<update>
、<delete>
、<insert>
】標(biāo)識中的具體內(nèi)容開展分析、拼湊、封裝,最終獲得一個(gè)完全的含有占位符的 SQL句子。也就是 JDBC中的提前準(zhǔn)備 SQL句子的全過程 - 結(jié)果投射(結(jié)果集分析和結(jié)果集解決):獲得環(huán)境變量中的結(jié)果集種類,并開展數(shù)據(jù)轉(zhuǎn)換,將ResultSet開展結(jié)果投射。也就是 JDBC中事件處理集的流程。
基本支撐點(diǎn)層:承擔(dān)最根本的作用支撐點(diǎn),包含聯(lián)接管理方法、事務(wù)處理、配備載入和緩存文件解決,這種全是公用的物品,將她們提取出去做為最根本的部件。為頂層的數(shù)據(jù)處理方法層給予最根本的支撐點(diǎn)。
-
管理方法 Mybatis與數(shù)據(jù)庫系統(tǒng)的接口方式
-
管理方法 Mybatis的事務(wù)管理
-
載入 環(huán)境變量
-
Mybatis 查看緩存文件
3.2.2.全局性環(huán)境變量 mybatis-config
<?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標(biāo)識 => 申明MyBatis關(guān)鍵配備 -->
<configuration>
<!-- environments標(biāo)識 => 設(shè)定MyBatis采用的條件信息內(nèi)容 -->
<environments default="development">
<environment >
<!-- transactionManager標(biāo)簽 => 事務(wù)處理 -->
<transactionManager type="JDBC"/> <!-- dataSource標(biāo)識 => 配備數(shù)據(jù)庫特性 -->
<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>
<!--將mapper投射文檔申請注冊到全局性環(huán)境變量中-->
<mappers>
<mapper resource="org/mybatis/example/WylMapper.xml"/>
</mappers>
</configuration>
<?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標(biāo)識 => 申明MyBatis關(guān)鍵配備 -->
<configuration>
<!-- environments標(biāo)識 => 設(shè)定MyBatis采用的條件信息內(nèi)容 -->
<environments default="development">
<environment >
<!-- transactionManager標(biāo)簽 => 事務(wù)處理 -->
<transactionManager type="JDBC"/>
<!-- dataSource標(biāo)識 => 配備數(shù)據(jù)庫特性 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql://localhost:3306/wyl?useSSL=false&useUnicode=true&characterEncoding=utf8&serverTimezone=CST"/>
<property name="username" value="nps"/>
<property name="password" value="123.nps@zst"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mappers/userMapper.xml"/>
</mappers>
</configuration>
3.2.3.SqlSessionFactory 對話加工廠
-
根據(jù)Mybatis的配備信息內(nèi)容,應(yīng)用
SqlSessionFactoryBuilder
搭建器,來搭建對話加工廠目標(biāo) -
SqlSessionFactory 建立了 Configuration目標(biāo),應(yīng)用 Configuration目標(biāo)來搭建SqlSession對話加工廠
-
SqlSessionFactoryBuilder搭建器應(yīng)用了 Builder搭建者策略模式
-
SqlSessionFactory 對話加工廠,應(yīng)用了加工廠策略模式
public class MyBatisUtils { private static SqlSessionFactory sqlSessionFactory; static { try { // 界定XML關(guān)鍵環(huán)境變量途徑信息內(nèi)容 String resource = "mybatis-config.xml"; // 載入XML關(guān)鍵環(huán)境變量途徑信息內(nèi)容 InputStream inputStream = Resources.getResourceAsStream(resource); // 得到創(chuàng)建對象SQLSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } //啟用SqlSessionFactory.openSession()方式 ,回到SqlSession目標(biāo) public static SqlSession getSqlSession(){ return sqlSessionFactory.openSession(); } }
3.2.4.SqlSession插口方式
程序流程根據(jù)SqlSession來使用數(shù)據(jù)庫查詢
- SqlSession對外開放供應(yīng)了一整套的增刪的api,根據(jù)api來使用數(shù)據(jù)庫查詢
- SqlSession還可以獲得動態(tài)性的Mapper插口
- SqlSession的修飾符是方式 等級的,也就是以建立到消毀務(wù)必確保在方式 內(nèi)進(jìn)行,留意一定要在方式 內(nèi)部消毀sqlSession,千萬別忘掉
- sqlSession在采用完后一定要立即關(guān)掉,尤其是在Service層,會在一個(gè)方式 中一起應(yīng)用好幾個(gè)sqlSession,每一個(gè)sqlSession在用完后盡量在下一行編碼就關(guān)掉,防止危害別的sqlSession。
//從 SqlSessionFactory 中獲得 SqlSession
SqlSession sqlSession = MyBatisUtils.getSqlSession();
UsersDao mapper = sqlSession.getMapper(UsersDao.class);
List<Users> usersInfo = mapper.getUsersInfo();
還可以
try (SqlSession session = sqlSessionFactory.openSession()) {
User user = (User) session.selectOne("org.mybatis.example.WylMapper.getUsersById",12);
}
3.2.5.pojo層
相匹配的數(shù)據(jù)庫表的dao層
package com.wyl.mybatis.pojo;
/**
* @創(chuàng)建者 王延領(lǐng)
* @建立時(shí)間 2021/8/16
* 敘述
**/
public class Users {
private int id;
private String username;
private String password;
private String email;
private int gender;
public Users() {
}
public Users(int id, String username, String password, String email, int gender) {
this.id = id;
this.username = username;
this.password = password;
this.email = email;
this.gender = gender;
}
@Override
public String toString() {
return "Users{"
", username='" username '\''
", password='" password '\''
", email='" email '\''
", gender=" gender
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getGender() {
return gender;
}
public void setGender(int gender) {
this.gender = gender;
}
}
迅速轉(zhuǎn)化成構(gòu)造方法get set 等的方式 ,空白右鍵轉(zhuǎn)化成就可以
3.2.6. dao層
與數(shù)據(jù)庫系統(tǒng)互動有關(guān)編碼,相匹配Mybatis的mapper插口
package com.wyl.mybatis.dao;
import com.wyl.mybatis.pojo.Users;
import java.util.List;
import java.util.Map;
/**
* @創(chuàng)建者 王延領(lǐng)
* @建立時(shí)間 2021/8/18
* 敘述
**/
public interface UserDao {
// 【select】全部客戶信息
List<Users> getUsersInfo();
// 【select】特定客戶信息
Users getUserInfoById(int id);
// 【update】特定客戶信息
int updateUseInfoById(Users user);
// 【insert】特定客戶信息
int insertUser(Users user);
// 【delete】特定客戶信息
int deleteUserById(int id);
// 【insert】 大批量客戶信息
int insertManyUseList(List<Users> users);
// 【select】 模糊搜索
List<Users> getUsersInfoByPhantomSelect(String username);
}
3.2.7.mapper
userMapper.xml配備相應(yīng)的數(shù)據(jù)庫操作投射,在mybatis-config開展申請注冊。
<!--如下圖所示配備-->
<mappers>
<mapper resource="mappers/usersMapper.xml"/>
</mappers>
mapper以下。
<?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標(biāo)簽: 【namespace】: 特定dao層,關(guān)聯(lián)Dao -->
<mapper namespace="com.wyl.mybatis.dao.UserDao">
<!-- select sql: 關(guān)聯(lián)getUsersInfo方式 ,回到全部客戶信息【id】: 關(guān)聯(lián)Dao中的方式 名
【resultType】: 特定相匹配【類的方式】回到結(jié)果集的種類 -->
<select resultType="com.wyl.mybatis.pojo.Users">
select * from users
</select>
</mapper>
檢測:
@Test
public void getUsersInfo() {
// 啟用MyBatisUtils.getSqlSession()方式 ,獲得SqlSession目標(biāo)
SqlSession sqlSession = MyBatisUtils.getSqlSession();
// 啟用獲得到的SQLSession目標(biāo)中的getMapper目標(biāo)
// 反射面Dao插口,動態(tài)代理Dao插口中的方式 ,并將這種方式 存有目標(biāo)【mapper】中
UserDao mapper = sqlSession.getMapper(UserDao.class);
// 啟用mapper中相匹配方式 ,并設(shè)定相應(yīng)的目標(biāo)來接受其回到結(jié)果
// 下列為測試標(biāo)準(zhǔn)getUsersInfo() => 獲得全部Users表格中信息內(nèi)容,并且用相匹配類接受
List<Users> usersInfo = mapper.getUsersInfo();
// for循環(huán)解析xml輸出List結(jié)合
for (Users users : usersInfo) {
System.out.println(users);
}
// 關(guān)掉sqlSession
sqlSession.close();
}
3.3.修飾符與生命期
3.3.1.SqlSessionFactoryBuilder
這一類能夠 被創(chuàng)建對象、應(yīng)用和丟掉,一旦建立了 SqlSessionFactory,就不會必須它了。 因而 SqlSessionFactoryBuilder 案例的最好修飾符是方式 修飾符(也就是部分方式 自變量)。 你能器重 SqlSessionFactoryBuilder 來建立好幾個(gè) SqlSessionFactory 案例,但盡量還是不必一直保存著它,以確保任何的 XML 分析資源能夠被施放給更主要的事兒。
3.3.2.SqlSessionFactory
SqlSessionFactory 一旦被建立就應(yīng)當(dāng)在使用的運(yùn)作期內(nèi)一直存有,沒有任何借口丟掉它或再次建立另一個(gè)案例。類似數(shù)據(jù)庫查詢數(shù)據(jù)庫連接池。 應(yīng)用 SqlSessionFactory 的最佳實(shí)踐是在運(yùn)用運(yùn)作期內(nèi)不必反復(fù)建立數(shù)次,數(shù)次復(fù)建 SqlSessionFactory 被視作一種編碼“不良習(xí)慣”。因而 SqlSessionFactory 的最好修飾符是運(yùn)用修飾符。 有很多方式 能夠保證,非常簡單的也是應(yīng)用單例設(shè)計(jì)模式或是靜態(tài)數(shù)據(jù)單例設(shè)計(jì)模式。
3.3.3.SqlSession
每一個(gè)進(jìn)程都需要有它自身的 SqlSession 案例。SqlSession 的案例并不是線程安全的,因而是不可以被共享資源的,因此 它的最合適的修飾符是要求或方式 修飾符。 肯定無法將 SqlSession 案例的引入放到一個(gè)類的靜態(tài)數(shù)據(jù)域,乃至一個(gè)類的實(shí)例變量也不好。 也決不能將 SqlSession 案例的引入放到一切種類的代管修飾符中,例如 Servlet 架構(gòu)中的 HttpSession。 假如現(xiàn)在已經(jīng)應(yīng)用一種 Web 架構(gòu),考慮到將 SqlSession 放到一個(gè)和 HTTP 要求類似的修飾符中。 也就是說,每一次接到 HTTP 要求,就可以開啟一個(gè) SqlSession,回到一個(gè)回應(yīng)后,就關(guān)掉它。 這一關(guān)掉實(shí)際操作很重要,為了更好地保證每一次都能實(shí)行關(guān)掉實(shí)際操作,你應(yīng)該把這個(gè)關(guān)掉實(shí)際操作放進(jìn) finally 塊中。
3.3.4.Mapper
是一種建立的用以關(guān)聯(lián)投射句子的插口,Mapper 插口的例子是用 SqlSession 來得到的。一樣,在技術(shù)上而言,最普遍的 Mapper 案例修飾符像 SqlSession 一樣,應(yīng)用要求修飾符。準(zhǔn)確地說,在方式 被啟用的過程中啟用 Mapper 案例,隨后應(yīng)用后,就全自動消毀掉。不用應(yīng)用確立的銷戶。當(dāng)一個(gè)要求實(shí)行恰當(dāng)準(zhǔn)確的情況下,像 SqlSession 一樣,你能毫不費(fèi)力地操縱這一切。維持簡易性,維持 Mapper 在方式 體修飾符內(nèi)。
4.xml 配備分析
MyBatis 的環(huán)境變量包括了會深深地危害 MyBatis 個(gè)人行為的安裝和特性信息內(nèi)容。 配備文本文檔的高層構(gòu)造以下:
<?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">
<!-- 環(huán)境變量的根原素 -->
<configuration>
<!-- 特性:界定配備外在化 -->
<properties></properties>
<!-- 設(shè)定:界定mybatis的一些全面性設(shè)定 -->
<settings>
<!-- 實(shí)際的主要參數(shù)名和變量值 -->
<setting name="" value=""/>
</settings>
<!-- 種類名字:為一些類界定別稱 -->
<typeAliases></typeAliases>
<!-- 種類CPU:界定Java類型與數(shù)據(jù)表中的基本數(shù)據(jù)類型中間的轉(zhuǎn)化關(guān)聯(lián) -->
<typeHandlers></typeHandlers>
<!-- 目標(biāo)加工廠 -->
<objectFactory type=""></objectFactory>
<!-- 軟件:mybatis的軟件,軟件能夠 改動mybatis的內(nèi)部運(yùn)作標(biāo)準(zhǔn) -->
<plugins>
<plugin interceptor=""></plugin>
</plugins>
<!-- 自然環(huán)境:配備mybatis的自然環(huán)境 -->
<environments default="">
<!-- 系統(tǒng)變量:能夠 配備好幾個(gè)系統(tǒng)變量,例如應(yīng)用多數(shù)據(jù)庫時(shí),就必須配備好幾個(gè)系統(tǒng)變量 -->
<environment >
<!-- 事務(wù)管理管理工具 -->
<transactionManager type=""></transactionManager>
<!-- 數(shù)據(jù)庫 -->
<dataSource type=""></dataSource>
</environment>
</environments>
<!-- 數(shù)據(jù)庫查詢生產(chǎn)商標(biāo)志 -->
<databaseIdProvider type=""></databaseIdProvider>
<!-- 映射器:特定投射文檔或是投射類 -->
<mappers></mappers>
</configuration>
? 照片來源于官方網(wǎng)站
4.1.特性(properties)
這種特性能夠在外界開展配備,并能夠?qū)崿F(xiàn)動態(tài)性更換。你既能夠在常見的 Java 特性文檔中配備這種特性,還可以在 properties 原素的子原素中設(shè)定.
例如第三章的環(huán)境變量我們可以以下書寫
<!-- properties標(biāo)識 => 載入外界properties文件 -->
<properties resource="dataSource.properties">
<property name="username" value="root"/>
<property name="password" value="123"/>
</properties>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
這一事例中的username和password可能由properties元素中設(shè)定的相對應(yīng)值來更換。driver和url特性可能由dataSource.properties文件中相對應(yīng)的值來更換。那樣就為配備給予了眾多靈便挑選。
特性還可以被傳送到SqlSessionBuilder.build()方式 中。
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, props);
// ... or ...
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment, props);
可是,這也就涉及到到優(yōu)先的難題,假如特性不只在一個(gè)地區(qū)配備,那麼mybatis可能依照接下來的次序來載入:
1.在properties元素身體特定的特性最先被載入。
- 隨后依據(jù)properties元素中的resource特性載入類途徑下特性文檔或依據(jù)url特性特定的途徑載入特性文檔,并遮蓋已載入的同名的特性。
- 最終載入做為方式 參數(shù)傳遞的特性,并遮蓋已載入的同名的特性。
根據(jù)方式 參數(shù)傳遞的特性具備最大優(yōu)先,resource/url 特性中規(guī)定的環(huán)境變量其次,最低優(yōu)先級隊(duì)列的則是 properties 原素中規(guī)定的特性
從 MyBatis 3.4.2 逐漸,你能為占位符特定一個(gè)初始值。比如:
<dataSource type="POOLED">
<!-- ... -->
<property name="username" value="${username:ut_user}"/> <!-- 假如特性 'username' 沒有被配備,'username' 特性的值將為 'ut_user' -->
</dataSource>
這一特點(diǎn)默認(rèn)設(shè)置 是關(guān)掉的。要開啟這一特點(diǎn),必須加上一個(gè)特殊的特性來打開這一特點(diǎn)。比如:
<properties resource="org/mybatis/example/config.properties">
<!-- ... -->
<property name="org.apache.ibatis.parsing.PropertyParser.enable-default-value" value="true"/> <!-- 開啟初始值特點(diǎn) -->
</properties>
4.2.設(shè)定(settings)
一個(gè)配備詳細(xì)的 settings 原素的實(shí)例以下:
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="false"/>
<setting name="autoMappingBehavior" value="PARTIAL"/>
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25"/>
<setting name="defaultFetchSize" value="100"/>
<setting name="safeRowBoundsEnabled" value="false"/>
<setting name="mapUnderscoreToCamelCase" value="false"/>
<setting name="localCacheScope" value="SESSION"/>
<setting name="jdbcTypeForNull" value="OTHER"/>
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
這也是 MyBatis 中極其重要的更改設(shè)定,他們會更改 MyBatis 的運(yùn)作時(shí)個(gè)人行為。 下表敘述了設(shè)定中各類設(shè)定的含意、初始值等。
設(shè)定名 | 敘述 | 有效值 | 初始值 |
---|---|---|---|
cacheEnabled | 全面性地打開或關(guān)上全部映射器環(huán)境變量中已配制的一切緩存文件。 | true | false | true |
lazyLoadingEnabled | 延遲時(shí)間載入的全局性電源開關(guān)。當(dāng)打開時(shí),全部關(guān)系目標(biāo)都是會延遲時(shí)間載入。 特殊關(guān)聯(lián)性中可根據(jù)設(shè)定 fetchType 特性來遮蓋此項(xiàng)的按鈕情況。 |
true | false | false |
aggressiveLazyLoading | 打開時(shí),任一方式 的啟用都是會載入該目標(biāo)的全部延遲時(shí)間載入特性。 不然,每一個(gè)延遲時(shí)間載入特性會按需載入(參照 lazyLoadTriggerMethods )。 |
true | false | false (在 3.4.1 及以前的新版本中默認(rèn)設(shè)置 為 true) |
multipleResultSetsEnabled | 是不是容許單獨(dú)句子回到多結(jié)果集(必須數(shù)據(jù)庫查詢推動適用)。 | true | false | true |
useColumnLabel | 應(yīng)用列標(biāo)識替代字段名。具體主要表現(xiàn)取決于數(shù)據(jù)庫查詢推動,實(shí)際可參照數(shù)據(jù)庫查詢推動的有關(guān)文本文檔,或根據(jù)比照檢測來觀察。 | true | false | true |
useGeneratedKeys | 容許 JDBC 適用自動生成外鍵約束,必須數(shù)據(jù)庫查詢推動適用。假如設(shè)定為 true,將強(qiáng)制性應(yīng)用自動生成外鍵約束。雖然一些數(shù)據(jù)庫查詢推動不兼容此特點(diǎn),但仍可一切正常工作中(如 Derby)。 | true | false | False |
autoMappingBehavior | 特定 MyBatis 應(yīng)怎樣全自動投射列到字段名或特性。 NONE 表明關(guān)掉全自動投射;PARTIAL 只能全自動投射沒有界定嵌入結(jié)果投射的字段名。 FULL 會全自動投射一切繁雜的結(jié)果集(不管是不是嵌入)。 | NONE, PARTIAL, FULL | PARTIAL |
autoMappingUnknownColumnBehavior | 特定發(fā)覺全自動投射總體目標(biāo)不明列(或不明特性種類)的個(gè)人行為。NONE : 不做一切反映WARNING : 輸出警示日志('org.apache.ibatis.session.AutoMappingUnknownColumnBehavior' 的日志級別務(wù)必設(shè)定為 WARN )FAILING : 投射不成功 (拋出去 SqlSessionException ) |
NONE, WARNING, FAILING | NONE |
defaultExecutorType | 配備默認(rèn)設(shè)置 的電動執(zhí)行機(jī)構(gòu)。SIMPLE 便是一般的電動執(zhí)行機(jī)構(gòu);REUSE 電動執(zhí)行機(jī)構(gòu)會器重預(yù)備處理句子(PreparedStatement); BATCH 電動執(zhí)行機(jī)構(gòu)不但器重句子還會繼續(xù)實(shí)行批量更新。 | SIMPLE REUSE BATCH | SIMPLE |
defaultStatementTimeout | 設(shè)定請求超時(shí)時(shí)間,它決策數(shù)據(jù)庫查詢推動等候數(shù)據(jù)庫查詢回應(yīng)的分秒。 | 隨意整數(shù) | 未設(shè)定 (null) |
defaultFetchSize | 為推動的結(jié)果集獲得總數(shù)(fetchSize)設(shè)定一個(gè)提議值。此參數(shù)只能夠在查看設(shè)定中被遮蓋。 | 隨意整數(shù) | 未設(shè)定 (null) |
defaultResultSetType | 特定句子默認(rèn)設(shè)置 的翻轉(zhuǎn)對策。(增加于 3.5.2) | FORWARD_ONLY | SCROLL_SENSITIVE | SCROLL_INSENSITIVE | DEFAULT(相當(dāng)于未設(shè)定) | 未設(shè)定 (null) |
safeRowBoundsEnabled | 是不是可以在嵌入句子中應(yīng)用分頁查詢(RowBounds)。假如容許應(yīng)用則設(shè)定為 false。 | true | false | False |
safeResultHandlerEnabled | 是不是可以在嵌入句子中應(yīng)用結(jié)果CPU(ResultHandler)。假如容許應(yīng)用則設(shè)定為 false。 | true | false | True |
mapUnderscoreToCamelCase | 是不是打開駝峰命名全自動投射,即從經(jīng)典數(shù)據(jù)庫查詢字段名 A_COLUMN 投射到經(jīng)典 Java 特性名 aColumn。 | true | false | False |
localCacheScope | MyBatis 運(yùn)用當(dāng)?shù)鼐彺嫖募w制(Local Cache)避免循環(huán)引用和加快反復(fù)的嵌入查看。 初始值為 SESSION,會緩存文件一個(gè)對話中實(shí)行的任何查看。 若設(shè)定數(shù)值 STATEMENT,當(dāng)?shù)鼐彺嫖募H用以實(shí)行句子,對同樣 SqlSession 的不一樣查看將不容易開展緩存文件。 | SESSION | STATEMENT | SESSION |
jdbcTypeForNull | 當(dāng)沒有為主要參數(shù)特定相應(yīng)的 JDBC 種類時(shí),空值的默認(rèn)設(shè)置 JDBC 種類。 一些數(shù)據(jù)庫查詢推動必須特定列的 JDBC 種類,大部分狀況立即用一般種類就可以,例如 NULL、VARCHAR 或 OTHER。 | JdbcType 變量定義,常見值:NULL、VARCHAR 或 OTHER。 | OTHER |
lazyLoadTriggerMethods | 特定目標(biāo)的那些方式 開啟一次延遲時(shí)間載入。 | 用分號隔開的方式 目錄。 | equals,clone,hashCode,toString |
defaultScriptingLanguage | 特定動態(tài)性 SQL 轉(zhuǎn)化成應(yīng)用的默認(rèn)設(shè)置 開發(fā)語言。 | 一個(gè)種類別稱或全限制類名。 | org.apache.ibatis.scripting.xmltags.XMLLanguageDriver |
defaultEnumTypeHandler | 特定 Enum 應(yīng)用的默認(rèn)設(shè)置 TypeHandler 。(增加于 3.4.5) |
一個(gè)種類別稱或全限制類名。 | org.apache.ibatis.type.EnumTypeHandler |
callSettersOnNulls | 特定當(dāng)結(jié)果集中化數(shù)值 null 的情況下是不是啟用投射目標(biāo)的 setter(map 目標(biāo)時(shí)為 put)方式 ,這在取決于 Map.keySet() 或 null 值開展復(fù)位時(shí)非常有效。留意基本上種類(int、boolean 等)是不可以設(shè)成 null 的。 | true | false | false |
returnInstanceForEmptyRow | 當(dāng)回到行的全部列全是空時(shí),MyBatis默認(rèn)設(shè)置 回到 null 。 當(dāng)打開這一設(shè)定時(shí),MyBatis會回到一個(gè)空案例。 一定要注意,它也適用嵌入的結(jié)果集(如結(jié)合或關(guān)系)。(增加于 3.4.2) |
true | false | false |
logPrefix | 特定 MyBatis 提升到日志名字的作為前綴。 | 一切字符串?dāng)?shù)組 | 未設(shè)定 |
logImpl | 特定 MyBatis 常用日志的主要完成,未找到時(shí)將全自動搜索。 | SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING | 未設(shè)定 |
proxyFactory | 特定 Mybatis 建立可延遲時(shí)間載入目標(biāo)常用到的代理工具。 | CGLIB | JAVASSIST | JAVASSIST (MyBatis 3.3 之上) |
vfsImpl | 特定 VFS 的完成 | 自定 VFS 的完成的類全限制名,以分號隔開。 | 未設(shè)定 |
useActualParamName | 容許操作方法簽字中的名字做為句子主要參數(shù)名字。 為了更好地應(yīng)用該特點(diǎn),你的工程項(xiàng)目務(wù)必選用 Java 8 編譯程序,而且再加上 -parameters 選擇項(xiàng)。(增加于 3.4.1) |
true | false | true |
configurationFactory | 特定一個(gè)給予 Configuration 案例的類。 這一被回到的 Configuration 案例用于載入被反序列化目標(biāo)的延時(shí)載入特性值。 這一類務(wù)必包括一個(gè)簽字為static Configuration getConfiguration() 的方式 。(增加于 3.2.3) |
一個(gè)種類別稱或徹底限制類名。 | 未設(shè)定 |
shrinkWhitespacesInSql | 從SQL中刪掉不必要的空格字符。一定要注意,這也會危害SQL中的文本字符串?dāng)?shù)組。 (增加于 3.5.5) | true | false | false |
defaultSqlProviderType | Specifies an sql provider class that holds provider method (Since 3.5.6). This class apply to the type (or value ) attribute on sql provider annotation(e.g. @SelectProvider ), when these attribute was omitted. |
A type alias or fully qualified class name | Not set |
4.3.種類別稱(typeAliases)
種類別稱能為 Java 種類設(shè)定一個(gè)簡稱名稱。 它僅用以 XML 配備,借以減少沉余的全限制類名撰寫。
<typeAlias alias="user" type="com.wyl.mybatis.pojo.Users"></typeAlias>
? 當(dāng)那樣配備時(shí),user
可以用在任意應(yīng)用 com.wyl.mybatis.pojo.Users
的地區(qū)。
在應(yīng)用注釋的情況下還可以特定一個(gè)包名,再應(yīng)用其類的情況下立即小寫字母類名就可以。.例如:
<!--除非是應(yīng)用注釋,不然不兼容自定別稱-->
<package name="com.wyl.mybatis.dao"/>
4.4.映射器(mappers)
界定SQL投射句子,特定MyBatis找尋SQL句子。
-
-
應(yīng)用相對性于類途徑的資源引入 【強(qiáng)烈推薦】:
<mappers> <mapper resource="mappers/userMapper.xml"/> </mappers>
-
應(yīng)用映射器插口完成類的徹底限制類名
<mappers> <mapper class="com.wyl.mybatis.dao.UsersDao"/> </mappers>
-
將包內(nèi)的映射器插口完成所有申請注冊為映射器(留意相對位置)
<mappers> <package name="com.wyl.mybatis.dao"/> </mappers>
-
應(yīng)用徹底限制資源精準(zhǔn)定位符(URL) 【不建議應(yīng)用】
<mappers> <mapper url="file:///var/mappers/usersMapper.xml"/> </mappers>
-
4.5.自然環(huán)境配備(environments)
MyBatis 能夠 配制成融入各種自然環(huán)境,這類體制有利于將 SQL 投射運(yùn)用于多種多樣數(shù)據(jù)庫查詢當(dāng)中, 現(xiàn)實(shí)狀況下有多種多樣原因必須如此做。比如,開發(fā)設(shè)計(jì)、檢測和工作環(huán)境必須有不一樣的配備;或是想在有著同樣 Schema 的好幾個(gè)生產(chǎn)制造數(shù)據(jù)庫查詢中運(yùn)用一樣的 SQL 投射。也有很多相似的應(yīng)用情景。
但是要記牢:雖然能夠 配備好幾個(gè)自然環(huán)境,但每一個(gè) SqlSessionFactory 案例只有挑選一種自然環(huán)境。
因此 ,假如想要聯(lián)接2個(gè)數(shù)據(jù)庫查詢,就必須建立2個(gè) SqlSessionFactory 案例,每一個(gè)數(shù)據(jù)庫查詢相匹配一個(gè)。
<environments default="oracle">
<environment >
<!--mysql 配備-->
</environment>
<environment >
<!--oracle 配備-->
</environment>
</environments>
4.6.事務(wù)管理管理工具(transactionManager)
在 MyBatis 中有這兩種類別的事務(wù)管理管理工具(也就是 type="[JDBC|MANAGED]"):
在 MyBatis 中有這兩種類別的事務(wù)管理管理工具(也就是 type="[JDBC|MANAGED]"):
-
JDBC – 這一配備立即采用了 JDBC 的遞交和回退設(shè)備,它依靠從數(shù)據(jù)庫得到的接入來管理方法事務(wù)管理修飾符。
-
MANAGED – 這一配備基本上沒干什么。它從來不遞交或回退一個(gè)聯(lián)接,只是讓器皿來管理方法業(yè)務(wù)的全部生命期(例如 JEE 網(wǎng)站服務(wù)器的前后文)。 默認(rèn)設(shè)置 狀況下它會關(guān)掉聯(lián)接。殊不知一些器皿并不期待聯(lián)接被關(guān)掉,因而必須將 closeConnection 特性設(shè)定為 false 來阻攔默認(rèn)設(shè)置 的關(guān)掉個(gè)人行為。比如:
<transactionManager type="MANAGED"> <property name="closeConnection" value="false"/> </transactionManager>
提醒 假如你已經(jīng)應(yīng)用 Spring MyBatis,則沒有必需配備事務(wù)管理管理工具,由于 Spring 控制模塊會應(yīng)用內(nèi)置的管理工具來遮蓋之前的配備。
這二種事務(wù)管理管理工具種類都不用安裝一切特性。他們實(shí)際上是種類別稱,也就是說,你能用 TransactionFactory 插口完成類的全限制名或種類別稱替代他們。
public interface TransactionFactory {
default void setProperties(Properties props) { // 從 3.5.2 逐漸,該辦法為默認(rèn)設(shè)置 方式
// 空完成
}
Transaction newTransaction(Connection conn);
Transaction newTransaction(DataSource dataSource, TransactionIsolationLevel level, boolean autoCommit);
}
在事務(wù)管理管理工具創(chuàng)建對象后,全部在 XML 中配備的特性可能被傳送給 setProperties() 方式 。你的建立還必須建立一個(gè) Transaction 插口的建立類,這一插口也非常簡單:
public interface Transaction {
Connection getConnection() throws SQLException;
void commit() throws SQLException;
void rollback() throws SQLException;
void close() throws SQLException;
Integer getTimeout() throws SQLException;
}
應(yīng)用這兩個(gè)插口,你能徹底自定 MyBatis 對業(yè)務(wù)的解決。
4.7.數(shù)據(jù)庫(dataSource)
-
【官方網(wǎng)申明】:dataSource 原素應(yīng)用規(guī)范的 JDBC 數(shù)據(jù)庫插口來配備 JDBC 聯(lián)接的對象的資源。
-
【官方網(wǎng)申明】:大部分 MyBatis 應(yīng)用軟件會按實(shí)例中的事例來配備數(shù)據(jù)庫。盡管數(shù)據(jù)庫配備是可選擇的,但假如要開啟延遲時(shí)間載入特點(diǎn),就需要配備數(shù)據(jù)庫。
-
【官方網(wǎng)申明】:有三種內(nèi)建的數(shù)據(jù)庫種類(也就是 type="[UNPOOLED|POOLED|JNDI]")
- UNPOOLED– 這一數(shù)據(jù)庫的建立會每一次要求時(shí)開啟和關(guān)掉聯(lián)接。盡管有點(diǎn)兒慢,但對這些連接數(shù)據(jù)庫易用性規(guī)定不太高的簡易應(yīng)用軟件而言,是一個(gè)非常好的挑選。 特性主要表現(xiàn)則取決于應(yīng)用的數(shù)據(jù)庫查詢,對一些數(shù)據(jù)庫查詢而言,應(yīng)用數(shù)據(jù)庫連接池并不重要,這一配備就很適用這類情況。
- POOLED– 這類數(shù)據(jù)庫的完成運(yùn)用“池”的定義將 JDBC 聯(lián)接目標(biāo)機(jī)構(gòu)起來,防止了建立新的聯(lián)接案例時(shí)需需要的復(fù)位和驗(yàn)證時(shí)間。 這類處理方法很時(shí)興,能使高并發(fā) Web 運(yùn)用快速響應(yīng)要求。
- JNDI – 這一數(shù)據(jù)庫完成是因?yàn)槟茉谌?EJB 或網(wǎng)站服務(wù)器這類器皿中應(yīng)用,器皿能夠 集中化或在外界配備數(shù)據(jù)庫,隨后置放一個(gè) JNDI 前后文的數(shù)據(jù)庫引入。
-
MyBatis默認(rèn)設(shè)置 數(shù)據(jù)庫種類 => 【POOLED】
-
數(shù)據(jù)庫種類: dbcp c3p0 druid hikari
4.8.目標(biāo)加工廠(objectFactory)
MyBatis 每一次建立結(jié)果目標(biāo)的新案例時(shí),它都是會應(yīng)用一個(gè)目標(biāo)加工廠(ObjectFactory)案例來進(jìn)行。 默認(rèn)設(shè)置 的目標(biāo)加工廠必須做的只是是創(chuàng)建對象總體目標(biāo)類,要不根據(jù)默認(rèn)設(shè)置 構(gòu)造函數(shù),要不在主要參數(shù)投射存有的情況下根據(jù)主要參數(shù)構(gòu)造函數(shù)來創(chuàng)建對象。 假如想遮蓋目標(biāo)加工廠的默認(rèn)設(shè)置 個(gè)人行為,則還可以利用建立自身的目標(biāo)加工廠來完成.
自定目標(biāo)加工廠
ObjectFactory是個(gè)接口類,其默認(rèn)設(shè)置 完成類是DefaultObjectFactory。在 MyBatis 中,默認(rèn)設(shè)置 的DefaultObjectFactory要做的便是創(chuàng)建對象查看結(jié)果相對應(yīng)的總體目標(biāo)類,有倆種方法能夠 將查找結(jié)果顯示的值鏡像到相匹配的總體目標(biāo)類:一種是根據(jù)總體目標(biāo)類的默認(rèn)設(shè)置 構(gòu)造函數(shù),此外一種便是根據(jù)總體目標(biāo)類的有參構(gòu)造函數(shù)。
4.8.1.自定目標(biāo)加工廠
MyBatis容許申請注冊自定的ObjectFactory,只須要完成插口 org.apache.ibatis.reflection.factory.ObjectFactory就可以??墒窃诮^大多數(shù)的情形下,大家都不用自定ObjectFactory目標(biāo)加工廠,只必須承繼系統(tǒng)軟件早已完成好的 DefaultObjectFactory ,根據(jù)一定的改變來結(jié)束大家所須要的工作中。
有時(shí)在新創(chuàng)建一個(gè)新目標(biāo)(構(gòu)造函數(shù)或是有參構(gòu)造函數(shù)),在獲得目標(biāo)以前必須解決一些邏輯性,或是在實(shí)行此類的有參構(gòu)造函數(shù)時(shí),在傳到主要參數(shù)以前,要對主要參數(shù)開展一些解決,這時(shí)候就可以建立自身的 ObjectFactory 來載入該種類的目標(biāo)。以下所顯示,提升了日志打印出作用:
public class MyObjectFactory extends DefaultObjectFactory
{
private static final long serialVersionUID = 1L;
Logger log = Logger.getLogger(MyObjectFactory.class);
private Object temp = null;
@Override
public void setProperties(Properties properties)
{
super.setProperties(properties);
}
@Override
public <T> T create(Class<T> type)
{
T result = super.create(type);
log.info("創(chuàng)建對象:" result.toString());
return result;
}
@Override
public <T> T create(Class<T> type, List<Class<?>> constructorArgTypes, List<Object> constructorArgs)
{
T result = super.create(type, constructorArgTypes, constructorArgs);
log.info("創(chuàng)建對象:" result.toString());
return result;
}
@Override
public <T> boolean isCollection(Class<T> type)
{
return super.isCollection(type);
}
隨后,必須 在 SqlMapConfig.xml 全局性環(huán)境變量中配備該自定目標(biāo)加工廠就可以,編碼以下:
<objectFactory type="cn.mybatis.mydemo.MyObjectFactory">
<property name="key" value="value" />
</objectFactory>
那樣 MyBatis 便會選用配備的 MyObjectFactory 來轉(zhuǎn)化成結(jié)果集目標(biāo),選用下邊的源代碼開展檢測。
public class MyBatisDemo
{
public static void main(String[] args) throws IOException
{
Logger log = Logger.getLogger(MyBatisDemo.class);
InputStream config = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(config);
SqlSession session = factory .openSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = userMapper.getUser(1L);
}
}
4.9.軟件
4.9.1.軟件的歸類
第一類:軟件是系統(tǒng)的一種填補(bǔ),比如在分布式架構(gòu)中,能夠應(yīng)用軟件的方法,完成運(yùn)行內(nèi)存軟件、硬盤軟件、線性網(wǎng)絡(luò)軟件、Paxos軟件等。該類軟件相當(dāng)于部件。
第二類:軟件是系統(tǒng)對默認(rèn)設(shè)置 作用的定制改動,比如mybatis里邊自定軟件,它完成的攔截器的作用。該類軟件相當(dāng)于攔截器。
4.9.2.MyBatis攔截器軟件
MyBatis容許客戶在已投射句子實(shí)行流程中的某一點(diǎn)開展阻攔啟用。MyBatis應(yīng)用軟件來阻攔的方式啟用,因此MyBatis軟件一般 稱之為:Mybatis攔截器。默認(rèn)設(shè)置 狀況下,MyBatis容許應(yīng)用軟件來阻攔的目標(biāo)包含接下來的四大金剛:
- Executor:MyBatis的電動執(zhí)行機(jī)構(gòu),用以實(shí)行增刪實(shí)際操作
- ParameterHandler:解決SQL的主要參數(shù)目標(biāo)
- ResultSetHandler:解決SQL的回到結(jié)果集
- StatementHandler:數(shù)據(jù)庫查詢的解決目標(biāo),用以實(shí)行SQL句子
在Java里邊,大家想阻攔某一目標(biāo),只須要把這個(gè)目標(biāo)包裝一下,用編碼行語而言,便是再次轉(zhuǎn)化成一個(gè)代理商目標(biāo)。
4.9.2.注釋案例
@Intercepts({
@Signature(
type=Executor.class,
method="query",
args={MappedStatement.class,Object.class,RowBounds.class,ResultHandler.class}
)
})
public class MyInterceptor implements Interceptor {
public Object intercept(Invocation invocation) throws Throwable {
return invocation.proceed();
}
public Object plugin(Object target) {
return Plugin.wrap(target,this);
}
public void setProperties(Properties arg0) {}
@Intercepts 攔截器注釋,此注釋申明該類是一個(gè)軟件類。在其中能夠 申明好幾個(gè) @Signature 簽字信息內(nèi)容注釋,type 為阻攔的方式 隸屬的接口方式,method 為阻攔的方式 名字,args 是基本參數(shù)。
intercept 方式 是一個(gè)對總體目標(biāo)方式 開展阻攔的抽象方法,而 plugin 方式 的效果是將攔截器插進(jìn)總體目標(biāo)目標(biāo)。
setProperties 方式 的效果是將全局性環(huán)境變量中的主要參數(shù)引入軟件類中。
MyBatis 全局性環(huán)境變量中配備該軟件就可以
<plugins>
<plugin interceptor="com.wyl.mybatis.unit.MyInterceptor"></plugin>
</plugins>
4.10.typeHandlers(種類CPU)
在JDBC中,必須 在PreparedStatement目標(biāo)中設(shè)定這些早已預(yù)編譯過的SQlL句子的主要參數(shù)。實(shí)行SQL后,會根據(jù)ResultSet目標(biāo)獲得獲得數(shù)據(jù)庫查詢的數(shù)據(jù)信息,而那些在Mybatis是依據(jù)信息的種類根據(jù)typeHandler來完成的。
在typeHandler中,分成jdbcType和javatype,在其中jdbcType用以界定數(shù)據(jù)庫類型,而javaType用以界定Java類型,那麼typeHandler的效果便是擔(dān)負(fù)jdbcTypr和javaType中間的互相變換。
和別稱一樣,在 MyBatis 中存有系統(tǒng)軟件界定 typeHandler 和自定 typeHandler。MyBatis 會依據(jù) javaType 和數(shù)據(jù)表的 jdbcType 來取決于選用哪一個(gè) typeHandler 解決這種轉(zhuǎn)換方法。系統(tǒng)軟件給予的 typeHandler 能遮蓋絕大多數(shù)情景的規(guī)定,可是很多狀況下是遠(yuǎn)遠(yuǎn)不夠的,例如大家有獨(dú)特的轉(zhuǎn)換方法,枚舉類就這樣。
4.10.1.系統(tǒng)軟件界定的typeHandler
這種便是MyBatis 系統(tǒng)軟件早已構(gòu)建好的typeHandler。在絕大多數(shù)的情形下不必顯式地申明jdbcType 和javaType ,或是用typeHandler 去特定相應(yīng)的typeHandler 來完成數(shù)據(jù)信息數(shù)據(jù)轉(zhuǎn)換,由于MyBatis 系統(tǒng)軟件會自身檢測。有時(shí)必須改動一些轉(zhuǎn)換方法,例如枚舉類通常須要自身去撰寫標(biāo)準(zhǔn)。
public interface TypeHandler<T> {
// 應(yīng)用typeHandler根據(jù)PreparedStatement目標(biāo)開展設(shè)定SQL主要參數(shù)的過程中采用的具體做法。在其中:ps是PreparedStatement目標(biāo);i是主要參數(shù)在SQL句子中的字符;jdbcType是數(shù)據(jù)庫類型
void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException;
//JDBC結(jié)果集中化讀取數(shù)據(jù)開展變換,應(yīng)用字段名(columnName)或字符(columeIdex)獲得數(shù)據(jù)庫查詢的數(shù)據(jù)信息
T getResult(ResultSet rs, String columnName) throws SQLException;
T getResult(ResultSet rs, int columnIndex) throws SQLException;
//sql語句專用型
T getResult(CallableStatement cs, int columnIndex) throws SQLException;
}
4.10.2.自定TypeHandler
從系統(tǒng)軟件界定的typeHandler中能夠 了解,要完成typeHandler就必須去完成插口Typehandler,或是承繼BaseTypeHandler(事實(shí)上,BaseTypehandler完成了typeHandler插口)
完成TypeHandler
public class MyTypeHandler implements TypeHandler<String>{
//界定一個(gè)日志
Logger log = Logger.getLogger(MyTypeHandler.class);
@Override
public String getResult(ResultSet rs, String columnName) throws SQLException {
String result = rs.getString(columnName);
log.info("載入string主要參數(shù)1【" result "】");
return result;
}
@Override
public String getResult(ResultSet rs, int columnIdex) throws SQLException {
String result = rs.getString(columnIdex);
log.info("載入string主要參數(shù)2【" result "】");
return result;
}
@Override
public String getResult(CallableStatement cs, int columnIdex) throws SQLException {
String result = cs.getString(columnIdex);
log.info("載入string主要參數(shù)3【" result "】");
return result;
}
@Override
public void setParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
log.info("設(shè)定string主要參數(shù)【" parameter "】");
ps.setString(i, parameter);
}
}
在源代碼中應(yīng)用自定typeHandler
<!-- 種類轉(zhuǎn)化器 -->
<typeHandlers>
<typeHandler handler="com.wyl.mybatis.utils.MyTypeHandler" jdbcType="VARCHAR" javaType="string"/>
</typeHandlers>
or
<resultMap type="role">
<result property="id" column="id"/>
<result property="roleName" column="role_name" jdbcType="VARCHAR" javaType="string"/>
<result property="note" column="note" typeHandler="com.wyl.mybatis.utils.MyTypeHandler"/>
</resultMap>
<select parameterType="long" resultMap="roleMapper">
select id,role_name,note from t_role where id = #{id}
</select>
有時(shí)配備的typeHandler過多,還可以應(yīng)用包掃描儀的方法
<typeHandlers>
<package name="com.wyl.mybatis.unit.typeHandler"/>
</typeHandlers>
@MappedJdbcTypes(JdbcType.VARCHAR) // 表明把數(shù)據(jù)庫查詢中的varchar種類轉(zhuǎn)為java的String種類時(shí)應(yīng)用該轉(zhuǎn)化器
@MappedTypes(String.class)
public class MyTypeHandler implements TypeHandler<String>{
Logger logger = Logger.getLogger(MyTypeHandler.class);
@Override
public String getResult(ResultSet rs, String columnName) throws SQLException {
String result = rs.getString(columnName);
logger.info("載入string主要參數(shù)1【" result "】");
return result;
}
@Override
public String getResult(ResultSet rs, int columnIndex) throws SQLException {
String result = rs.getString(columnIndex);
logger.info("載入string主要參數(shù)2【" result "】");
return result;
}
@Override
public String getResult(CallableStatement cs, int columnIndex) throws SQLException {
String result = cs.getString(columnIndex);
logger.info("載入string主要參數(shù)3【" result "】");
return result;
}
@Override
public void setParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
logger.info("設(shè)定string主要參數(shù)【" parameter "】");
ps.setString(i, parameter);
}
}
4.10.3.枚舉類型TypeHandler
在大部分狀況下,typeHandler 由于枚舉類型而應(yīng)用,MyBatis 早已界定了2個(gè)類做為枚舉類型的適用,這兩個(gè)類分別是:
-
EnumOrdinalTypeHandler。應(yīng)用整數(shù)金額字符做為參數(shù)傳遞的(枚舉類型的默認(rèn)設(shè)置 變換類)
<resultMap type="user"> <result property="id" column="id" /> <result property="userName" column="user_name" /> <result property="password" column="passsword" /> <result property="sex" column="sex" typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler" /> </resultMap> <select resultMap="userMapper" parameterType="long"> select id,user_name,password,sex,mobile,tel,email,note from myUser where id=#{id} </select>
-
EnumTypeHandler。應(yīng)用枚舉類型字符串?dāng)?shù)組名字做為參數(shù)傳遞的
<resultMap type="com.mybatis.po.User"> <result property="id" column="id" /> <result property="userName" column="user_name" /> <result property="password" column="passsword" /> <result property="sex" column="sex" typeHandler="org.apache.ibatis.type.EnumTypeHandler" /> </resultMap> <select resultMap="userMapper" parameterType="long"> select id,user_name,password,sex,mobile,tel,email,note from myUser where id=#{id} </select>
4.10.4.BlobTypeHandler載入Blob字段名
MyBatis 對數(shù)據(jù)庫查詢的 Blob 字段名也開展了適用,它給予了一個(gè) BlobTypeHandler,為了更好地應(yīng)付越來越多的情景,它還帶來了 ByteArrayTypeHandler,僅僅它不太常見.
create table file(
id int(12) not null auto_increment,
content blob not null,
primary key(id)
);
//pojo
public class TestFile{
long id;
byte[] content;
/** setter and getter **/
}
<resultMap type="com.ssm.chapter5.pojo.TestFile" >
<id column="id" property="id"/>
<id column="content" property="content" typeHandler="org.apache.ibatis.type.BlobTypeHandler"/>
</resultMap>
4.11.數(shù)據(jù)庫查詢生產(chǎn)商標(biāo)志(databaseIdProvider)
MyBatis 能夠 按照不一樣的數(shù)據(jù)庫查詢生產(chǎn)商實(shí)行不一樣的句子,這類多生產(chǎn)商的適用是根據(jù)投射句子中的
databaseId
特性。 MyBatis 會載入含有配對當(dāng)今數(shù)據(jù)庫查詢databaseId
特性和全部沒有databaseId
特性的句子。 假如與此同時(shí)尋找含有databaseId
和沒有databaseId
的同樣句子,則后面一種會被放棄。 為適用多生產(chǎn)商特點(diǎn),只需像下邊那樣在 mybatis-config.xml 文檔中添加databaseIdProvider
就可以:
<databaseIdProvider type="DB_VENDOR" />
databaseIdProvider 相匹配的 DB_VENDOR 完成會將 databaseId 設(shè)定為 DatabaseMetaData#getDatabaseProductName()
回到的字符串?dāng)?shù)組。 因?yàn)橐话銧顩r下這種字符串?dāng)?shù)組都特別長,并且同樣設(shè)備的不一樣版本號會回到不一樣的值,你也許想根據(jù)設(shè)定特性別稱來使其減短:
<databaseIdProvider type="DB_VENDOR">
<property name="SQL Server" value="sqlserver"/>
<property name="DB2" value="db2"/>
<property name="Oracle" value="oracle" />
</databaseIdProvider>
在保證了特性別稱時(shí),databaseIdProvider 的 DB_VENDOR 完成會將 databaseId 設(shè)定為數(shù)據(jù)庫查詢產(chǎn)品名字與特性中的名字第一個(gè)相符合的值,要是沒有配對的特性,可能設(shè)定為 “null”。 在這個(gè)示例中,假如 getDatabaseProductName()
回到“Oracle (DataDirect)”,databaseId 將被設(shè)定為“oracle”。
你能根據(jù)完成插口 org.apache.ibatis.mapping.DatabaseIdProvider
并在 mybatis-config.xml 中申請注冊來搭建自身的 DatabaseIdProvider:
public interface DatabaseIdProvider {
default void setProperties(Properties p) { // 從 3.5.2 逐漸,該辦法為默認(rèn)設(shè)置 方式
// 空完成
}
String getDatabaseId(DataSource dataSource) throws SQLException;
}
5.映射器
5.1.Select
撰寫插口dao
User getUserById(int id);
撰寫相應(yīng)的mapper中的sql語句,留意要寫在相應(yīng)的mapper下
<!--
id:相匹配的dao插口
resultType:sql語句實(shí)行的傳參
parameterType : 主要參數(shù)種類
User:為別稱
-->
<select parameterType="int" resultType="user">
select * from mybatis.user where id=#{id}
</select>
@Test
public void getUserInfoById(){
// 啟用MyBatisUtils.getSqlSession()方式 ,獲得SqlSession目標(biāo)
SqlSession sqlSession = MyBatisUtils.getSqlSession();
// 啟用獲得到的SQLSession目標(biāo)中的getMapper目標(biāo)
// 反射面Dao插口,動態(tài)代理Dao插口中的方式 ,并將這種方式 存有目標(biāo)【mapper】中
UsersDao mapper = sqlSession.getMapper(UsersDao.class);
Users user = mapper.getUserInfoById(2);
System.out.println(user);
// 關(guān)掉sqlSession
sqlSession.close();
}
查看全部
// 【select】全部客戶信息
List<Users> getUsersInfo();
<!-- select sql: 關(guān)聯(lián)getUsersInfo方式 ,回到全部客戶信息 -->
<select resultType="com.camemax.com.camemax.pojo.Users">
select * from school.users
</select>
@Test
public void getUsersInfo(){
// 啟用MyBatisUtils.getSqlSession()方式 ,獲得SqlSession目標(biāo)
SqlSession sqlSession = MyBatisUtils.getSqlSession();
// 啟用獲得到的SQLSession目標(biāo)中的getMapper目標(biāo)
// 反射面Dao插口,動態(tài)代理Dao插口中的方式 ,并將這種方式 存有目標(biāo)【mapper】中
UsersDao mapper = sqlSession.getMapper(UsersDao.class);
// 啟用mapper中相匹配方式 ,并設(shè)定相應(yīng)的目標(biāo)來接受其回到結(jié)果
// 下列為測試標(biāo)準(zhǔn)getUsersInfo() => 獲得全部Users表格中信息內(nèi)容,并且用相匹配類接受
List<Users> usersInfo = mapper.getUsersInfo();
// for循環(huán)解析xml輸出List結(jié)合
for (Users users : usersInfo) {
System.out.println(users);
}
// 關(guān)掉sqlSession
sqlSession.close();
}
5.2.insert
插進(jìn)一條細(xì)致
// 【insert】特定客戶信息
int insertUser(Users user);
<!-- insert sql: 關(guān)聯(lián)insertUser方法,插進(jìn)單獨(dú)客戶信息-->
<insert parameterType="user" >
insert into users
values (#{id},#{username},#{password},#{email},#{gender})
</insert>
@Test
public void insertUsers(){
// 啟用MyBatisUtils.getSqlSession()方式 ,獲得SqlSession目標(biāo)
SqlSession sqlSession = MyBatisUtils.getSqlSession();
// 啟用獲得到的SQLSession目標(biāo)中的getMapper目標(biāo)
// 反射面Dao插口,動態(tài)代理Dao插口中的方式 ,并將這種方式 存有目標(biāo)【mapper】中
UsersDao mapper = sqlSession.getMapper(UsersDao.class);
int i = mapper.insertUser(
new Users(2, "wyl", "123456", "171@qq.com", 0)
);
//遞交事務(wù)管理
sqlSession.commit();
if ( i > 0 ){
System.out.println("Insert 取得成功!");
}
// 關(guān)掉sqlSession
sqlSession.close();
}
插進(jìn)好幾條數(shù)據(jù)信息
// 【insert】 大批量客戶信息
int insertManyUseList(List<Users> users);
<!-- insert sql: 關(guān)聯(lián)insertManyUseMap,批量插入 -->
<insert >
insert into users values
/* foreach 標(biāo)識:
-【item】特性: 表明結(jié)合中每一個(gè)原素開展迭代更新時(shí)的別稱
- 【collection】特性: 主要參數(shù)種類是一個(gè)List的情況下,collection特性數(shù)值list
- 【separator】特性: 表明在每一次開展迭代更新中間以什么符號做為分節(jié)符。
*/
<foreach item="user" collection="list" separator=",">
(#{user.id},#{user.username},#{user.password},#{user.email},#{user.gender})
</foreach>
</insert>
@Test
public void insertManyUseList(){
List<Users> users = new ArrayList<Users>();
users.add(new Users(2, "wyl", "123", "123@qq.com", 20));
users.add(new Users(3, "wjm", "123456", "123456@qq.com", 30));
users.add(new Users(4, "王延領(lǐng)", "1123456", "wjm@qq.com", 41));
users.add(new Users(5, "王經(jīng)墨", "223", "wjm@qq.com", 51));
SqlSession sqlSession = MyBatisUtils.getSqlSession();
UsersDao mapper = sqlSession.getMapper(UsersDao.class);
int i = mapper.insertManyUseList(users);
if ( i > 0 ){
System.out.println("插進(jìn)取得成功過!");
}
sqlSession.commit();
sqlSession.close();
}
5.3.1.外鍵約束回填土
假如你的數(shù)據(jù)庫系統(tǒng)適用自動生成外鍵約束的字段名(例如 MySQL 和 SQL Server),那麼可以設(shè)定 useGeneratedKeys=”true”,隨后再把 keyProperty 設(shè)定為總體目標(biāo)特性就 OK 了
<insert useGeneratedKeys="true" keyProperty="id">
insert into users
values (#{id},#{username},#{password},#{email},#{gender})
</insert>
假如你的數(shù)據(jù)庫查詢還適用幾行插進(jìn), 你還可以傳到一個(gè) Author
二維數(shù)組或結(jié)合,并回到自動生成的外鍵約束。
5.3.2.自定外鍵約束
最先會運(yùn)作 selectKey 原素中的句子,并設(shè)定 Users的 id,隨后才會啟用插入語句。那樣就保持了數(shù)據(jù)庫查詢自動生成外鍵約束相近的個(gè)人行為,與此同時(shí)保證了 Java 編碼的簡約。
<insert useGeneratedKeys="true" keyProperty="id">
<selectKey keyProperty="id" resultType="int" order="BEFORE">
select if(max(id)==null,1,max(id) 2) from users
</selectKey>
insert into users
values (#{id},#{username},#{password},#{email},#{gender})
</insert>
5.3.update
// 【update】特定客戶信息
int updateUseInfoById(Users user);
<!-- update sql: 關(guān)聯(lián)updateUser方法,升級特定客戶信息 -->
<update parameterType="users">
update users
set username = #{username},
password = #{password},
email = #{email},
gender = #{gender}
where id = #{id}
</update>
@Test
public void updateUseInfoById(){
SqlSession session = MyBatisUtils.getSqlSession();
UsersDao mapper = session.getMapper(UsersDao.class);
int i = mapper.updateUseInfoById(new Users(1, "王延領(lǐng)", "123456", "171@qq.com", 1));
if ( i > 0 ){
System.out.println(mapper.getUserInfoById(1).getUsername() " 改動變成!");
}
session.commit();
session.close();
}
5.4.delete
// 【delete】特定客戶信息
int deleteUserById(int id);
<!-- delete sql: 關(guān)聯(lián)deleteUserById方式 ,刪掉特定客戶信息 -->
<delete parameterType="int">
delete from users
where id = #{id}
</delete>
@Test
public void deleteUserInfoById(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
UsersDao mapper = sqlSession.getMapper(UsersDao.class);
String willDeleteUsername = mapper.getUserInfoById(2).getUsername();
int i = mapper.deleteUserById(2);
if (i > 0){
System.out.println(willDeleteUsername " 已刪除!");
}
sqlSession.commit();
sqlSession.close();
}
5.5.模糊搜索like
// 【select】 模糊搜索
List<Users> getUsersInfoByPhantomSelect(String username);
<!-- select sql: 關(guān)聯(lián)getUsersInfoByPhantomSelect,模糊搜索 -->
<select resultType="Users">
select * from users where username like #{username}
</select>
@Test
public void getUsersInfoByPhantomSelect(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
UsersDao mapper = sqlSession.getMapper(UsersDao.class);
List<Users> users = mapper.getUsersInfoByPhantomSelect("%e%");
for (Users user : users) {
System.out.println(user);
}
sqlSession.close();
}
5.6.sql
這一原素能夠 用于界定可提拔的 SQL 編碼精彩片段,便于在其他句子中應(yīng)用。
<sql id='userCols'> user_name,pwd</sql>
<select resultType="Users">
select <include refid='userCols' from school.users where username like #{username}
</select>
5.7.投射結(jié)果(resultMap)
resultMap
原素是 MyBatis 中最重要最強(qiáng)有力的原素。它能夠 讓人從 90% 的 JDBC ResultSets
數(shù)據(jù)信息獲取編碼中解放出來,并在一些情況下容許你開展一些 JDBC 不兼容的實(shí)際操作。事實(shí)上,在為一些例如聯(lián)接的繁雜句子撰寫投射編碼的情況下,一份 resultMap
可以替代完成同樣作用的千余行編碼。ResultMap的制定觀念是,對簡潔的句子保證零配備,針對繁雜一點(diǎn)的句子,只必須敘述句子中間的關(guān)聯(lián)就可以了。
5.7.1構(gòu)造
<!--原素的 type 特性表明必須的 POJO,id 特性是 resultMap 的唯一標(biāo)志-->
<resultMap type="">
<constructor><!-- 類再創(chuàng)建對象時(shí)用于引入結(jié)果到構(gòu)造函數(shù) -->
<idArg/><!-- ID主要參數(shù),結(jié)果為ID -->
<arg/><!-- 引入到構(gòu)造函數(shù)的一個(gè)一般結(jié)果 -->
</constructor>
<id/><!-- 用以表明哪一個(gè)列是外鍵約束 -->
<result/><!-- 引入到字段名或JavaBean特性的一般結(jié)果 -->
<association property=""/><!-- 用以一對一關(guān)系 -->
<collection property=""/><!-- 用以一對多、多對多關(guān)系 -->
<discriminator javaType=""><!-- 應(yīng)用結(jié)果值來決策采用哪一個(gè)結(jié)果投射 -->
<case value=""/><!-- 根據(jù)一些值的結(jié)果投射 -->
</discriminator>
</resultMap>
5.7.2.應(yīng)用 Map 儲存結(jié)果集
一切 select 句子都能夠應(yīng)用 Map 儲存結(jié)果,實(shí)例編碼以下:
<!-- 查看全部客戶信息存進(jìn)Map中 -->
<select resultType="map">
select * from user
</select>
@Test
// 查看全部客戶信息存進(jìn)Map中
List<Map<String, Object>> lmp = userDao.selectAllUserMap();
for (Map<String, Object> map : lmp) {
System.out.println(map);
}
以上 Map 的 key 是 select 句子查看的列名(務(wù)必徹底一樣),而 Map 的 value 是查看回到結(jié)果中字段名相匹配的值
5.7.3.應(yīng)用POJO儲存結(jié)果集
Map 用起來很便捷,但易讀性稍弱,有的開發(fā)人員不太喜愛應(yīng)用 Map,大量情況下喜愛應(yīng)用 POJO 的方法。
package com.wyl.mybatis.pojo;
public class User {
private Integer m_uid;
private String m_uname;
private String m_usex;
// 此處省略setter和getter方法
@Override
public String toString() {
return "User[u,uname=" m_uname ",usex=" m_usex
"]";
}
}
<!-- 查看特定客戶信息 -->
<resultMap type="users">
<!-- 類特性【userId】投射為數(shù)據(jù)庫查詢中的【id】字段名 -->
<id property="userId" column="id"/>
<!-- 類特性【userName】投射為數(shù)據(jù)庫查詢中的【name】字段名 -->
<result property="userName" column="name" />
<!-- 類特性【userPasswd】投射為數(shù)據(jù)庫查詢中的【password】字段名 -->
<result property="userPasswd" column="password" />
</resultMap>
<!-- 【resultMap】特性偏向<resultMap>標(biāo)識 -->
<select resultType="MyBatisAliasUsers" >
select * from users
</select>
@Test
// 應(yīng)用resultMap投射結(jié)果集
List<User> listResultMap = userDao.selectResultMap();
for (User myUser : listResultMap) {
System.out.println(myUser);
}
5.8.分頁查詢
5.8.1.應(yīng)用limit分頁查詢
//分頁查詢
List<User> getUserByLimit(Map<String,Integer> map);
<!--分頁查詢
英語的語法:
SELECT * from user limit startIndex,pageSize;
SELECT * from user limit 3; #[0,3)
-->
<select parameterType="map" resultMap="User">
select * from user limit #{startIndex},#{pageSize}
</select>
//分頁查詢
@Test
public void getUserByLimit(){
SqlSession sqlSession=MybatisUtils.getsqlSession();
UserMapper mapper =sqlSession.getMapper(UserMapper.class);
Map<String,Integer> map=new HashMap<String, Integer>();
map.put("startIndex",0);
map.put("pageSize",2);
List<User> userList=mapper.getUserByLimit(map);
for (User user: userList) {
System.out.println(user);
}
sqlSession.close();
}
5.8.2.RowBounds分頁查詢
//分頁查詢2
List<User> getUserByRowBounds();
<select resultMap="User">
select * from user
</select>
//分頁查詢2
@Test
public void getUserByRowBounds(){
SqlSession sqlSession=MybatisUtils.getsqlSession();
//RowBounds
RowBounds rowBounds = new RowBounds(1, 2);
List<User> userList = sqlSession.selectList("com.wyl.mybatis.dao.UserMapper.getUserByRowBounds",null,rowBounds);
for (User user: userList) {
System.out.println(user);
}
sqlSession.close();
}
5.8.3.應(yīng)用分頁插件
官方網(wǎng)站詳細(xì)地址:https://pagehelper.github.io/
5.9.聯(lián)級查看
聯(lián)級關(guān)聯(lián)是一個(gè)數(shù)據(jù)庫查詢實(shí)體線的定義,有 3 種聯(lián)級關(guān)聯(lián),分別是一對一聯(lián)級、一對多聯(lián)級及其多對多聯(lián)級
5.9.1.一對一關(guān)聯(lián)查詢
在 MyBatis 中,根據(jù)
在 原素中一般 應(yīng)用下列特性。
- property:特定投射到dao層的目標(biāo)特性。
- column:特定表格中相對應(yīng)的字段名(即查看回到的字段名)。
- javaType:特定投射到實(shí)體線目標(biāo)特性的種類。
- select:特定引進(jìn)嵌入查看的子 SQL 句子,該特性用以關(guān)系投射中的嵌入查看。
public class Teacher {
private int tid;
private String tname;
private Classes classes;
public int getTid() {
return tid;
}
public void setTid(int tid) {
this.tid = tid;
}
public String getTname() {
return tname;
}
public void setTname(String tname) {
this.tname = tname;
}
public Classes getClasses() {
return classes;
}
public void setClasses(Classes classes) {
this.classes = classes;
}
@Override
public String toString() {
return "Teacher [t, tname=" tname ", classes=" classes "]";
}
}
public class Classes {
private int cid;
private String cname;
private Teacher teacher;
public int getCid() {
return cid;
}
public void setCid(int cid) {
this.cid = cid;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
@Override
public String toString() {
return "Classes [c, cname=" cname ", teacher=" teacher "]";
}
<?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="one.to.one.classesMapper">
<!--
方法一:嵌入結(jié)果:應(yīng)用嵌入結(jié)果投射來解決反復(fù)的協(xié)同結(jié)果的非空子集
封裝聯(lián)表查看的數(shù)據(jù)信息(除去相同的數(shù)據(jù)信息)
select * from classes c, teacher t where c.tid=t.tid and c.tid=#{tid}
-->
<select resultMap="getClassesMap" parameterType="int">
select * from classes c ,teacher t
where c.tid=t.tid and c.tid=#{tid}
</select>
<resultMap type="one.to.one.Classes" >
<id column="cid" property="cid"/>
<result column="cname" property="cname"/>
<association property="teacher" javaType="one.to.one.Teacher">
<id column="tid" property="tid"></id>
<result column="tname" property="tname"/>
</association>
</resultMap>
<!--
方法一:嵌入結(jié)果:應(yīng)用嵌入結(jié)果投射來解決反復(fù)的協(xié)同結(jié)果的非空子集
封裝聯(lián)表查看的數(shù)據(jù)信息(除去相同的數(shù)據(jù)信息)
select * from teacher t,classes c where t.cid = c.cid and t.cid=#{cid}
-->
<select resultMap="getTeacherMap" parameterType="int">
select * from teacher t,classes c
where t.cid = c.cid and t.cid=#{cid}
</select>
<resultMap type="one.to.one.Teacher" >
<id column="tid" property="tid"/>
<result column="tname" property="tname"/>
<association property="classes" javaType="one.to.one.Classes">
<id column="cid" property="cid"/>
<result column="cname" property="cname"/>
</association>
</resultMap>
<!--
方法二:嵌入查看:根據(jù)實(shí)行此外一個(gè)SQL投射句子來回到預(yù)估的復(fù)雜性種類
SELECT * FROM classes WHERE cid=1;
SELECT * FROM teacher WHERE tid=1 //1 是上一個(gè)查看獲得的tid的值
property:別稱(特性名) column:字段名 -->
<!-- 把teacher的字段名設(shè)定進(jìn)來 -->
<select resultMap="getClassesMap2">
select * from classes c where c.cid = #{cid}
</select>
<resultMap type="one.to.one.Classes" >
<id column="cid" property="cid"/>
<result column="cname" property="cname"/>
<collection property="teacher" column="tid" select="getTeacherCollection">
</collection>
</resultMap>
<select resultType="one.to.one.Teacher">
select tid tid,tname tname from teacher where tid=#{tid}
</select>
</mapper>
大家這兒一對一的關(guān)系實(shí)際操作,有倆種方法:
1、應(yīng)用嵌入結(jié)果投射來解決反復(fù)的協(xié)同結(jié)果的非空子集
2、根據(jù)實(shí)行此外一個(gè)SQL投射句子來回到預(yù)估的復(fù)雜性種類
//一對一嵌入結(jié)果方法:依據(jù)老師id查詢班集體信息內(nèi)容
@Test
public void testGetClasses(){
String statement = "one.to.one.classesMapper.getClasses";
Classes c = session.selectOne(statement, 1);
System.out.println(c);
}
//一對一嵌入結(jié)果方法:依據(jù)班集體id查詢老師信息內(nèi)容
@Test
public void testGetTeacher(){
String statement = "one.to.one.classesMapper.getTeacher";
Teacher t = session.selectOne(statement, 1);
System.out.println(t);
}
//一對一嵌入查看方法:依據(jù)老師id查詢班集體信息內(nèi)容
@Test
public void testGetClasses2(){
String statement = "one.to.one.classesMapper.getClasses2";
Classes c = session.selectOne(statement, 1);
System.out.println(c);
}
5.9.2. 多對一查看
-
SQL回到的值必須應(yīng)用到類時(shí)的處理方法
-
仿真模擬檢測:好幾個(gè)學(xué)員相匹配一個(gè)教師
- MySQL檢測表【Teachers】、【Students】
- 檢測dao層【Teachers】、【Students】
- dao層【TeachersMapper】、【StudentsMapper】
- XML投射文檔【teachersMapper.xml】、【studentsMapper.xml】
- 關(guān)鍵環(huán)境變量=>【mybatis-config.xml】關(guān)聯(lián)dao插口、申請注冊XML投射文檔
- 輸出檢測
-
總體文件目錄構(gòu)造
5.9.2.1 自然環(huán)境構(gòu)建
MySQL建立數(shù)據(jù)測試
use school;
#老師表
DROP TABLE IF exists teachers;
create table teachers(
`tid` int(10),
`tname` varchar(20) DEFAULT NULL,
PRIMARY KEY (`tid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
#學(xué)員表
DROP TABLE IF exists students;
create table students(
`id` int(10) ,
`name` varchar(20) DEFAULT NULL,
`tid` int(10) DEFAULT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `fktid` FOREIGN KEY (`tid`) REFERENCES `teachers` (`tid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
insert into teachers (`tid`,`tname`) values (1,'卡梅克斯');
insert into students (`id`,`name`,`tid`) values (1,'小紅書',1);
insert into students (`id`,`name`,`tid`) values (2,'小綠',1);
insert into students (`id`,`name`,`tid`) values (3,'小白',1);
insert into students (`id`,`name`,`tid`) values (4,'新手',1);
insert into students (`id`,`name`,`tid`) values (5,'小紫',1);
5.9.2.2 dao層與插口
-
學(xué)員有關(guān)
-
【Students】dao層
package com.camemax.pojo; import org.apache.ibatis.type.Alias; @Alias("students") public class Students { private int sid; private String sname; // 加上【Teachers】類特性 private Teachers teacher; public Students() {}; public Students(int sid, String sname, Teachers teacher) { this.sid = sid; this.sname = sname; this.teacher = teacher; } public int getSid() { return sid; } public void setSid(int sid) { this.sid = sid; } public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } public Teachers getTeacher() { return teacher; } public void setTeacher(Teachers teacher) { this.teacher = teacher; } @Override public String toString() { return "Students{" "s, sname='" sname '\'' ", teacher=" teacher '}'; } }
-
【StudentsMapper】插口
package com.camemax.dao; import com.camemax.pojo.Students; import java.util.List; public interface StudentsMapper { //查看全部學(xué)生電子檔案,與此同時(shí)輸出老師信息內(nèi)容 List<Students> getStudentsInfo(); }
-
-
老師有關(guān)
-
【Teachers】dao層
package com.camemax.pojo; import org.apache.ibatis.type.Alias; @Alias("teachers") public class Teachers { private int tid; private String tname; public Teachers() {}; public Teachers(int tid, String tname) { this.tid = tid; this.tname = tname; } public int getTid() { return tid; } public void setTid(int tid) { this.tid = tid; } public String getTname() { return tname; } public void setTname(String tname) { this.tname = tname; } @Override public String toString() { return "Teachers{" "t, tname='" tname '\'' '}'; } }
-
【TeachersMapper】插口
package com.camemax.dao; public interface TeachersMapper { }
-
5.9.2.3 Mapper映射器
-
mybatis-config.xml
<configuration> <properties resource="db.properties"/> <settings> <setting name="logImpl" value="LOG4J"/> </settings> <typeAliases> <package name="com.camemax.pojo"/> </typeAliases> <environments default="development"> <environment > <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${propDriver}"/> <property name="url" value="${propUrl}"/> <property name="username" value="${propUsername}"/> <property name="password" value="${propPassword}"/> </dataSource> </environment> </environments> <!-- 申請注冊Mapper--> <mappers> <mapper resource="mapper/studentsMapper.xml"/> <mapper resource="mapper/teachersMapper.xml"/> </mappers> </configuration>
5.9.2.4. 按查看嵌入解決【子查詢】
-
studentsMapper.xml
<!-- 按查看嵌入解決 --> <select resultMap="StudentsInfoMapBySelect" > select * from school.students </select> <resultMap type="students"> <id property="sid" column="id"/> <result property="sname" column="name"/> <!-- 繁雜種類: Teachers類 【association】: 目標(biāo) - 【property】: 設(shè)定獲得到的結(jié)果集字段 => private Teachers teacher - 【column】: 設(shè)定投射相匹配的數(shù)據(jù)庫查詢字段名 => tid - 【javaType】: 設(shè)定回到種類 => Teachers - 【select】: 子查詢關(guān)聯(lián)。根據(jù)別的<select>標(biāo)識中的值,偏向別的select句子 => <select > 【collection】: 結(jié)合 --> <association property="teacher" column="tid" javaType="Teachers" select="TeachersInfo"/> </resultMap> <!-- 查看特定老師信息內(nèi)容 --> <select resultType="teachers"> select * from school.teachers where tid = #{tid} </select>
-
teachersMapper.xml
<mapper namespace="com.wyl.mybatis.dao.TeachersMapper"> </mapper>
5.9.2.5 按結(jié)果嵌入解決【關(guān)系】
-
studentsMapper.xml
<!-- 按結(jié)果嵌入解決 --> <select resultMap="getStudentsInfoByResult"> select s.id studentId, s.name studentName, t.tname teacherName from students s,teachers t where s.tid = t.tid; </select> <resultMap type="students"> <id property="sid" column="studentId"/> <result property="sname" column="studentName"/> <association property="teacher" javaType="Teachers"> <result property="tname" column="teacherName"/> </association> </resultMap>
-
teachersMapper.xml
<mapper namespace="com.wyl.mybatis.dao.TeachersMapper"> </mapper>
5.9.3. 一對多查看
- 仿真模擬檢測:一名教師有多位學(xué)員 => 【朝向老師】
- 實(shí)質(zhì):應(yīng)用<collection>標(biāo)識進(jìn)行一對多的輸出
5.9.3.1. 根據(jù)[12.1自然環(huán)境構(gòu)建](#12.1 自然環(huán)境構(gòu)建)作出的改動
-
dao層 => 【TeachersDao】
package com.camemax.dao; import com.camemax.pojo.Students; import com.camemax.pojo.Teachers; import org.apache.ibatis.annotations.Param; import java.util.List; public interface TeachersMapper { // 傳到特定老師序號,回到其下學(xué)生電子檔案 List<Students> getTeacherByIdHasStudents(@Param("tid") int tid); }
-
完成類 => 【Teachers】
package com.camemax.pojo; import org.apache.ibatis.type.Alias; import java.util.List; @Alias("teachers") public class Teachers { private int tid; private String tname; // 增加特性 : 老師有著的學(xué)員 private List<Students> teacherHasStudents; public List<Students> getTeacherHasStudents() { return teacherHasStudents; } public void setTeacherHasStudents(List<Students> teacherHasStudents) { this.teacherHasStudents = teacherHasStudents; } public Teachers(int tid, String tname, List<Students> teacherHasStudents) { this.tid = tid; this.tname = tname; this.teacherHasStudents = teacherHasStudents; } public Teachers() {}; public int getTid() { return tid; } public void setTid(int tid) { this.tid = tid; } public String getTname() { return tname; } public void setTname(String tname) { this.tname = tname; } @Override public String toString() { return "Teachers{" "t, tname='" tname '\'' ", teacherHasStudents=" teacherHasStudents '}'; } }
-
dao層 => 【Students】
package com.camemax.pojo; import org.apache.ibatis.type.Alias; @Alias("students") public class Students { private int sid; private String sname; private int tid; public Students(){}; public Students(int sid, String sname, int tid) { this.sid = sid; this.sname = sname; this.tid = tid; } @Override public String toString() { return "Students{" "s, sname='" sname '\'' ", tlanguage-java">@Test public void getStudentsByTid(){ MyBatisUtils mybatis = new MyBatisUtils(); SqlSession sqlSession = mybatis.getSqlSession(); TeachersMapper mapper = sqlSession.getMapper(TeachersDao.class); System.out.println(mapper.getStudentsByTid(1)); sqlSession.close(); }
5.9.3.2. 按查看嵌入解決 【子查詢】
-
XML投射文檔 => teachersMapper.xml
<select resultMap="getStudentsByTidMapUseSelect"> select * from school.teachers where tid = #{tid} </select> <!-- 建立【getStudentsByTidMapUseSelect】投射結(jié)果集,完成一對多結(jié)果回到。 留意:Teachers類 應(yīng)用了 @Alias("teachers") --> <resultMap type="teachers"> <id property="tid" column="tid" /> <result property="tname" column="name" /> <!-- Teachers類中增加List<Students> teacherHasStudents屬性字段名 javaType: 特定在java中的字段名種類特性 ofType: 特定種類隸屬類 select: 使resultMap關(guān)聯(lián)特定<select>標(biāo)識 column: 使resultMap傳送特定的特性字段名 --> <collection property="teacherHasStudents" javaType="ArrayList" ofType="students" select="getStudentsByTid" column="tid"/> </resultMap> <!-- 子查詢:學(xué)生電子檔案 --> <select resultMap="studentsMap"> select * from school.students where tid = #{tid} </select> <!-- 建立【studentsMap】,投射Students類中,與Teachers表字段不一致的特性字段名 --> <resultMap type="students"> <id property="sid" column="id" /> <result property="sname" column="name"/> <!-- 不用會造成 字段名【tid】結(jié)果為0 --> <result property="tid" column="tid" /> </resultMap>
-
輸出結(jié)果
// 按查看嵌入解決 => 子查詢 結(jié)果: [Teachers{tid=1, tname='卡梅克斯', teacherHasStudents=[Students{sid=1, sname='小紅書', tid=1}, Students{sid=2, sname='小綠', tid=1}, Students{sid=3, sname='小白', tid=1}, Students{sid=4, sname='新手', tid=1}, Students{sid=5, sname='小紫', tid=1}]}]
5.9.3.3. 按結(jié)果嵌入解決 【關(guān)聯(lián)查詢】
-
XML投射文檔 => teachersMapper.xml
<select resultMap="teacherGetStudentsByResult"> select s.id studentId,s.name studentName,s.tid,t.tname teacherName,t.tid from students s,teachers t where s.tid = t.tid and t.tid = #{tid} </select> <resultMap type="teachers"> <id property="tid" column="tid"/> <result property="tname" column="teacherName"/> <collection property="teacherHasStudents" ofType="students"> <id property="sid" column="studentId"/> <result property="sname" column="studentName"/> <result property="tid" column="tid" /> </collection> </resultMap>
-
檢測結(jié)果
// 按結(jié)果嵌入解決 => 關(guān)聯(lián)查詢 結(jié)果: [Teachers{tid=1, tname='卡梅克斯', teacherHasStudents=[Students{sid=1, sname='小紅書', tid=1}, Students{sid=2, sname='小綠', tid=1}, Students{sid=3, sname='小白', tid=1}, Students{sid=4, sname='新手', tid=1}, Students{sid=5, sname='小紫', tid=1}]}]
5.10.緩存文件
假如每一次查看都數(shù)據(jù)庫連接 ,耗資源!一次查看的結(jié)果,給他們暫存有一個(gè)能夠 立即得到的地區(qū)!–> 運(yùn)行內(nèi)存 : 緩存文件
大家再度查看同樣數(shù)據(jù)信息的情況下,立即走緩存文件,就無需走數(shù)據(jù)庫查詢了
因此 常常查看又很久沒更改的信息能夠 應(yīng)用緩存文件,降低和數(shù)據(jù)表的互動頻次,降低系統(tǒng)軟件花銷,提升系統(tǒng)軟件高效率.
-
MyBatis包括一個(gè)十分強(qiáng)有力的查看緩存文件特點(diǎn),它能夠十分便捷地訂制和配備緩存文件。緩存文件能夠 很大程度的提高查看高效率。
-
MyBatis系統(tǒng)中默認(rèn)設(shè)置 界定了二級緩存文件:一級緩存文件和二級緩存.
-
默認(rèn)設(shè)置 狀況下,僅有一級緩存文件打開。(SqlSession等級的緩存文件,也稱之為當(dāng)?shù)鼐彺嫖募?/p>
-
二級緩存必須手動式開始和配備,他是根據(jù)namespace級其他緩存文件。
-
為了更好地提升擴(kuò)展性,MyBatis界定了緩存文件插口Cache。我們可以根據(jù)完成Cache插口來源于界定二級緩存
-
5.10.1.一級緩存文件
也叫當(dāng)?shù)鼐彺嫖募?SqlSession.
-
一級緩存文件默認(rèn)設(shè)置 是打開的,只在一次SqlSession中合理,也就是取得聯(lián)接到關(guān)掉聯(lián)接這一區(qū)段段!
-
一級緩存文件便是一個(gè)Map
-
在同一個(gè) SqlSession 中, Mybatis 會把實(shí)行的辦法和主要參數(shù)根據(jù)優(yōu)化算法轉(zhuǎn)化成緩存文件的鍵值, 將鍵值和結(jié)果儲放在一個(gè) Map 中, 假如事后的鍵值一樣, 則同時(shí)從 Map 中讀取數(shù)據(jù);
-
不一樣的 SqlSession 中間的緩存文件是互相防護(hù)的;
-
用一個(gè) SqlSession, 能夠 根據(jù)配備促使在查看前清除緩存文件;
-
一切的 UPDATE, INSERT, DELETE 句子都是會清除緩存文件。
5.10.2.二級緩存
- 級緩存文件也叫全局性緩存文件,一級緩存文件修飾符太低了,因此 產(chǎn)生了二級緩存
- 根據(jù)namespace級其他緩存文件,一個(gè)名字室內(nèi)空間,相匹配一個(gè)二級緩存;
- 工作方案
3.1.一個(gè)對話查看一條數(shù)據(jù)信息,這一數(shù)據(jù)信息便會被放到當(dāng)今對話的一級緩存文件中;
3.2.假如當(dāng)今對話關(guān)掉了,這一對話相匹配的一級緩存文件就沒有了;可是大家需要的是,對話關(guān)掉了,一級緩存文件中的信息被保留到二級緩存中;
3.3.新的對話查看信息內(nèi)容,就可以從二級緩存中獲得內(nèi)容;
3.4.不一樣的mapper查出來的信息會放到自身相應(yīng)的緩存文件(map)中;
流程:
打開全局性緩存文件
<!--表明的打開全局性緩存文件-->
<setting name="cacheEnabled" value="true"/>
在要應(yīng)用二級緩存的Mapper中打開
<!--在當(dāng)今Mapper.xml中應(yīng)用二級緩存-->
<cache/>
還可以自定主要參數(shù)
<!--在當(dāng)今Mapper.xml中應(yīng)用二級緩存-->
<cache eviction="FIFO"
flushInterval="60000"
size="512"
readOnly="true"/>
總結(jié):
- 只需開始了二級緩存,在同一個(gè)Mapper下就合理
- 全部的信息都是會先放到一級緩存文件中;
- 僅有當(dāng)對話遞交,或是關(guān)上的情況下,才會遞交到二級緩存中
6.動態(tài)sql
動態(tài)性 SQL 是 MyBatis 的強(qiáng)悍特點(diǎn)之一。
MyBatis 3 更換了以前的大多數(shù)原素,大大的簡化了元素種類,如今要學(xué)習(xí)的元素種類比原先的一半還需要少。
- if
- choose (when, otherwise)
- trim (where, set)
- foreach
6.1.if
應(yīng)用動態(tài)性 SQL 最普遍場景是依據(jù)標(biāo)準(zhǔn)包括 where 子句的一部分。
<select
resultType="Blog">
SELECT * FROM BLOG
WHERE state = ‘ACTIVE’
<if test="title != null">
AND title like #{title}
</if>
</select>
6.2.choose、when、otherwise
<select
resultType="Blog">
SELECT * FROM BLOG WHERE state = ‘ACTIVE’
<choose>
<when test="title != null">
AND title like #{title}
</when>
<when test="author != null and author.name != null">
AND author_name like #{author.name}
</when>
<otherwise>
AND featured = 1
</otherwise>
</choose>
</select>
6.3.trim、where、set
<select
resultType="Blog">
SELECT * FROM BLOG
WHERE
<if test="state != null">
state = #{state}
</if>
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null and author.name != null">
AND author_name like #{author.name}
</if>
</select>
6.3.foreach
<select resultType="domain.blog.Post">
SELECT *
FROM POST P
WHERE ID in
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
#{item}
</foreach>
</select>
6.4.script
@Update({"<script>",
"update Author",
" <set>",
" <if test='username != null'>username=#{username},</if>",
" <if test='password != null'>password=#{password},</if>",
" <if test='email != null'>email=#{email},</if>",
" <if test='bio != null'>bio=#{bio}</if>",
" </set>",
"where id=#{id}",
"</script>"})
void updateAuthorValues(Author author);
6.5.bind
<select resultType="Blog">
<bind name="pattern" value="'%' _parameter.getTitle() '%'" />
SELECT * FROM BLOG
WHERE title LIKE #{pattern}
</select>
6.6.trim
<select parameterType="blogs">
select * from test.blog
<trim prefix="WHERE" prefixOverride="AND |OR ">
<if test="titleMap != null"> AND title = #{titleMap}</if>
<if test="authorMap != null"> OR author = #{authorMap}</if>
</trim>
</select>
<update parameterType="map">
update test.blog
<trim prefix="SET" suffixOverride=",">
<if test="titleMap != null"> title = #{titleMap},</if>
<if test="authorMap != null"> author = #{authorMap},</if>
</trim>
where id = #{idMap}
</update>
6.7.多數(shù)據(jù)庫查詢適用
假如配備了 databaseIdProvider,你也就能夠 在動態(tài)性編碼中應(yīng)用名叫 “_databaseId” 的變數(shù)來為不一樣的數(shù)據(jù)庫查詢搭建相應(yīng)的句子。例如接下來的事例:
<insert >
<selectKey keyProperty="id" resultType="int" order="BEFORE">
<if test="_databaseId == 'oracle'">
select seq_users.nextval from dual
</if>
<if test="_databaseId == 'db2'">
select nextval for seq_users from sysibm.sysdummy1"
</if>
</selectKey>
insert into users values (#{id}, #{name})
</insert>
6.8.動態(tài)性 SQL 中的插進(jìn)開發(fā)語言
MyBatis 從 3.2 版本號進(jìn)行適用插進(jìn)開發(fā)語言,這容許你插進(jìn)一種語言表達(dá)推動,并根據(jù)這類語言表達(dá)來撰寫動態(tài)性 SQL 查看句子。
能夠 根據(jù)完成下列插口來插進(jìn)一種語言表達(dá):
public interface LanguageDriver {
ParameterHandler createParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql);
SqlSource createSqlSource(Configuration configuration, XNode script, Class<?> parameterType);
SqlSource createSqlSource(Configuration configuration, String script, Class<?> parameterType);
}
完成自定語言表達(dá)推動后,你也就能夠 在 mybatis-config.xml 文檔里將它設(shè)定為默認(rèn)設(shè)置 語言表達(dá):
<typeAliases>
<typeAlias type="org.sample.MyLanguageDriver" alias="myLanguage"/>
</typeAliases>
<settings>
<setting name="defaultScriptingLanguage" value="myLanguage"/>
</settings>
或是,你還可以應(yīng)用 lang
特性為特殊的句子特定語言表達(dá):
<select lang="myLanguage">
SELECT * FROM BLOG
</select>
或是,在你的 mapper 插口上加上 @Lang
注釋:
public interface Mapper {
@Lang(MyLanguageDriver.class)
@Select("SELECT * FROM BLOG")
List<Blog> selectBlog();
}
7.注釋
優(yōu)點(diǎn)和缺點(diǎn):
- 優(yōu)勢:省掉繁雜的mapper映射器中的sql編碼有關(guān)配備
- 缺陷:沒法實(shí)行繁雜的SQL,比如:存有字段名出現(xiàn)異常不搭配時(shí),應(yīng)用注釋實(shí)行SQL非常容易發(fā)生找不著值的狀況(查看結(jié)果為'null')
@Select("select * from school.users where id = #{userId}")
Users getUserInfoById(@Param("userId") int id);
@Insert("insert into school.users value(#{id},#{username},#{password},#{email},#{gender})")
int insertUserInfo(@Param("userId") int id
,@Param("userName") String username
,@Param("userPassword") String password
,@Param("userEmail") String email
,@Param("userGender") int gender
);
@Delete("delete from school.users where id = #{userId}")
int deleteUserInfoById(@Param("userId") int id);
@Update("update school.users set username = #{userName} , password = #{userPassword} , email = #{userEmail} , gender = #{userGender} where id = #{userId}")
int updateUserInfoById(
@Param("userId") int id
,@Param("userName") String username
,@Param("userPassword") String password
,@Param("userEmail") String email
,@Param("userGender") int gender
);
8.日志
Mybatis 根據(jù)應(yīng)用自帶的日志加工廠給予日志作用。內(nèi)嵌日志加工廠可能把日志工作中委派給接下來的完成之一:
- SLF4J
- Apache Commons Logging
- Log4j 2
- Log4j
- JDK logging
在mybatis-config.xml中人們早已設(shè)定了日志的默認(rèn)設(shè)置為STDOUT_LOGGING規(guī)范日志輸出:
<!--配日志-SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
檢測輸出
8.1.Log4J
- Log4j是Apache的一個(gè)開源軟件,根據(jù)應(yīng)用Log4j,能夠 操縱日志信息內(nèi)容運(yùn)輸?shù)慕K點(diǎn)是控制面板、文檔、GUI組件,乃至是套插口網(wǎng)絡(luò)服務(wù)器、NT的事情監(jiān)控軟件、UNIX Syslogxinetd等;
- 操縱每一條日志的輸出文件格式;根據(jù)界定每一條日志信息內(nèi)容的等級,可以更為仔細(xì)地操縱日志的產(chǎn)生全過程。
- 根據(jù)一個(gè)環(huán)境變量來靈敏地開展配備,而不用改動運(yùn)用的編碼。
-
導(dǎo)進(jìn)Maven依靠
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
-
映射器打開日志作用
<configuration> <settings> ... <setting name="logImpl" value="LOG4J"/> ... </settings> </configuration>
-
log4j.properties
#將級別為DEBUG的日志信息內(nèi)容輸出到console和file這兩個(gè)到達(dá)站,console和file的定義在下面的編碼
log4j.rootLogger=DEBUG,console,file
#控制面板輸出的有關(guān)設(shè)定
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=【%c】-%m%n
#文檔輸出的有關(guān)設(shè)定
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/MyBatis.txt
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=【%p】【%d{yy-MM-dd}】【%c】%m%n
#日志輸出等級
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
8.2.日志類應(yīng)用
導(dǎo)進(jìn)Apache-Log4J包
import org.apache.log4j.Logger;
應(yīng)用反射面當(dāng)今目標(biāo)來建立當(dāng)今Logger目標(biāo)
// 建立靜態(tài)變量Logger目標(biāo) => logger
// 應(yīng)用當(dāng)今類.class反射面建立logger目標(biāo)
static Logger logger = logger.getLogger(UsersDaoTest.class)
@Test
public void log4jTest(){
logger.info("info: 日志輸出級別【Info】");
logger.debug("debug: 日志輸出級別【DEBUG】");
logger.error("error: 日志輸出級別【ERROR】");
}