Version: Next

配置解析

1. 核心配置文件

  • mybatis-config.xml

2. 环境配置(environments)

Mybatis可以适应多种环境,不过要记住,每个SqlSessionFactory实例只能选择一种环境



  • Mybatis默认的事务管理器 -> JDBC | MANAGED
  • Mybatis默认的连接池: POOLED | UNPOOLED | JNDI
  • 配置多套环境
<environments default="test">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
<environment id="test">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>

3. 属性(properties)

可以通过properties属性实现引用配置文件

编写一个数据库配置文件

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

在核心配置文件中引入

<!-- 引入外部配置文件-->
<properties resource="db.properties"/>
<environments default="test">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
<environment id="test">
<transactionManager type="JDBC"></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>
  • 可以直接引入外部文件
  • 可以在其中增加一些属性配置
  • 外部引入配置文件优先级高于内部配置的

4. 类型别名(typeAliases)

类型别名时Java类型设置一个短的名字。它之和XML配置有关,存在的意义仅在于减少类完全限定名的冗余

  • 方式一:在mybatis-config.xml中添加typeAliases标签,设置typeAlias标签
<!-- 可以给实体类起别名-->
<typeAliases>
<typeAlias type="com.bsx.pojo.User" alias="User"/>
</typeAliases>

mapper.xml

<select id="getUserList" resultType="User">
SELECT * FROM USER;
</select>

测试通过。

  • 方式二:在mybatis-config.xml中添加typeAliases标签,设置package标签 指定一个包名,Mybatis会在包名下面搜索需要的Java Bean

在没有注解的情况下,会使用Bean的首字母小写的非限定类名来作为它的别名。若有注解,则别名为其注解值

<!-- 可以开启包扫描-->
<typeAliases>
<package name="com.bsx.pojo"/>
</typeAliases>

扫描实体类的报名,默认别名为就为这个类的类名首字母小写

@Alias("user")
public class User{...}
<select id="getUserList" resultType="user">
SELECT * FROM USER;
</select>

测试通过

实体类比较少时,使用第一种方式,否则建议使用第二种

第一种可以自定义别名,第二种则要通过注解自定义别名

Mybatis内建了一些基本别名

  • byte -> _byte

  • int -> _int

  • double -> _double

  • Double -> double

  • Integer -> int

  • HashMap -> hashmap

  • Boolean -> boolean

  • Short -> short

    .... 以此类推

5. 设置(Settings)

这是Mybatis种极为重要的调整设置,他们会改边MyBaits的运行时行为。

设置名描述有效值默认值
cacheEnabled全局的开启或关闭配置文件中的所有映射器以配置的任何缓存true/falsetrue
lazyLoadingEnabled延迟加载的全局开关。当开启时,所有关联对象都会延迟加载,特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态true/falsefalse
useGenerateKeys允许JDBC支持自动生成主键,需要驱动支持。如果设置为true则这个设置强制使用自动生成主键,尽管一些驱动不能支持但仍可正常工作true/falsefalse
mapUnderscoreToCamelCase是否开启自动驼峰命名规则映射,即从经典数据库列名A_COLUMN到经典Java属性aCoulumn的类似映射true/falsefalse
logImpl指定Mybatis所有日志的具体实现,未指定时将自动查找SLF4J、LOG4J、
LOG4J2、JDK_LOGGING、
COMMONS_LOGGING、
STDOUT_LOGGING、
NO_LOGGING
未设置

6. 其他设置

  • typeHandlers(类型处理器)
  • objectFactory(对象工厂)
  • plugins(插件)
    • Mybatis Generator Core -> 自动生成mybatis代码
    • Mybatis plus -> 互补插件,提升Mybatis效率
    • 通用mapper

7. 映射器(Mapper)

MapperRegistry: 注册绑定我们的Mapper.xml文件

四种方式

  • 方式一:推荐使用
<!--使用相对路径的资源引用-->
<mappers>
<mapper resource="com/bsx/dao/UserMapper.xml"/>
</mappers>
方式二 <!--使用完全限定资源定位符URL--> 不推荐使用
  • 方式三:使用class文件绑定注册
<!--使用映射器接口实现类的完全限定类名-->
<mappers>
<mapper class="com.bsx.dao.UserMapper"/>
</mappers>
warning

接口和mapper.xml文件名字必须一致

接口和mapper.xml文件必须在同一包内

  • 方式四:将包内的映射器接口实现全部注册为映射器
<mappers>
<package name="com.bsx.dao"/>
</mappers>
warning

接口和mapper.xml文件名字必须一致

如果希望mapper.xml和接口文件分离,可以在resource目录下建与接口一样的包路径,编译后的文件会出现在同一路径

8. 生命周期

生命周期是至关重要的,因为错误的使用会导致非常严重的并发问题

  • SqlSessionFactoryBuilder
    • 一旦创建了SqlSessionFactory,就不再需要它了
    • 局部变量
  • SqlSessionFactory
    • 相当于数据库连接池
    • 一旦被创建应该在应用的运行期间一直存在,没有任何理由丢弃它或者重新创建另一个实例。多次重建SqlSessionFactroy会被视为一种不良操作。因此SqlSessionFactory的最佳作用域是应用作用域Application
    • 最简单的就是使用单例模式或者静态单例模式
  • SqlSession
    • 每个线程都应该有它自己的SqlSession实例。
    • 连接到连接池的一个请求
    • SqlSession实例不是线程安全的,因此不能被共享
    • 需要开启和关闭
    • 最佳作用域是方法作用域

每一个mapper代表一个具体的业务