【Mybatis系列】MyBatis配置解析

通过入门学习后,我们很容易发现,mybatis的重点在于核心配置文件,mybatis的配置文件包含了会深入影响mybatis行为的设置和属性信息。下面我们就来针对核心配置文件中进行深入的学习。
 

一、environments元素

1、如下所示,配置好的属性可以在整个配置文件中用来替换要动态配置的属性值。另外mybatis中可以有多套运行环境,将SQL映射到多个不同的数据库上,但是必须指定其默认的运行环境:<environments default="development">

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

2、这个实例中的username和password将会有properties元素中设置的相应的值来替换。

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

3、当然这里需要我们在核心配置文件中进行引入,还可以像实例中这样即在properties文件中配置,同时也可以在核心配置文件中配置,如果同时有配置,他们先执行的外部配置文件。

<!--引入外部配置文件:优先使用外部配置文件-->
<properties resource="db.properties">
    <property name="username" value="root"/>
    <property name="password" value="root"/>
</properties>

4、重点属性讲解:

  • default:指定默认的运行环境,可以选择任意一个environment节点的id
  • environment:子元素节点
  • dataSource:数据源,这里一般都使用标准的JDBC连接对象的资源<transactionManager type="JDBC"/>,其实这里有三种内建的数据源类型type="[UNPOOLED | POOLED | JNDI]"
  • transactionManager:事务管理器<transactionManager type="JDBC"/>
  • JDBC – 这个配置就是直接使用了JDBC的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。
  • MANAGED – 这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如JEE应用服务器的上下文)。默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将closeConnection属性设置为false来阻止它默认的关闭行为。
  • unpooled:这个数据源的实现只是每次被请求时打开和关闭连接。
  • pooled:这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来 , 这是一种使得并发 Web 应用快速响应请求的流行处理方式。这是我们最常用的一种。
  • jndi:这个数据源的实现是为了能在如 Spring 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。
 

二、mappers元素

mappers元素:映射器,主要定义映射SQL语句文件
 

1、使用相对路径进行配置

<mappers>
    <mapper resource="com/jason/dao/Mapper.xml"/>
</mappers>

2、使用绝对路径进行配置

<mappers>
    <mapper resource="file:///var/dao/Mapper.xml"/>
</mappers>

3、使用接口信息进行配置

<mappers>
    <mapper class="com.jason.dao.Mapper"/>
</mappers>

4、使用接口所在的包进行配置

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

三、Mapper文件

MyBatis 的真正强大在于它的映射语句,这是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。
 

1、具体代码如下:

<?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="com.jason.dao.UserDao">

</mapper>

2、namespace:命名空间,这个必须跟某个接口同名,接口中的方法与映射文件中的SQL语句id应该一一对应。

接口如下:
public interface UserDao {
  List<User> getUserList();
}

Mapper文件中的SQL语句:

<mapper namespace="com.jason.dao.UserDao">
    <select id="getUserList" resultType="user">
      select * from mybatis.user ;
    </select>
</mapper>

3、namespace和子元素的id联合保证唯一,绑定DAO接口,命名规则是:报名+类名

 

四、typeAliases优化

类型别名是为了java类型设置的一个短的名字,他只和XML配置有关,存在的意义仅仅在于用来减少完全限定名的冗余。
 

1、配置别名注意顺序,下面的配置中User可以使用在com.jason.pojo.User的地方:

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

2、我们也可以指定一个包名,在没有注解的情况下,会使用Bean的首字母小写的非限定类名来作为他的别名

<typeAliases>
    <!--给包起别名-->
    <package name="com.jason.pojo"/>
</typeAliases>

如果有注解,别名就是其注解值,

@Alias("user")
public class User {
}

五、对象工厂

MyBatis 每次创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成。默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认构造方法,要么在参数映射存在的时候通过有参构造方法来实例化。如果想覆盖对象工厂的默认行为,则可以通过创建自己的对象工厂来实现。
 

1、结构图

 

2、SqlSessionFactoryBuilder

这个类可以在任何时候被实例化、使用和销毁。一旦您创造了SqlSessionFactory 就不需要再保留它了。SqlSessionFactoryBuilder 实例的最好的作用域是方法体内(即一个本地方法变量)。
 

3、SqlSessionFactory

一旦创建,SqlSessionFactory 将会存在于您的应用程序整个运行生命周期中。很少或根本没有理由去销毁它或重新创建它。最佳实践是不要在一个应用中多次创建SqlSessionFactory。所是SqlSessionFactory 最好的作用域范围是一个应用的生命周期范围。这可以由多种方式来实现,最简单的方式是使用Singleton 模式或静态Singleton 模式。但这不是被广泛接受的最佳做法,相反,您可能更愿意使用像Google Guice 或Spring 的依赖注入方式。这些框架允许您创造一个管理器,用于管理SqlSessionFactory 的生命周期。
 

4、SqlSession

每个线程都有一个SqlSession 实例,SqlSession 实例是不被共享的,并且不是线程安全的。因此最好的作用域是request 或者method。决不要用一个静态字段或者一个类的实例字段来保存SqlSession 实例引用。也不要用任何一个管理作用域,如Servlet 框架中的HttpSession,来保存SqlSession 的引用。如果您正在用一个WEB 框架,可以把SqlSession 的作用域看作类似于HTTP 的请求范围。也就是说,在收到一个HTTP 请求,您可以打开一个SqlSession,当您把response 返回时,就可以把SqlSession 关闭。关闭会话是非常重要的,您应该要确保会话在一个finally 块中被关闭。
 
 
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术蜗牛-阿春

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值