MyBatis核心配置

样子的木偶
样子的木偶
发布于 2023-12-14 / 21 阅读
0
0

MyBatis核心配置

Mybatis的核心对象

SqlSessionFactoryBuilde

SqlSessionFactoryBuilder的多个重载build()方法

由于build()方法中的参数environment和properties都可以为null,所以SqlSessionFactoryBuilder构建SqlSessionFactory对象的build()方法按照配置信息的传入方式,可以分为三种形式

形式一:SqlSessionFactoryBuilder构建build()方法

build(InputStream inputStream,String environment,Properties properties)

上述build()方法中,参数inputStream是字节流,它封装了XML文件形式的配置信息;参数environment和参数properties为可选参数。其中,参数environment决定将要加载的环境,包括数据源和事务管理器;参数properties决定将要加载的properties文件。

形式二:SqlSessionFactoryBuilder构建build()方法

build(Reader reader,String environment,Properties properties)

由上述build()方法可知,第二种形式的build()方法参数作用与第一种形式大体一致,唯一不同的是,第一种形式的build()方法使用InputStream字节流封装了XML文件形式的配置信息,而第二种形式的build()方法使用Reader字符流封装了xml文件形式的配置信息

build(Configuration config)

通过以上代码可知,配置信息可以通过InputStream(字节流)、Reader(字符流)、Configuration(类)三种形式提供给SqlSessionFactoryBuilder的build()方法。

以读取XML文件的方式构造SqlSessionFactory对象

通过过读取XML配置文件的方式构造SqlSessionFactory对象的关键代码如下所示。

// 读取配置文件
InputStream inputStream = Resources.getResourceAsStream("配置文件位置");
// 根据配置文件构建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = 
new SqlSessionFactoryBuilder().build(inputStream);

使用什么模式创建SqlSessionFactory对象

        SqlSessionFactory对象是线程安全的,它一旦被创建,在整个应用程序执行期间都会存在。如果我们多次创建同一个数据库的SqlSessionFactory对象,那么该数据库的资源将很容易被耗尽。通常每一个数据库都只创建一个SqlSessionFactory对象,所以在构建SqlSessionFactory对象时,建议使用单例模式。

SqlSessionFactory

SqlSessionFactory的openSession()方法

方法名称

描述

SqlSession openSession()

开启一个事务。

SqlSession openSession(Boolean autoCommit)

参数autoCommit可设置是否开启事务。

SqlSession openSession(Connection connection)

参数connection可提供自定义连接。

SqlSession openSession(TransactionIsolationLevel  level)

    参数level可设置隔离级别。

SqlSession openSession(ExecutorType execType)

    参数execType有三个可选值。

SqlSession openSession(ExecutorType  execType,Boolean  autoCommit)

    参数execType有三个可选值。

SqlSession openSession(ExecutorType  execType,Connection connection)

    参数ExecutorType有三个可选值。

openSession(ExecutorType execType)参数值

参数execType有三个可选值:

ExecutorType.SIMPLE:表示为每条语句创建一条新的预处理语句。

ExecutorType.REUSE:表示会复用预处理语句。

ExecutorType.BATCH:表示会批量执行所有更新语句。

openSession(ExecutorType  execType,Boolean  autoCommit)参数值

参数execType有三个可选值:

ExecutorType.SIMPLE:表示为每条语句创建一条新的预处理语句。

ExecutorType.REUSE:表示会复用预处理语句。

ExecutorType.BATCH:表示会批量执行所有更新语句。

参数autoCommit可设置是否开启事务。

openSession(ExecutorType  execType,Connection connection)参数

参数ExecutorType有三个可选值:

ExecutorType.SIMPLE:表示为每条语句创建一条新的预处理语句。

ExecutorType.REUSE表示会复用预处理语句。

ExecutorType.BATCH表示会批量执行所有更新语句。

参数connection可提供自定义连接。

SqlSession

SqlSession对象的作用

SqlSession是MyBatis框架中另一个重要的对象,它是应用程序与持久层之间执行交互操作的一个单线程对象,主要作用是执行持久化操作,类似于JDBC中的Connection。SqlSession对象包含了执行SQL操作的方法,由于其底层封装了JDBC连接,所以可以直接使用SqlSession对象来执行已映射的SQL语句。

SqlSession对象的使用范围

每一个线程都应该有一个自己的SqlSession对象,并且该对象不能共享。SqlSession对象是线程不安全的,因此其使用范围最好在一次请求或一个方法中,绝不能将其放在类的静态字段、对象字段或任何类型的管理范围(如Servlet的HttpSession)中使用。SqlSession对象使用完之后,要及时的关闭,SqlSession对象通常放在finally块中关闭,代码如下所示。

SqlSession sqlSession = sqlSessionFactory.openSession();
try {	
	// 此处执行持久化操作
} finally {		sqlSession.close();		}

Mybatis核心配置文件

MyBatis核心配置文件中的主要元素

<configuration>的子元素的执行顺序

<configuration>元素是整个XML配置文件的根元素,相当于MyBatis各元素的管理员。<configuration>有很多子元素,MyBatis的核心配置就是通过这些子元素完成的。需要注意的是,在核心配置文件中,<configuration>的子元素必须按照上图由上到下的顺序进行配置,否则MyBatis在解析XML配置文件的时候会报错。

<properties>元素

<properties>是一个配置属性的元素,该元素的作用是读取外部文件的配置信息。<properties>元素具体使用方式如下。在项目的src/main/resources目录下,创建一个名称为db.properties的配置文件,该文件主要用于配置数据库的连接信息。

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=root

在MyBatis核心配置文件mybatis-config.xml中使用<properties... />元素引入db.properties文件,以获取数据库连接信息。

<properties resource="db.properties" />

在MyBatis核心配置文件mybatis-config.xml中使用<property... />元素配置数据库驱动、连接数据库的URL、连接数据库的用户名和连接数据库的密码等数据库连接参数。

<dataSource type="POOLED">
    <!-- 数据库驱动 -->
    <property name="driver" value="${jdbc.driver}" />
    <!-- 连接数据库的url -->
    <property name="url" value="${jdbc.url}" />
    <!-- 连接数据库的用户名 -->
    <property name="username" value="${jdbc.username}" />
    <!-- 连接数据库的密码 -->
    <property name="password" value="${jdbc.password}" />
</dataSource>

db.properties文件实现动态参数配置

完成上述配置后,<dataSource>元素中连接数据库的4个属性(driver、url、username和password)值将会由db.properties文件中对应的值来动态替换。这样一来,<properties>元素就可以通过db.properties文件实现动态参数配置。由于使用properties配置文件来配置属性值可以在多个配置文件中使用这些属性值,并且方便后期的维护和修改,所以在实际开发中,使用properties配置文件来配置属性值是最常用的方式。

<settings>元素

<settings>元素中常见配置参数的使用方式

<settings>
    <!-- 是否开启缓存 -->
    <setting name="cacheEnabled" value="true" />
    <!-- 是否开启延迟加载,如果开启,所有关联对象都会延迟加载 -->
    <setting name="lazyLoadingEnabled" value="true" />
    <!-- 是否开启关联对象属性的延迟加载,如果开启,对任意延迟属性的调用都
    会使用带有延迟加载属性的对象向完整加载,否则每种属性都按需加载 -->
    <setting name="aggressiveLazyLoading" value="true" />
    ...
</settings>

<typeAliases>元素

<typeAliases>元素设置别名

核心配置文件若要引用一个POJO实体类,需要输入POJO实体类的全限定类名,而全限定类名比较冗长,如果直接输入,很容易拼写错误。这时可以使用<typeAliases>元素为POJO实体类设置一个简短的别名,再通过MyBatis的核心配置文件与映射文件相关联。例如,POJO实体类User的全限定类名是com.itheima.pojo.User,未设置别名之前,映射文件的select语句块若要引用POJO类User,必须使用其全限定类名,引用代码如下。

<select id="findById" parameterType="int"   resultType="com.itheima.pojo.User"> select * from users where uid = #{id}
</select>

多个全限定类设置别名的方式

          方式一:在<typeAliases>元素下,使用多个<typeAlias>元素为每一个全限定类逐个配置别名。

<typeAliases>
    <typeAlias alias=“Usertype="com.itheima.pojo.User"/>
    <typeAlias alias="Student" type="com.itheima.pojo.Student"/>
    <typeAlias alias="Employee" 	type="com.itheima.pojo.Employee"/>
    <typeAlias alias="Animal" type="com.itheima.pojo.Animal"/>
</typeAliases>

          方式二:通过自动扫描包的形式自定义别名。

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

常见Java类型的默认别名问题

          除了可以使用<typeAliases>元素为实体类自定义别名外,MyBatis框架还为许多常见的Java类型(如数值、字符串、日期和集合等)提供了相应的默认别名。例如别名_byte映射类型byte、_long映射类型long等,别名可以在MyBatis中直接使用,但由于别名不区分大小写,所以在使用时要注意重复定义的覆盖问题。

<environments>元素

<environments>元素配置运行环境

MyBatis可以配置多套运行环境,如开发环境、测试环境、生产环境等,我们可以灵活选择不同的配置,从而将SQL映射到不同运行环境的数据库中。不同的运行环境可以通过<environments>元素来配置,但不管增加几套运行环境,都必须要明确选择出当前要用的唯一的一个运行环境。

MyBatis的运行环境信息包括事务管理器和数据源。在MyBatis的核心配置文件中,MyBatis通过<environments>元素定义一个运行环境。<environments>元素有两个子元素,<transactionManager>元素和<daraSource>元素。<transactionManager>元素用于配置运行环境的事务管理器;<daraSource>元素用于配置运行环境的数据源信息。

使用<environments>元素进行配置的示例代码

<environments default="development">
    <environment id="development">
        <transactionManager type="JDBC" /><!—设置使用JDBC事务管理 -->
        <dataSource type="POOLED"> <!-配置数据源 -->
            <property name="driver" value="${jdbc.driver}" />
            <property name="url" value="${jdbc.url}" />
            <property name="username" value="${jdbc.username}" />
            <property name="password" value="${jdbc.password}" />
        </dataSource>
    </environment>	...
</environments>

<transcationManager>元素配置事务管理器

在MyBatis中,<transcationManager>元素可以配置两种类型的事务管理器,分别是JDBCMANAGED

•      JDBC:此配置直接使用JDBC的提交和回滚设置,它依赖于从数据源得到的连接来管理事务的作用域。

•      MANAGED:此配置不提交或回滚一个连接,而是让容器来管理事务的整个生命周期。默认情况下,它会关闭连接,但可以将<transcationManager>元素的closeConnection属性设置为false来阻止它默认的关闭行为。

MyBatis数据源类型

        项目中使用Spring+MyBatis,则没必要在MyBatis中配置事务管理器,实际开发中,项目会使用Spring自带的管理器来实现事务管理。对于数据源的配置,MyBatis提供了UNPOOLED、POOLED和JNDI三种数据源类型。

MyBatis映射文件

案例


评论