MyBatis-03-简单配置MyBatis

Posted PrimaBruceXu——多看,多记,多做,多练

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis-03-简单配置MyBatis相关的知识,希望对你有一定的参考价值。

四、配置MyBatis

4.1 核心配置文件——mybatis-config.xml

  • MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下:

  • configuration(配置)

    • properties(属性)
    • settings(设置)
    • typeAliases(类型别名)
    • typeHandlers(类型处理器)
    • objectFactory(对象工厂)
    • plugins(插件)
    • environments(环境配置)
      • environment(环境变量)
        • transactionManager(事务管理器)
        • dataSource(数据源)
    • 数据库厂商标识(databaseIdProvider)
    • 映射器(mappers)
  • 编写核心配置文件时,必须按照顺序进行

4.2 属性(properties)

  • 配置文件中的所有属性都可以在外部进行配置,并可以进行动态替换。

  • 你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。

  • 示例:

    • db.properties
    driver=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8
    username=root
    password=123456
    
    • mybatis-config.xml
    <properties resource="db.properties">
        <property name="password" value="111111"/>
    </properties>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${user}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    
  • 注意:如果配置文件中和xml标签中出现同名的属性,优先使用文件的中的值

4.3 类型别名(typeAliases)

  • 类型别名可为 Java 类型设置一个缩写名字。

  • 它仅用于 XML 配置,意在降低冗余的全限定类名书写。

  • 示例:

    • mybatis-config.xml

      <!--方式一-->
      <typeAliases>
      	<typeAlias type="com.pbx.pojo.User" alias="BruceUser"/>
      </typeAliases>
      
      <!--方式二-->
      <typeAliases>
      	<package name="com.pbx.pojo"/>
      </typeAliases>
      
    • 方式一:

      • 如果这样配置别名,那么可以在mapper.xml文件中任何需要使用 com.pbx.pojo.User的地方使用 BruceUser
    • 方式二:

      • 直接扫描包名情况下,默认别名为对应实体类的类名,首字母小写。如果实体类中使用了 @Alias(别名) 的注解,那么别名则为注解中定义的名称

4.4 环境配置(environments)

  • MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中

  • 尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。

    • 创建指定环境的SQLSessionFactory实例:

      SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment);
      SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, properties);
      
  • 事务管理器(transactionManager)

    • 在 MyBatis 中有两种类型的事务管理器(也就是 type="[JDBC|MANAGED]"):
    • JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。
    • MANAGED – 这个配置几乎没做什么。(一般不会使用)
  • 数据源(dataSource)

    • dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。有三种内建的数据源类型(也就是 type="[UNPOOLED|POOLED|JNDI]")

4.5 映射器(mappers)

1. mappers标签

  • 注册映射了SQL语句的文件

  • 每个mapper.xml文件必须在mybatis-config.xml文件中注册

  • 常用注册方式:

    • 方式一:使用相对于类路径的资源引用

      <mappers>
        <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
        <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
        <mapper resource="org/mybatis/builder/PostMapper.xml"/>
      </mappers>
      
    • 方式二:使用映射器接口实现类的完全限定名

      <mappers>
        <mapper class="org.mybatis.builder.AuthorMapper"/>
        <mapper class="org.mybatis.builder.BlogMapper"/>
        <mapper class="org.mybatis.builder.PostMapper"/>
      </mappers>
      
    • 方式三:包扫描模式,注册一个包下面的所有mapper.xml文件

      <mappers>
        <package name="org.mybatis.builder"/>
      </mappers>
      
    • 方式二和方式三注册的mapper.xml文件需要遵守命名规范,不然会找不到对应的文件

      • 使用和映射器接口实现类完全一样名称

2. mapper.xml文件

  • 文件示例

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
      PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
      "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="org.mybatis.example.BlogMapper">
      <select id="selectBlog" resultType="Blog">
        select * from Blog where id = #{id}
      </select>
    </mapper>
    
  • namespace:用于标识唯一的mapper接口实现文件,值要为mapper接口文件的完全限定路径

  • id:需要绑定接口中的函数名

  • resultType:绑定函数的返回值类型

  • parameterType:参数类型

    • 如果只有一个参数,可以省略返回值类型
    • 如果使用实体类作为参数,请使用实体类中的属性作为参数名
    • 如果使用map作为参数,请使用map中的key作为参数名(多个参数或者实体类中存在多个与业务操作无关的属性)

4.6 作用域(Scope)和生命周期

  • 作用域和生命周期类别是至关重要的,错误的使用会导致非常严重的并发问题。

  • MyBatis运行流程图

    技术图片

  • SqlSessionFactoryBuilder (类似于JDBC中创建连接池的操作)

    • 这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。
    • 最佳作用域是方法作用域(也就是局部方法变量)
  • SqlSessionFactory(类似于JDBC中的连接池)

    • SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。
    • 使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次,多次重建 SqlSessionFactory 被视为一种代码“坏习惯”。
    • 最佳作用域是应用作用域。 有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。
  • SqlSession (类似于JDBC中的连接数据库)

    • 每个线程都应该有它自己的 SqlSession 实例。
    • SqlSession 的实例不是线程安全的
    • 最佳的作用域是请求或方法作用域。
      • 绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。
      • 也绝不能将 SqlSession 实例的引用放在任何类型的托管作用域中,比如 Servlet 框架中的 HttpSession。
      • 如果你现在正在使用一种 Web 框架,考虑将 SqlSession 放在一个和 HTTP 请求相似的作用域中。 换句话说,每次收到 HTTP 请求,就可以打开一个 SqlSession,返回一个响应后,就关闭它。
    • 这个关闭操作很重要,如果不及时关闭,会导致资源的浪费与性能的降低
  • 总结

    • SqlSessionFactoryBuilder在SqlSessionFactory被创建之后就可以嗝屁了
    • SqlSessionFactory在应用运行期间有且只能存在一个
    • SqlSession用完之后要养成随手关闭的习惯

以上是关于MyBatis-03-简单配置MyBatis的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis-03-笔记

MyBatis-Plus03_分页插件自定义分页

mybatis-03

MyBatis-Plus03_分页插件自定义分页

MYBATIS03_全局配置文件environmentspropertiesmappertypeAliassettings标签详解

MyBatis 03