亚洲精品久久国产精品37p,亚洲av无码av制服另类专区,午夜直播免费看,玩弄人妻少妇500系列视频,无码人妻久久久一区二区三区

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

image-20210816153745328

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)的推動。

image-20210816171241868

<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)架

img

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&amp;useUnicode=true&amp;characterEncoding=utf8&amp;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)化成就可以

image-20210823153814340

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

image-20210823155011994

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.修飾符與生命期

image-20210823173846319

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>

image-20210823161021441

? 照片來源于官方網(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)的值來更換。那樣就為配備給予了眾多靈便挑選。

image-20210823162924181

特性還可以被傳送到SqlSessionBuilder.build()方式 中。

SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, props);
// ... or ...
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment, props);

可是,這也就涉及到到優(yōu)先的難題,假如特性不只在一個(gè)地區(qū)配備,那麼mybatis可能依照接下來的次序來載入:
1.在properties元素身體特定的特性最先被載入。

  1. 隨后依據(jù)properties元素中的resource特性載入類途徑下特性文檔或依據(jù)url特性特定的途徑載入特性文檔,并遮蓋已載入的同名的特性。
  2. 最終載入做為方式 參數(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è)定為 WARNFAILING: 投射不成功 (拋出去 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句子。

    1. 應(yīng)用相對性于類途徑的資源引入 【強(qiáng)烈推薦】:

      <mappers>
         <mapper resource="mappers/userMapper.xml"/>
      </mappers>
      
    2. 應(yīng)用映射器插口完成類的徹底限制類名

      <mappers>
        <mapper class="com.wyl.mybatis.dao.UsersDao"/>
      </mappers>
      
    3. 將包內(nèi)的映射器插口完成所有申請注冊為映射器(留意相對位置)

      <mappers>
        <package name="com.wyl.mybatis.dao"/>
      </mappers>
      
    4. 應(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中間的互相變換。

image-20210824103050041

和別稱一樣,在 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

image

image-20210824104028080

這種便是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/

image-20210824093737129

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ù) 原素的子原素 解決這類一對一聯(lián)級關(guān)聯(lián)。

在 原素中一般 應(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è)教師

    1. MySQL檢測表【Teachers】、【Students】
    2. 檢測dao層【Teachers】、【Students】
    3. dao層【TeachersMapper】、【StudentsMapper】
    4. XML投射文檔【teachersMapper.xml】、【studentsMapper.xml】
    5. 關(guān)鍵環(huán)境變量=>【mybatis-config.xml】關(guān)聯(lián)dao插口、申請注冊XML投射文檔
    6. 輸出檢測
  • 總體文件目錄構(gòu)造

    image-20200829123326705

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)建)作出的改動

  1. 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);
    }
    
    
  2. 完成類 => 【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  
                    '}';
        }
    }
    
  3. 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. 按查看嵌入解決 【子查詢】

  1. 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>
    
  2. 輸出結(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)查詢】

  1. 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>
    
  2. 檢測結(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.

  1. 一級緩存文件默認(rèn)設(shè)置 是打開的,只在一次SqlSession中合理,也就是取得聯(lián)接到關(guān)掉聯(lián)接這一區(qū)段段!

  2. 一級緩存文件便是一個(gè)Map

  3. 在同一個(gè) SqlSession 中, Mybatis 會把實(shí)行的辦法和主要參數(shù)根據(jù)優(yōu)化算法轉(zhuǎn)化成緩存文件的鍵值, 將鍵值和結(jié)果儲放在一個(gè) Map 中, 假如事后的鍵值一樣, 則同時(shí)從 Map 中讀取數(shù)據(jù);

  4. 不一樣的 SqlSession 中間的緩存文件是互相防護(hù)的;

  5. 用一個(gè) SqlSession, 能夠 根據(jù)配備促使在查看前清除緩存文件;

  6. 一切的 UPDATE, INSERT, DELETE 句子都是會清除緩存文件。

5.10.2.二級緩存

  1. 級緩存文件也叫全局性緩存文件,一級緩存文件修飾符太低了,因此 產(chǎn)生了二級緩存
  2. 根據(jù)namespace級其他緩存文件,一個(gè)名字室內(nèi)空間,相匹配一個(gè)二級緩存;
  3. 工作方案
    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.注釋

image-20210824160741551

優(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>

檢測輸出

image-20210824182641931

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)用的編碼。
  1. 導(dǎo)進(jìn)Maven依靠

    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
    
  2. 映射器打開日志作用

    <configuration>
      <settings>
        ...
        <setting name="logImpl" value="LOG4J"/>
        ...
      </settings>
    </configuration>
    
  3. 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】");
}

image-20210824183517453

評論(0條)

刀客源碼 游客評論