(四)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配置文件。
总结
- 掌握别名注册的3种方式,建议大家尽量少使用自定义别名
- 掌握属性配置3种方式
- 掌握mapper注册的3种方式及需要注意的地方
最后
- 如果觉得看完有收获,希望能关注一下,顺便给我点个赞,这将会是我更新的最大动力,感谢各位的支持
- 欢迎各位关注我的公众号【java冢狐】,专注于java和计算机基础知识,保证让你看完有所收获,不信你打我
- 求一键三连:点赞、转发、在看。
- 如果看完有不同的意见或者建议,欢迎多多评论一起交流。感谢各位的支持以及厚爱。
——我是冢狐,和你一样热爱编程。
欢迎关注公众号“Java冢狐”获取最新消息