【MyBatis从入门到入土】2 - MyBatis配置、生命周期作用域

    技术2022-07-13  86

    文章目录

    MyBtis从入门到入土4 配置解析4.1 核心配置文件4.2 environments环境配置4.3 properties属性配置4.4 typeAliases别名配置4.5 settings设置配置4.6 Mapping映射器配置4.7 其他配置 5 生命周期和作用域

    MyBtis从入门到入土

    4 配置解析

    在上一篇博客实操的项目中,一开始需要在mybatis-config.xml文件中配置各种信息,这一次我们来深入解析这个配置文件 当然,最好的方式是结合MyBatis的官方文档来Configuration

    4.1 核心配置文件

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

    configuration(配置) properties(属性)settings(设置)typeAliases(类型别名)typeHandlers(类型处理器)objectFactory(对象工厂)plugins(插件)environments(环境配置) environment(环境变量) transactionManager(事务管理器)dataSource(数据源) databaseIdProvider(数据库厂商标识)mappers(映射器)

    4.2 environments环境配置

    首先我们从环境配置开始,以上一篇博客项目的mybatis-config.xml为例:

    <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <!-- xml中需要用 & 转义表示 & --> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8"/> <property name="username" value="root"/> <property name="password" value="mysql"/> </dataSource> </environment> </environments> 我们可以配置多个环境,也就是多个<enviroment></enviroment>,每个环境可以连接到一个数据库。(连接多个数据库的作用可以是用于生产和测试) 展示两个环境 <!-- dafault选择环境 --> <environments default="test"> <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> <environment id="test"> <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> 官网加粗了的一句话

    One important thing to remember though: While you can configure multiple environments, you can only choose ONE per SqlSessionFactory instance.* 一件很重要的事情需要去记住:虽然你可以配置多个环境,但每个SqlSessionFactory实例只能选择一个环境。

    MyBatis的默认的transactionManager是JDBC,默认的dataSource是POOLED,如果要了解和使用其他的可以直接上官网查询。

    4.3 properties属性配置

    在resources编写配置文件db.properties,这个文件含有数据库连接的配置信息 driver=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8 username=root password=mysql

    注意在配置文件里直接用&,不需要跟原来xml文件中的&这样的转义写法了

    接着在mybatis-config.xml配置文件中添加properties配置,注意,我们添加的这些配置是有顺序的,如果你不按照顺序的话,那么会报下面这个错误:

    The content of element type “configuration” must match “(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)”. 这个错误表示mybatis-config.xml中的<configuration></configuration>标签中元素位置不能随意,必须匹配其顺序要求。

    这样我们就可以在环境中直接引用属性中的值了 ,采用${value}的格式: <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <!-- xml中需要用 & 转义表示 & --> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment>

    4.4 typeAliases别名配置

    A type alias is simply a shorter name for a Java type. It’s only relevant to the XML configuration and simply exists to reduce redundant typing of fully qualified classnames. 别名是Java类名的简短名字。它对XML配置唯一的意义和存在是去减少冗余的全限定类名的输入。

    方式一:指定类名 在mybatis-config.xml中使用<typeAliases></typeAliases>配置别名信息 <typeAliases> <typeAlias type="com.cap.pojo.User" alias="user"></typeAlias> </typeAliases>

    起好别名后,就可以直接在UserMapping.xml中使用了

    <select id="getUserById" resultType="user" parameterType="int"> SELECT * FROM mybatis.user WHERE id = #{id}; </select> <update id="updateUser" parameterType="user" > UPDATE mybatis.user SET name=#{name},pwd=#{pwd} WHERE id=#{id}; </update> 方式二:指定包名 <typeAliases> <package name="com.cap.pojo"/> </typeAliases>

    指定包名的话,MyBatis会去扫描包下类别名注解@Alias("alias_name"),如果没有指明注解别名的话,MyBatis会默认使用小写首字母的类名作为别名,相当于:

    @Alias("user") public class User{ ... } 这里还有一些默认的内置名称,可以直接使用

    4.5 settings设置配置

    These are extremely important tweaks that modify the way that MyBatis behaves at runtime. 这是MyBatis中极为重要的调整设置,他们会改变MyBatis在运行时的行为。 下面列举比较重要的几个设置,其余可以见官网

    4.6 Mapping映射器配置

    映射器的作用是告诉MyBatis去哪里找我们定义的SQL映射语句。 官网提到的映射器配置有四种方式,下面列举三种最常用的方式,其中首推使用第一种方式,因为它最通用,也不像第二、第三种一样注意点多。

    方式一:使用相对于类路径的资源引用 <mappers> <mapper resource="com/cap/dao/UserMapping.xml"/> </mappers> 方式二:使用映射器接口实现类的完全限定类名 <mappers> <mapper class="com.cap.dao.UserMapping" /> </mappers>

    注意点:

    接口和它的配置文件必须同名:UserMapper接口和UserMapper.xml接口和它的配置文件必须在同一包下 方式三:将包内的映射器接口实现全部注册为映射器 <mappers> <package name="com.cap.dao"/> </mappers>

    注意点和方式二一样

    4.7 其他配置

    其他配置不常用,这里不展开描述

    typeHandlers(类型处理器)objectFactory(对象工厂)plugins(插件)

    5 生命周期和作用域

    我们知道MyBatis框架中持久层的流程大约如下: 那么我们来解析一下SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession这三个类的生命周期和作用域,如果你不了解他们的话,那么后期可能会造成严重的并发问题

    SqlSessionFactoryBuilder 一次性,使用它创建完SqlSessionFactory就可以抛弃它最好的作用域是存在于方法的局部变量 SqlSessionFactory 存在于程序运行的整个周期最好的作用域是作为全局作用域(即类变量/静态变量)

    There should be little or no reason to ever dispose of it or recreate it. 没有理由丢弃它再去重新创建该实例。

    它的实现方式有多种,最简单的可以使用单例模式或者静态单例模式创建它 SqlSession 每个线程应该有自己的SqlSession实例。SqlSession线程不安全,所以线程间不要共享。最好的作用域是一个请求或者方法的局部变量。用完之后必须关闭 Mapper Mapper是一些绑定映射语句的接口。Mapper的实例可以从SqlSession实例中获取Mapper实例最好的作用域是方法内的局部变量,并且你不需要显式地关闭它。

    尽管在整个请求作用域保留映射器实例不会有什么问题,但是你很快会发现,在这个作用域上管理太多像 SqlSession 的资源会让你忙不过来。 因此,最好将映射器放在方法作用域内。

    Processed: 0.011, SQL: 9