mybatis的配置优化

1.5 配置解析(优化)

1.5.1 环境配置(environments)

MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中(比如需要不同的环境,mysql和oracle)

不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。

如果你想连接两个数据库,就需要创建两个 SqlSessionFactory 实例,每个数据库对应一个。

    <environments default="test">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=GMT%2B8&useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            dataSource>
            
        environment>
        <environment id="test">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=GMT%2B8&useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            dataSource>
        environment>
    environments>
1.5.2 类型别名(typeAliases)

​ 为实体类取别名

第一种方法:类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写

    <typeAliases>
        <typeAlias type="com.LSC.pojo.User" alias="User"/>
    typeAliases>

第二种方法:也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean,比如:

  <typeAliases>
       <package name="com.LSC.pojo"/>
    typeAliases>

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

<--user是实体类  首字母小写-->
<select id="getUserById" parameterType="int" resultType="user">
    select * from user where id=#{id}
select>

第一种方法适用于少量的或单一的实体类。

第二方法适用于大量的实体类。(但是我无论大量或单一还是偏向于第二种方法)

1.5.3 属性(properties)

数据库这些属性都是可外部配置且可动态替换的,既可以在典型的 Java 属性文件中配置,亦可通过 properties 元素的子元素来传递。具体的官方文档

我们来优化我们的配置文件(外接配置文件)

第一步 ; 在资源目录下新建一个db.properties

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=GMT%2B8&useSSL=false
username=root
password=123456

第二步 : 将文件导入properties 配置文件

<configuration>
   
   <properties resource="db.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="${username}"/>
               <property name="password" value="${password}"/>
           dataSource>
       environment>
   environments>
   <mappers>
       <mapper resource="mapper/UserMapper.xml"/>
   mappers>
configuration>
1.5.4 映射器(mappers)

引入资源方式(推荐还是使用第一种方式,保险一点)


<mappers>
 <mapper resource="org/mybatis/builder/PostMapper.xml"/>
mappers>

<mappers>
 <mapper url="file:///var/mappers/AuthorMapper.xml"/>
mappers>

<mappers>
 <mapper class="org.mybatis.builder.AuthorMapper"/>
mappers>

<mappers>
 <package name="org.mybatis.builder"/>
mappers>
1.5.5 作用域
  • 作用域理解

    • SqlSessionFactoryBuilder 的作用在于创建 SqlSessionFactory,创建成功后,SqlSessionFactoryBuilder 就失去了作用,所以它只能存在于创建 SqlSessionFactory 的方法中,而不要让其长期存在。因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。

    • SqlSessionFactory 可以被认为是一个数据库连接池,它的作用是创建 SqlSession 接口对象。因为 MyBatis 的本质就是 Java 对数据库的操作,所以 SqlSessionFactory 的生命周期存在于整个 MyBatis 的应用之中,所以一旦创建了 SqlSessionFactory,就要长期保存它,直至不再使用 MyBatis 应用,所以可以认为 SqlSessionFactory 的生命周期就等同于 MyBatis 的应用周期。

    • 由于 SqlSessionFactory 是一个对数据库的连接池,所以它占据着数据库的连接资源。如果创建多个 SqlSessionFactory,那么就存在多个数据库连接池,这样不利于对数据库资源的控制,也会导致数据库连接资源被消耗光,出现系统宕机等情况,所以尽量避免发生这样的情况。

    • 因此在一般的应用中我们往往希望 SqlSessionFactory 作为一个单例,让它在应用中被共享。所以说 SqlSessionFactory 的最佳作用域是应用作用域。

    • 如果说 SqlSessionFactory 相当于数据库连接池,那么 SqlSession 就相当于一个**数据库连接(**Connection 对象),你可以在一个事务里面执行多条 SQL,然后通过它的 commit、rollback 等方法,提交或者回滚事务。所以它应该存活在一个业务请求中,处理完整个请求后,应该关闭这条连接,让它归还给 SqlSessionFactory,否则数据库资源就很快被耗费精光,系统就会瘫痪,所以用 try…catch…finally… 语句来保证其正确关闭。

    • 所以 SqlSession 的最佳的作用域是请求或方法作用域。

你可能感兴趣的:(mybatis的配置优化)