三、mybatis配置解析

1.核心配置文件

  • mybatis-config.xml
  • mybatis 的配置文件包含了會深深影響mybatis行爲的設置和屬性信息
configuration(配置)
properties(屬性)
settings(設置)
typeAliases(類型別名)
typeHandlers(類型處理器)
objectFactory(對象工廠)
plugins(插件)
environments(環境配置)
environment(環境變量)
transactionManager(事務管理器)
dataSource(數據源)
databaseIdProvider(數據庫廠商標識)
mappers(映射器)

2.環境變量

<environments default="development">
  <environment id="development">
    <transactionManager type="JDBC">
      <property name="..." value="..."/>
    </transactionManager>
    <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>

這裏還可以增加一個environment,想要將環境切換到拎一個環境,只需要將enviroments default=" "換成另一個id就可以

<environments default="test">
  <environment id="development">
    <transactionManager type="JDBC">
      <property name="..." value="..."/>
    </transactionManager>
    <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>
  
  <environment id="test">
    <transactionManager type="JDBC">
      <property name="..." value="..."/>
    </transactionManager>
    <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>

事物管理器(transactionManager)有兩種:JDBC(mybatis默認爲JDBC)、MANAGED(一般不需要掌握)

數據源(dataSource)

DataSource說白了就是連接數據庫,它封裝了數據庫參數,程序中操作DataSource對象即可對數據庫進行增刪改查操作。不同方式中使用的DataSource對象不同,例如:

1、DBCP框架
dbcp框架中的DataSource類是:org.apache.commons.dbcp.BasicDataSource
這是commons-dbcp.jar包中的類。

2、C3P0框架
c3p0框架的DataSource類是:com.mchange.v2.c3p0.ComboPooledDataSource
這是c3p0.jar包中的類。

3、Druid框架(阿里巴巴的)
Druid框架的DataSource類是:com.alibaba.druid.pool.DruidDataSource
這是druid.jar包中的類。

4、MyBatis框架
MyBatis框架的DataSource類是:org.apache.ibatis.datasource.pooled.PooledDataSource
這是mybatis.jar包中的類。

有三種內建的數據源類型(也就是 type="[UNPOOLED|POOLED|JNDI]"):

  • UNPOOLED: 這個數據源的實現只是每次被請求時打開和關閉連接。雖然有點慢,但對於在數據庫連接可用性方面沒有太高要求。也就是沒有連接池。。
  • POOLED: 這種數據源的實現利用“池”的概念將 JDBC 連接對象組織起來,避免了創建新的連接實例時所必需的初始化和認證時間。(一般默認,池子:就是用完可以回收,可以使web應用相應更加快!)
  • JNDI:這個數據源的實現是爲了能在如 EJB 或應用服務器這類容器中使用,容器可以集中或在外部配置數據源,然後放置一個 JNDI 上下文的引用。(不常用)

學會配置多套環境
mybatis默認的事物管理器就是:JDBC,連接池:POOLED

3.屬性(properties)

我們可以通過properties屬性來實現引用配置文件

這些屬性都是可外部配置且可動態替換的,既可以在典型的 Java 屬性文件中配置,亦可通過 properties 元素的子元素來傳遞。【db.properties】

編寫一個配置文件:
db.properties(錯誤的寫法,url用&連接而不是;)

driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/mybatis?useSSL=true;useUnicode=true;characterEncoding=UTF-8
username=root
password=12345

db.properties(正確寫法)

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username=root
password=12345

在覈心配置文件中引入

<properties resource="db.properties">
       <property name="username" value="root"/>
       <property name="password" value="111"/>
</properties>
  • 可以直接引入外部文件
  • 可以在其中增加一些屬性配置
  • 如果兩個文件有同一個字段,,優先使用外部配置文件!

4.類型別名(typeAliases)

  • 類型別名是爲 Java 類型設置一個短的名字。
  • 存在的意義僅在於用來減少類完全限定名的冗餘。
<typeAliases>
        <typeAlias type="com.yang.pojo.User" alias="User"/>
    </typeAliases>

也可以指定一個包名,MyBatis 會在包名下面搜索需要的 Java Bean,比如:
掃描實體類的包,它的默認別名就爲這個類的類名首字母小寫。(大寫也是可以的,但是建議小寫)

<typeAliases>
        <package name="com.yang.pojo"/>
</typeAliases>
  • 在實體類比較少的時候使用第一種方式
  • 如果實體類十分多,建議使用第二種
  • 第一種可以DIY別名,第二種則不行,如果非要改,需要在實體類上增加註解
@Alias("uesr")
public class User{}

5.設置(setting)

這是mybatis中極爲重要的調整設置,它們會改變mybatis的運行行爲。

  • 一個配置完整的 settings 元素的示例如下:
<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>

6.其他配置

  • typeHandlers(類型處理器)
  • objectFactory(對象工廠)
  • plugins插件
  • mybatis-generator-core
  • mybatis-plus
  • 通用mapper

7.映射器(mappers)

MapperRegistry:註冊綁定我們的Mapper文件:

  • 方式一:【推薦使用】
<mappers>
        <mapper resource="com/yang/dao/UserMapper.xml"/>
    </mappers>
  • 方式二:使用class文件綁定註冊
<mappers>
        <mapper class="com.yang.dao.UserMapper"/>
    </mappers>

注意點:

  • 接口和他的mapper配置文件必須同名

  • 接口和他的mapper配置文件必須在同一個包下!

  • 方式三:使用掃描包進行註定綁定

<mappers>
        <package name="com.yang.dao"/>
</mappers>

注意點:

  • 接口和他的mapper配置文件必須同名
  • 接口和他的mapper配置文件必須在同一個包下!

8.生命週期和作用域

作用域和生命週期,是至關重要的,因爲錯誤的使用會導致非常嚴重的併發問題。

SqlSessionFactoryBuilder

  • 一旦創建了 SqlSessionFactory,就不再需要它了。
  • 局部變量

SqlSessionFactory

  • 說白了就是可以想象爲:數據庫連接池
  • SqlSessionFactory一旦被創建就應該在應用的運行期間一直存在,沒有任何理由丟棄他或重新創建另一個實例
  • 因此 SqlSessionFactory 的最佳作用域是應用作用域。
  • 最簡單的就是使用單例模式或者靜態單例模式。

SqlSession

  • 連接到連接池的一個請求!
  • 關閉
  • SqlSession 的實例不是線程安全的,因此是不能被共享的,所以它的最佳的作用域是請求或方法作用域。
  • 用完之後直接關閉,否則資源被佔用!


這裏面的每一個mapper,就代表具體的業務!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章