Mybatis 框架学习(三)—— 配置优化

2022-06-14 15:08:30 浏览数 (1)

文章目录

  • Mybatis 框架学习(三)—— 配置优化
    • 1.环境配置
      • (1)transactionManger 事务管理器
      • (2)dataSource 数据源
    • 2.properties(属性)
      • (1)引入外部properties文件
      • (2)在properties属性中 添加propertie 标签
      • (3)外部引入和内部标签搭配使用
      • (4)外部文件和内部标签 属性冲突
    • 3.typeAliases 类型别名
      • (1) 通过标签给实体类起别名
      • (2) 通过typeAliases 中的 标签扫描一个包
      • (3)@Alias 注解自定义类名
    • 4.Mapper 映射器
      • (1) 使用 resource属性,把对应的xml文件路径给写入
      • (2)使用接口(class文件)绑定注册
      • (3) 通过package 绑定注册

Mybatis 框架学习(三)—— 配置优化

1.环境配置

根据官方文档所说,mybatis可以适应多种环境

我们再看之前我们写的mybatis-config 发现是一个 environments标签,里面可以有多个 environment标签,表示多套配置

那么mybtais怎么决定使用那一套配置呢?

environments 有个属性 default

environment 有个属性 是id

default 填入想要使用环境的 id 即可,此时mybtais就是用 该id的环境作为默认

接下来就是介绍环境配置中的具体标签了

(1)transactionManger 事务管理器

先看官方文档

总结: mybatis 有两种事务管理器,一个是JDBC,一个是Managed

JDBC – 这个配置使用JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。

Managed 这个配置什么也没做。

咱们使用mybtais 一般默认就用 JDBC

(2)dataSource 数据源

数据源类型

看官方文档

再总结一下,数据源类型通常用 POOLED 或者 UNPOOLED

从英文的角度我们就能看出区别了,pooled 池子,unpooled 没有池子

pooled

数据库连接跟池子有关,如果是pooled类型,每次请求连接数据库,第一次连接使用完毕,不会被回收,而是放到池子里等待再次连接,避免了创建新连接的初始化等操作的时间,时间很快

unpooled

每次请求连接数据库 使用完毕时候,这个连接就被回收了,下一次再发送请求的时候,又要重新的创建新的连接等待初始化 。

数据源属性

这就是 diver url username password 这些连接数据库的信息了、

2.properties(属性)

在之前的mybatis-config文件中,dataSource中的数据库信息是我们直接填入的,但是写到properties 配置中,动态进行替换。

先看官方文档

总结:

属性的信息,可以引入外部的properties文件,properties 元素的子元素中设置

设置好的属性可以在整个配置文件中用来替换需要动态配置的属性值

(1)引入外部properties文件

在resources目录下创建一个 db.properties 文件存放数据库连接信息

代码语言:javascript复制
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/abc?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT
username=root
password=123456

在mybtis-config 引入外部的properties文件

代码语言:javascript复制
    <properties resource="db.properties"/>

注意:properties 标签一定是放在 配置文件的前面的

每个标签都必须按照其顺序进行放置

将datasource中的数据库信息替换成 properties中的信息

使用 ${ properties属性名}

代码语言:javascript复制
<dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
(2)在properties属性中 添加propertie 标签
代码语言:javascript复制
    <properties>
        <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://127.0.0.1:3306/abc?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </properties>
(3)外部引入和内部标签搭配使用

db.properties 外部文件

代码语言:javascript复制
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/abc?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT

properties内部标签

代码语言:javascript复制
    <properties resource="db.properties">
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </properties>
(4)外部文件和内部标签 属性冲突

直接说吧,mybatis-config 如果命名冲突,那么是以 db.properties为 第一选择的。

这里有个优先级

外部配置文件>内部属性标签

3.typeAliases 类型别名

这个也是核心配置中的属性

主要的作用是 可以给类名减少 全限定名的冗余,就是不用写那么长了

有的type 目录很多,要写很长的类型全限定名,很麻烦,于是typeAliases标签可以 给类型重命名

这个标签也得按照顺序才能放,如果放在其他位置就会报错

下面介绍如何重命名

(1) 通过标签给实体类起别名
代码语言:javascript复制
    <typeAliases>
        <typeAlias type="pojo.Student" alias="Student"/>
    </typeAliases>

之后我们在写 pojo.Student 的全限定名的时候,可以直接用 Student

(2) 通过typeAliases 中的 标签扫描一个包

package包中放的 实体类信息,默认把名字改成首字母小写的格式

代码语言:javascript复制
<typeAliases>
    <package name="pojo"/>
</typeAliases>
代码语言:javascript复制
    <select id="getStudentList" resultType="student">
       select * from student
   </select>

如果实体类非常多,建议使用这种方式。

但是呢,这两种有个区别,第一种使用 标签可以自己DIY类名,随便起名字

第二种方式使用 标签如果默认情况下,改成类名首字母小写,如果非要给成自己希望定的名字,那么就要使用@Alias注解搭配使用

(3)@Alias 注解自定义类名

前提是搭配使用,一定要记住,我在这里犯了错误报异常处理了很久没意识到。

首先扫描实体类所在的包

代码语言:javascript复制
 <typeAliases>
        <package name="pojo"/>
    </typeAliases>

然后如果想要自定义类名,那么在对应的实体类上面加上@Alias注解,括号里写上自定义的名字

代码语言:javascript复制
@Alias("hello")
public class Student {}

在使用到 Student类的时候,就不用写全限定名,只需要写 hello 即可

注意@Alias 前提是搭配标签使用的,先扫描包在改类名

4.Mapper 映射器

Mapper映射器 的作用就是把 接口对应的mapper.xml 给注册到 核心配置中

注册方式有几种

(1) 使用 resource属性,把对应的xml文件路径给写入

路径和路径之间使用/

代码语言:javascript复制
    <mappers>
        <mapper resource="mapper/StudentMapper.xml"/>
    </mappers>
(2)使用接口(class文件)绑定注册
代码语言:javascript复制
    <mappers>
        <mapper class="mapper.StudentDao"/>
    </mappers>

class 属性填的是 接口的路径

这种注册方式存在很大问题

1.接口 和 xml文件 不在同一个包下,会报异常

2.接口 和 xml文件 名字不一样,会报异常

(3) 通过package 绑定注册
代码语言:javascript复制
   <mappers>
        <package name="mapper"/>
    </mappers>

直接使用package标签,扫描包里面的接口和xml文件,实现注册

也存在和第二种方式一样的问题

1.接口 和 xml文件 不在同一个包下,会报异常

2.接口 和 xml文件 名字不一样,会报异常

我们实际中根据自己的习惯来决定使用哪种配置方式。推荐使用第一种方式。

0 人点赞