MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。
具体学习可以结合官方文档:https://mybatis.org/mybatis-3/zh/configuration.html
mybatis 可以通过 properties 标签来引入外部 properties 配置文件里的内容。
最常见的就是引入外部配置文件里的数据库连接信息,在之前的 mybatis 配置文件里是写死的,现在来引入我们项目配置文件application.properties
里的数据库信息.
那么 mybatis 配置文件现在可以这么写:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <properties resource="application.properties"></properties> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${spring.datasource.driver-class-name}"/> <property name="url" value="${spring.datasource.url}"/> <property name="username" value="${spring.datasource.username}"/> <property name="password" value="${spring.datasource.password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="UserMapper.xml"/> </mappers> </configuration>
在标签<<properties>
中:
resource
:读取类路径下属性文件url
:指定的路径读取属性文件,并覆盖之前读取过的同名属性引入配置文件application.properties
之后就可以使用${}
来使用配置文件里的属性名了。
这是 MyBatis 中极为重要的设置,会改变 MyBatis 运行时的行为。文档里的设置项很多,可以逐个看下混个脸熟,以后使用到的时候知道哪里找。
比如mapUnderscoreToCamelCase
,作用是: 是否开启驼峰命名自动映射,即从经典数据库列名A_COLUMN
映射到经典 Java 属性名aColumn
。
举个栗子:
数据库字段:user_name,开启配置后,就可以映射 java 属性名 userName
配置文件这样写:
... <settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> ...
类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,方便引用的时候使用。
比如在 xml 文件UserMapper.xml
中:
<mapper namespace="com.pingguo.bloomtest.dao.UserMapper"> <select id="getUserById" resultType="com.pingguo.bloomtest.pojo.User"> select * from user where id = #{id} </select> </mapper>
返回类型resultType
是com.pingguo.bloomtest.pojo.User
,全类名有点长,给它起个别名。
回到全局配置文件mybatis-config.xml
中:
<typeAliases> <typeAlias type="com.pingguo.bloomtest.pojo.User" alias="user" /> </typeAliases>
type
: 写上全类名alias
: 不写的话默认是类名小写然后引用的时候就可以使用别名:
<mapper namespace="com.pingguo.bloomtest.dao.UserMapper"> <select id="getUserById" resultType="user"> select * from user where id = #{id} </select> </mapper>
标签<typeAlias>
一次只可以给一个类型起别名,如果要起别名的很多,可以进行批量处理。
使用package
标签:
<typeAliases> <!--<typeAlias type="com.pingguo.bloomtest.pojo.User" alias="user" />--> <package name="com.pingguo.bloomtest.pojo" /> </typeAliases>
name
:指定包名,为这个包以及下面的所有后代包的每一个类都起一个默认别名(类名小写)如果引用的时候resultType="User"
我换成大写开头,运行也是OK的,别名不区分大小写。
假如com.pingguo.bloomtest.pojo
包下还有一个子包,而这个子包下面也有一个类叫User
,这时候就是别名冲突了,mybatis 运行报错。
可以使用@Alias
给类指定别名:
@Alias("User2") public class User { @TableId(type = IdType.ID_WORKER) private Long id; private String username; private String password; ...
mybatis 有为常见的 Java 类型内建的类型别名。它们都是不区分大小写的,采取了特殊的命名风格。
我们自定义别名的时候不要与内置的重复。
不过不用别名,就用全类名也有好处。比如在用 idea编辑器,可以直接按住ctrl+左击
类名跳过去,很方便。
类型处理器的作用,简单来说就是架起了java 类型和数据库类型一一映射的桥梁。
比如 java 对象中的 String 类型的变量,保存到数据库兼容的 varchar 或者 char。
这部分就先混个脸熟先,后续涉及到对应知识点再进一步学习。
MyBatis 允许你在映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:
这4个对象里有很多各自的方法(括号里),通过插件可以在方法执行之前做一些自定义的处理,来改变一些默认行为。
这里同样混脸熟,后续学习了mybatis 运行机制和原理的时候,再进一步学习。
MyBatis 可以配置多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中。
在之前已经用过这个标签<environments>
:
<environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${spring.datasource.driver-class-name}"/> <property name="url" value="${spring.datasource.url}"/> <property name="username" value="${spring.datasource.username}"/> <property name="password" value="${spring.datasource.password}"/> </dataSource> </environment> </environments>
其中<environment>
可以配置一个具体的环境信息,id
代表当前环境的唯一标识,可以通过default
动态的指定当前我要使用的环境。
另外,里面还有2个不可或缺的标签:transactionManager
和 dataSource
。
transactionManager
事务管理器,type
是管理器的类型。
在 MyBatis 中有两种类型的事务管理器:
如果我们使用Spring + MyBatis
,则没有必要配置事务管理器,因为 Spring 模块会使用自带的管理器来覆盖前面的配置。
dataSource
数据源,type
是数据源的类型。有三种内建的数据源类型:
UNPOOLED
: 这个数据源的实现会每次请求时打开和关闭连接。虽然有点慢,但对那些数据库连接可用性要求不高的简单应用程序来说,是一个很好的选择。 性能表现则依赖于使用的数据库,对某些数据库来说,使用连接池并不重要,这个配置就很适合这种情形POOLED
: 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。 这种处理方式很流行,能使并发 Web 应用快速响应请求。JNDI
: 这个数据源实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的数据源引用。MyBatis 可以根据不同的数据库厂商执行不同的语句,databaseIdProvider
这个标签其实就是 mybatis 在一致性方面的作为。
你只需要告诉 mybatis 你写的 sql 是属于哪个数据库厂商下的,那么它就可以动态的根据数据库厂商标识,来发送不同的sql语句。
<databaseIdProvider type="DB_VENDOR"> <property name="MySQL" value="mysql"/> <property name="DB2" value="db2"/> <property name="Oracle" value="oracle" /> </databaseIdProvider>
这个DB_VENDOR
,作用就是得到数据库厂商的标识(驱动自带获取厂商标识的方法)。
name
设置不同的数据库标识,value
可以设置别名。
最后,需要在 sql映射文件里告诉mybatis 这条 sql 是又哪个厂商去执行:
<mapper namespace="com.pingguo.bloomtest.dao.UserMapper"> <select id="getUserById" resultType="com.pingguo.bloomtest.pojo.User" databaseId="mysql"> select * from user where id = #{id} </select> </mapper>
这里databaseId
里的值就是上面配置的别名。
既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要来定义 SQL 映射语句了。
mappers
标签就是将 sql 映射注册到全局配置文件中去,比如之前写的:
<mappers> <mapper resource="UserMapper.xml"/> </mappers>
每个<mapper>
注册一个 sql映射,其中又会涉及到如下几个属性:
<!-- 使用相对于类路径的资源引用 --> <mappers> <mapper resource="org/mybatis/builder/AuthorMapper.xml"/> <mapper resource="org/mybatis/builder/BlogMapper.xml"/> <mapper resource="org/mybatis/builder/PostMapper.xml"/> </mappers>
<!-- 使用完全限定资源定位符(URL) --> <mappers> <mapper url="file:///var/mappers/AuthorMapper.xml"/> <mapper url="file:///var/mappers/BlogMapper.xml"/> <mapper url="file:///var/mappers/PostMapper.xml"/> </mappers>
上面2个是注册配置文件的,而这个是用来注册接口的,里面写接口全类名
<!-- 使用映射器接口实现类的全类名 --> <mappers> <mapper class="com.pingguo.bloomtest.dao.UserMapper"/> </mappers>
但是要注意:sql映射文件必须和接口同名,并且放在同一目录下。
另外,注册接口的情况下,也是可以不写 sql 映射文件的,所有的sql都利用注解写在接口上。
public interface UserMapper { @Select("select * from user where id = #{id}") User getUserById(Integer id); }
感觉写注解很方便啊?可以mybatis好不容易让sql与代码分离这不又回去了?
没关系,混合用就好了。可以把比较重要的、复杂的用来写 sql映射文件,简单的可以写注解里,方便快速开发。
批量注册
上面是单个的注册,现在同样也可以批量进行注册:
<mappers> <package name="org.mybatis.builder"/> </mappers>
name
写包名。