Mybatis从入门到入土——别名配置文件以及引入mapper

Posted Java冢狐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis从入门到入土——别名配置文件以及引入mapper相关的知识,希望对你有一定的参考价值。

这是mybatis系列第4篇。没看前文的建议先去【Java冢狐】公众号中查看前文,方便理解和掌握

别名

为什么需要使用别名?

在xml文件中有很多需要类完整的类名的地方,十分的冗长,为了减轻我们的工作量和复杂度mybatis支持我们给某个类起一个别名,然后通过别名可以访问到指定的类型。

别名的用法

使用别名之前需要先在mybatis中注册别名,而注册别名有3种方式。

方式1

使用typeAlias元素进行注册

如下:

<typeAliases>
    <typeAlias type="完整的类型名称" alias="别名" />
</typeAliases>

typeAliases元素中可以包含多个typeAlias子元素,每个typeAlias可以给一个类型注册别名,有2个属性需要指定:

  • type:完整的类型名称
  • alias:别名

方式2

通过packege元素批量注册

上面我们通过typeAlias元素可以注册一个别名,如果我们有很多类需要注册,需要写很多typeAlias配置。

mybatis为我们提供了批量注册别名的方式,通过package元素,如下:

<typeAliases>
    <package name="需要扫描的包"/>
</typeAliases>

这个也是在typeAliases元素下面,不过这次使用的是package元素,package有个name属性,可以指定一个包名,mybatis会加载这个包以及子包中所有的类型,给这些类型都注册别名,别名名称默认会采用类名小写的方式,如UserModel的别名为usermodel

方式3

package结合@Alias批量注册并指定别名

方式2中通过package可以批量注册别名,但是容易出现多个类名相同的类。

所以在package方式批量注册别名的时候,我们可以给类中添加一个@Alias注解来给这个类指定别名:

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

当mybatis扫描类的时候,发现类上有Alias注解,会取这个注解的value作为别名,如果没有这个注解,会将类名小写作为别名,如同方式2。

别名不区分大小写

mybatis默认为很多类型提供了别名

别名的原理

mybatis允许我们给某种类型注册一个别名,别名和类型之间会建立映射关系,这个映射关系存储在一个map对象中,key为别名的名称,value为具体的类型,当我们通过一个名称访问某种类型的时候,mybatis根据类型的名称,先在别名和类型映射的map中按照key进行查找,如果找到了直接返回对应的类型,如果没找到,会将这个名称当做完整的类名去解析成Class对象,如果这2步解析都无法识别这种类型,就会报错。

别名使用建议

别名的方式可以简化类型的写法,原本很长一串的UserModel对象,现在只用写个user就行了,用起来十分的方便和简洁。但是从维护上面来讲,不是很方便。

所以建议自定义的类尽量别使用别名,而对mybatis中内置的一些别名我们需要知道。

属性配置文件详解

连接数据库的配置,我们是直接写在mybatis全局配置文件中的,但是上线以后可能需要进行一些改动切换数据库,并不是十分的优化,所以我们通常将一些需要运维修改的配置信息(如:db配置、邮件配置、redis配置等等各种配置)放在一个properties配文件中,然后上线时,只需要运维去修改这个配置文件就可以了,根本不用他们去修改和代码相关的文件。

mybatis也支持我们通过外部properties文件来配置一些属性信息。

mybatis配置属性信息有3种方式。

方式1:property元素中定义属性

属性定义

mybatis全局配置文件中通过properties元素来定义属性信息,如下:

<configuration>
    <properties>
        <property name="属性名称" value="属性对应的值"/>
    </properties>
</configuration>

上面通过property元素的方式进行配置属性信息:

  • name:属性的名称
  • value:属性的值。

如:

<property name="jdbc.driver" value="com.mysql.jdbc.Driver"/>
使用${属性名称}引用属性的值

属性已经定义好了,我们可以通过${属性名称}引用定义好的属性的值,如:

<property name="driver" value="${jdbc.driver}"/>

方式2:resource引入配置文件

方式1中,我们的配置文件还是写在全局配置文件中,mybatis支持从外部引入配置文件,可以把配置文件写在其他外部文件中,然后进行引入。

引入classes路径中的配置文件
<configuration>
    <properties resource="配置文件路径"/>
</configuration>

properties元素有个resource属性,值为配置文件相对于classes的路径,配置文件我们一般放在src/main/resource目录,这个目录的文件编译之后会放在classes路径中。

方式3:url的方式引入远程配置文件

mybatis还提供了引入远程配置文件的方式,如下:

<properties url="远程配置文件的路径" />

这次还是使用properties元素,不过使用的是url属性,如:

<properties url="http://itsoku.com/properties/config.properties" />

属性配置文件使用建议

上面我们说了3中方式,第2中方式是比较常见的做法,建议大家可以使用第二种方式来引入外部资源配置文件。

如果3种方式如果我们都写了,mybatis会怎么走?

  • 方式1和方式2都存在的时候,方式2的配置会覆盖方式1的配置。
  • 如果方式2和方式3都存在的时候,方式3会失效

mybatis会先读取方式1的配置,然后读取方式2或者方式3的配置,会将1中相同的配置给覆盖。

mybatis中引入mapper的3种方式

mapper xml文件是非常重要的,我们写的sql基本上都在里面,使用mybatis开发项目的时候,和mybatis相关的大部分代码就是写sql,基本上都是和mapper xml打交道。

编写好的mapper xml需要让mybatis知道,我们怎么让mybatis知道呢?

可以通过mybatis全局配置文件进行引入,主要有3种方式。

方式1:使用mapper resouce属性注册mapper xml文件

目前我们所涉及到的各种例子都是采用的这种方式,使用下面的方法进行引入:

<mappers>
    <mapper resource="Mapper xml的路径(相对于classes的路径)"/>
</mappers>

注意事项

  • 一般情况下,我们会创建一个和Mapper xml中namespace同名的Mapper接口,Mapper接口会和Mapper xml文件进行绑定
  • mybatis加载mapper xml的时候,会去查找namespace对应的Mapper接口,然后进行注册,我们可以通过Mapper接口的方式去访问Mapper xml中的具体操作
  • Mapper xml和Mapper 接口配合的方式是比较常见的做法,也是强烈建议大家使用的

方式2:使用mapper class属性注册Mapper接口

引入Mapper接口

mybatis全局配置文件中引入mapper接口,如下:

<mappers>
        <mapper class="接口的完整类名" />
</mappers>

这种情况下,mybais会去加载class对应的接口,然后还会去加载和这个接口同一个目录的同名的xml文件。

如:

<mappers>
        <mapper class="zhonghu.chat01.demo1.UserMapper" />
</mappers>

上面这种写法,mybatis会自动去注册UserMapper接口,还会去查找下面的文件:

zhonghu.chat01.demo1.UserMapper.xml

大家以后开发项目的时候估计也会看到这种写法,Mapper接口和Mapper xml文件放在同一个包中。

方式3:使用package元素批量注册Mapper接口

批量注册Mapper接口

上面说2种方式都是一个个注册mapper的,如果我们写了很多mapper,是否能够批量注册呢?

mybatis提供了扫描包批量注册的方式,需要在mybatis全局配置文件中加入下面配置:

<mappers>
    <package name="需要扫描的包" />
</mappers>

mybatis会扫描package元素中name属性指定的包及子包中的所有接口,将其当做Mapper 接口进行注册,所以一般我们会创建一个mapper包,里面放Mapper接口和同名的Mapper xml文件。

使用注意

方式3会扫描指定包中所有的接口,把这些接口作为Mapper接口进行注册,扫描到的类型只要是接口就会被注册,所以指定的包中通常我们只放Mapper接口,避免存放一些不相干的类或者接口。

关于配置和源码

本次讲解到的一些配置都是在mybatis全局配置文件中进行配置的,这些元素配置是有先后顺序的,具体元素是在下面的dtd文件中定义的:

http://mybatis.org/dtd/mybatis-3-config.dtd

建议大家去看一下这个dtd配置文件。

总结

  1. 掌握别名注册的3种方式,建议大家尽量少使用自定义别名
  2. 掌握属性配置3种方式
  3. 掌握mapper注册的3种方式及需要注意的地方

最后

  • 如果觉得看完有收获,希望能关注一下,顺便给我点个赞,这将会是我更新的最大动力,感谢各位的支持
  • 欢迎各位关注我的公众号【java冢狐】,专注于java和计算机基础知识,保证让你看完有所收获,不信你打我
  • 求一键三连:点赞、转发、在看。
  • 如果看完有不同的意见或者建议,欢迎多多评论一起交流。感谢各位的支持以及厚爱。

——我是冢狐,和你一样热爱编程。

欢迎关注公众号“ Java冢狐”,获取最新消息

以上是关于Mybatis从入门到入土——别名配置文件以及引入mapper的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点#MyBatis-plus 从入门到入土 !

Java从入门到入土

Flutter从入门到入土(报错总结)

mybatis 详解------properties以及别名定义

《SpringCloud 从入门到入土 》 第3章:服务治理:Spring Cloud Eureka

《SpringCloud 从入门到入土 》 第3章:服务治理:Spring Cloud Eureka