1. mybatis 可以使用properties标签来引入外部properties配置文件的内容。properties标签下有两个属性,一个属性是“url”,用来引入网络路径或者磁盘路径下的资源;另一个属性是“resource”,用来引入类路径下的资源。
举例说明,将第(一)篇文章中的项目“ctrl+c”,“ctrl+v”后,弹出如下窗口。将project name改为Mybatis-config。
在conf目录下新建dbconfig.properties文件,文件写入如下内容:
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&useSSL=false
jdbc.username=root
jdbc.password=root
注意:在properties配置文件中,jdbc.url参数中多个参数的连接符不再像配全局配置文件中那样用&代替&,而是直接用&,如下所示
即把原来全局配置文件中的数据库连接池中的参数改写到properties文件中,原先mybatis全局配置文件中内容如下:
通过在配置文件中使用properties标签,并将数据库连接池的参数写到properties文件中后,其中的代码变成了下述这样,即在properties标签的resource属性设置为properties的文件名(前提是该文件在该项目的路径下,如果不在就要写绝对路径…/…/…):
typeAliases(别名处理器)是为了给Java类型起一个别名,以避免每次都要写很长的类名。在mybatis的全局配置文件中,为JavaBean类型起别名,如下所示:
typeAliases下的typeAlias标签有两个属性,一个type,一个alias,如果只给type赋值,这种方式默认给com.mybatis.beans.Employee起的别名为类名的小写employee,这时需要在EmployeeMapper.xml文件中将resultType的值改为employee,如下所示:
当然如果加上alias,就是自己随意命名了。如下:
此时EmployeeMapper.xml文件中resultType也要作相应的改动,如下:
上述方式只能为一个JavaBean类取别名,如果这个包下面有很多JavaBean,就要用到typeAliases下的package标签为包下的JavaBean类批量取别名,package下的name属性值为包名。如下所示:
将com.mybatis.beans包下的所有JavaBean类,全部起别名为默认别名,即类名的小写。这时需要更改EmployeeMapper.xml中的resultType值为employee,如下所示,由于本项目com.mybatis.beans包下只有一个JavaBean类–Employee,所以相当于只给一个JavaBean起了别名employee。
package批量取别名中如果想要为某个JavaBean单独取别名,可以采用注解的方式,即在某个Javabean类的签名上写@Alias(“别名名称”),如下所示
这样使用时以注解中取的别名为准,而不再使用批量取别名中的命名。所以在EmployeeMapper.xml文件中resultType值应该改为“emp”,如果再mybatis全局配置文件中给某个类单独取了别名,则以该别名为准,而不再使用注解中的别名(即如果采用了typeAlias给某个类单独取了别名,而该类上又用了注解取了另外一个别名,则以前者为准,注解名不再生效)。mybatis已经为常见的Java类型内建了相应的别名,这些已经建好的别名是不区分大小写的,所以需要注意的是不要再用内建好的别名(大小写都不行)作为JavaBean的别名,否则必报错。如下表格:
别名 | Java的常见类型 |
---|---|
_byte | byte |
_long | long |
_short | short |
_int | int |
_integer | int |
_double | double |
_float | float |
_boolean | boolean |
string | String |
byte | Byte |
long | Long |
short | Short |
int | Integer |
integer | Integer |
double | Double |
float | Float |
boolean | Boolean |
date | Date |
bigdecimal | BigDecimal |
object | Object |
map | Map |
hashmap | HashMap |
list | List |
arraylist | ArrayList |
colletion | Collection |
iterator | Iterator |
mybatis全局配置文件可以配置多种环境,即在environments标签下配置多个environment,但environment下必须有transactionManager和dataSource两个标签。
environment中的id代表当前环境的唯一标识,比如如果有测试环境的数据库和正式环境的数据库,则可以通过设置environments中的default属性来决定和哪个数据库进行交互,如下图:
这样就可以实现快速切换。
transactionManager为事务管理器,而其中的type属性为事务管理器的类型,可以有两个取值,JDBC和MANAGED,也可以自定义事物管理器类型。
dataSource为数据源,数据源中的type属性有UNPOOLED、POOLED、JNDI三种类型,也可以自定义。UNPOOLED为不使用连接池,每一次CRUD操作,都会从数据库中拿一下新的连接,而不使用连接池。POOLED则使用了连接池。
databaseIdProvider标签用来支持多数据库厂商,下述是固定写法,作用是得到数据库厂商标识,mybatis就能根据不同的数据库厂商标识执行不同的sql,比如常见的标识MySQL,Oracle,SQL Server等
我们可以在databaseIdProvider标签里给不同的数据库厂商起别名,如下所示:
这个时候需要转到SQL映射文件中,比如本项目中的EmployeeMapper.xml,如下所示:
select标签下有databaseId属性,将其赋值为“mysql”,则是告诉这条sql语句只在MySQL数据库中使用。使用多个数据库厂商的情况下,Mybatis-config.xml、dbconfig.properties、EmployeeMapper.xml代码如下,使用这个标签后可提高mybatis数据库的移植性。在全局配置文件中配置两个环境,一个是MySQL的环境,一个是oracle的环境,在sql映射文件中写不同数据库下的操作语句,当全局配置文件中选择MySQL时(即在environments中的default属性选择),就会在sql映射文件中找MySQL的语句。
dbconfig.properties内容(使用时删掉这句)
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&useSSL=false
jdbc.username=root
jdbc.password=root
orcl.driver=oracle.jdbc.OracleDriver
orcl.url=jdbc:oracle:thin:@localhost:1521:orcl
orcl.username=scott
orcl.password=123456
把sql的映射文件使用mapper标签注册到全局配置文件中,mapper有resource、url、class三种属性。resource用来引用类路径下的sql映射文件,url用来引用网络路径下或者磁盘下的映射文件。上述两种方式都是用来注册配置文件的。class用来引用注册接口,如果使用注册接口方式,则sql映射文件必须和接口同名,并且放在与接口同一目录下,举例说明,原先使用注册配置文件方式目录如下,全局配置文件中mapper标签配置如下:
使用注册接口方式后目录如下,mapper标签中的内容变成了下面这样,其中class属性值为接口的全类名。
mybatis还允许以没有sql映射文件,采用注解的方式,将所有的sql语句写在注解里。如下例子,在com.mybatis.Dao包下新建EmployeeMapperAnnotation.java接口,内容如下;
将select标签写在该接口的注解里,而不使用sql映射文件,修改MybatisTest.java中的类变为EmployeeMapperAnnotation,如下所示:
全局配置文件中的mapper标签配置成EmployeeMapperAnnotation接口的全类名,如下所示:
运行之后发现也没问题。这种方式是不推荐的,因为sql语句和代码分离也是mybatis的一个初衷,直接把sql语句写在接口方法的签名上面,是违背这个初衷的,还是建议大家写在sql映射文件里。
运行之后发现也没问题。这种方式是不推荐的,因为sql语句和代码分离也是mybatis的一个初衷,直接把sql语句写在接口方法的签名上面,是违背这个初衷的,还是建议大家写在sql映射文件里。当然也可以采用混合的方式(有的接口配映射文件,有的接口写注解)。
mappers(复数)标签下面还有一个package标签,用来批量注册。package的name属性需要写接口的包名,如果接口采用了注解的方式自然可以找到,如果采用的是配置文件,则必须把配置文件和接口名写为一致并放在同一个目录下,这样才能找得到,如下所示:
全局配置文件mappers标签下的内容如下图:
直接先测试注解方式的接口发现没问题,紧接着测试采用配置文件的接口,只需把测试类中的类名改为EmployeeMapper即可,发现也没问题。可以在conf目录下建com.mybatis.Dao包,专门用来放sql的配置文件,防止接口和映射文件过多导致混乱,这样既保障了接口和配置文件在一个包中(事实上确实在一个包内),在文件分类上又显得很简洁,视觉效果在两个位置,其实在一个包内,如下图,运行起来没问题
常用的标签有如下顺序:
(properties?, settings?, typeAliases?, typeHandlers?, objectFactory?,
objectWrapperFactory?, reflectorFactory?, plugins?, environments?, databaseIdProvider?, mappers?)
全局配置文件必须严格按照这样的顺序进行配置,某些标签可以没有,但必须保障先后顺序是否正确,否则报错。