3. MyBatis 核心配置文件标签
- 4.1 properties标签
- 4.2 typeAliases标签
- 4.3 environments标签
- 4.4 mappers标签
- 4.5 知识小结
常用标签
sqlMapConfig.xml
是MyBatis
框架的核心配置文件,主要用来配置数据源、映射文件、属性等
1566869842463
4.1 properties标签
作用
设置属性键值对,属性可以外部配置,也可动态替换。
需求
在上一篇的入门案例中,我们使用最简单的方式配置 sqlMapConfig.xml
,将 JDBC 访问数据库的账号密码直接写在 sqlMapConfig.xml
文件中,如下:
image-20210312165417762
这就导致了一个耦合高的问题。
为了解决这个耦合高的问题,我们应该将这种变化的参数写到外部的配置文件中。而 sqlMapConfig.xml
只从外部的配置文件中读取需要的相关参数即可。
下面我们来看看如何应用起来。
应用
1. 在 resources 目录下,新增 jdbc.properties文件
image-20210312172544480
代码语言:javascript复制jdbc.username=root
jdbc.password=********你的密码*********
jdbc.url=jdbc:mysql://localhost:3306/db3
jdbc.driverClass=com.mysql.jdbc.Driver
2. 修改sqlMapConfig.xml文件,通过读取外部文件来动态配置内部的属性值
image-20210312173112026
代码语言:javascript复制<?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>
<!--定义属性文件
resource:从类路径下面读取外部文件
url:从一个资源定位地址来读取配置文件
提供参数使用: 可以使用 ${参数名} 进行参数引用
-->
<properties resource="jdbc.properties" >
</properties>
<environments default="default">
<!--环境变量-->
<environment id="default">
<!--事务管理器:由JDBC管理事务 -->
<transactionManager type="JDBC"/>
<!--数据源配置信息:POOLED 使用连接池 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 加载其他的映射文件 -->
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
配置完毕之后,我们可以再执行一下测试代码,确认是否运行正常(接着上一篇中的入门案例),如下:
image-20210312173310089
3.设置 properties 的内部参数属性说明
在 properties 标签虽然可以直接引用外部文件的参数,但是有时候我们还是希望可以设置一些默认参数。那么这时候就可以设置 properties 的内部属性。
image-20210312174325290
代码语言:javascript复制<?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>
<!--定义属性文件
resource:从类路径下面读取外部文件
url:从一个资源定位地址来读取配置文件
提供参数使用: 可以使用 ${参数名} 进行参数引用
-->
<properties resource="jdbc.properties" >
<!--先读取内部属性,后读取外部属性,在属性名一样时,外部属性起作用-->
<property name="jdbc.username" value="root"/>
<property name="jdbc.password" value="root"/>
</properties>
<environments default="default">
<!--环境变量-->
<environment id="default">
<!--事务管理器:由JDBC管理事务 -->
<transactionManager type="JDBC"/>
<!--数据源配置信息:POOLED 使用连接池 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 加载其他的映射文件 -->
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
4.2 typeAliases标签
作用
给用户自定义的实体类定义别名,它只和 XML 配置有关,用来减少类完全限定名的冗余。
这样说这个作用有些抽象,下面再来截图说明如下:
在我们入门案例中,使用 UserMapper.xml
来映射一个 User
实体类的相关查询SQL方法。
image-20210312182053593
在上面的示例中,我们发现如果需要在 resultType
设置实体类的映射,需要写完整 com.lijw.entity.User
路径。如果需要写的SQL映射比较多,那就比较繁琐了。
那么有没有办法简化一下呢?这个当然有,我们可以使用 typeAliases
标签给这个 com.lijw.entity.User
路径设置别名,然后引用这个别名来简化配置。
下面是常见的默认内置别名,下面看完了 内置别名 之后,我们再写个案例来演示 别名 的自定义设置。
内置别名
内置别名可以直接使用,别名不区分大小写
别名 | 映射类型 |
---|---|
_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 |
decimal | BigDecimal |
bigdecimal | BigDecimal |
object | Object |
map | Map |
hashmap | HashMap |
list | List |
arraylist | ArrayList |
collection | Collection |
iterator | Iterator |
应用
方式一
“单个实体类的别名设置 typeAlias ”
让我们回到 sqlMapConfig.xml
配置文件,配置如下:
image-20210313014350526
代码语言:javascript复制 <!--
typeAlias :
1. type:指定实体类全名
2. alias: 指定别名,如果省略这个属性,默认使用类名字做为别名,别名不区分大小写,通常别名使用小写。
-->
<typeAliases>
<typeAlias type="com.lijw.entity.User" />
</typeAliases>
当我们配置好了这个 User
的实体类别名之后,我们再回到映射文件UserMapper.xml
中使用别名配置 映射关系,如下:
image-20210313014504384
代码语言:javascript复制<!--
实体类的映射文件
namespace 指定接口的类全名
-->
<mapper namespace="com.lijw.dao.UserMapper">
<!--
查询语句
id: 接口中方法的名字
resultType:返回的实体类的类型,类全名
-->
<select id="findAllUsers" resultType="user">
select * from user
</select>
</mapper>
测试执行是否正常,如下:
image-20210313014554516
可以看到,我们已经成功进行实体类的别名映射了。但是如果要我们一个个实体类去写映射,肯定会觉得特别累。那么如何去简化呢?
我们可以直接配置一个包下所有实体类的别名。
方式二
“包扫描配置别名package ”
image-20210313014957348
代码语言:javascript复制 <!--
typeAlias :
1. type:指定实体类全名
2. alias: 指定别名,如果省略这个属性,默认使用类名字做为别名,别名不区分大小写,通常别名使用小写。
-->
<typeAliases>
<!--
package指定包名
1. 自动将这个包下所有的实体类定义别名,别名就是类的名字。(在日志输出中会有乱码,不用理会,不影响使用,这是mybatis的bug)
2. 如果有多个子包,只需要指定父包即可。
3. 可以使用多个package标签,指定不同的包名
-->
<package name="com.lijw.entity"/>
</typeAliases>
通过直接设置一个包下的所有实体类的别名映射,我们就不用一个个去写实体类的规则了。
4.3 environments标签
作用
MyBatis可以配置多种环境,有助于将SQL映射应用于多种数据库之中,如dev(development开发环境)、uat(test测试环境)、prd(produce生产环境)
尽管可以配置多个环境,但是每个环境只能有一个SqlSessionFactory实例。所以需要选择到底使用哪个环节的配置。
另外在 environments标签中还有 transactionManager 和 dataSource 两个标签,用途如下:
transactionManager事务管理器
类型 | 作用 |
---|---|
JDBC | 由JDBC进行事务的管理 |
MANAGED | 事务由容器来管理,后期学习Spring框架的时候,所有的事务由容器管理 |
dataSource数据源
类型 | 作用 |
---|---|
UNPOOLED | 不使用连接池,每次自己创建连接 |
POOLED | 使用mybatis创建的连接池 |
JNDI | 由应用服务器提供连接池的资源,我们通过JNDI指定的名字去访问连接池资源 |
应用
下面我们创建一个默认default环境的配置参数,还有一个生产环境的配置参数。
image-20210313165640287
代码语言:javascript复制<?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>
<!--定义属性文件
resource:从类路径下面读取外部文件
url:从一个资源定位地址来读取配置文件
提供参数使用: 可以使用 ${参数名} 进行参数引用
-->
<properties resource="jdbc.properties" >
<!--先读取内部属性,后读取外部属性,在属性名一样时,外部属性起作用-->
<property name="jdbc.username" value="root"/>
<property name="jdbc.password" value="root"/>
</properties>
<!--
typeAlias :
1. type:指定实体类全名
2. alias: 指定别名,如果省略这个属性,默认使用类名字做为别名,别名不区分大小写,通常别名使用小写。
-->
<typeAliases>
<!--
package指定包名
1. 自动将这个包下所有的实体类定义别名,别名就是类的名字。(在日志输出中会有乱码,不用理会,不影响使用,这是mybatis的bug)
2. 如果有多个子包,只需要指定父包即可。
3. 可以使用多个package标签,指定不同的包名
-->
<package name="com.lijw.entity"/>
</typeAliases>
<!--mybatis环境的配置-->
<!-- 一个核心配置文件,可以配置多个运行环境,default默认使用哪个运行环境 -->
<environments default="produce">
<!-- 其中的一个运行环境,通过id来进行标识-->
<!-- 默认环境变量-->
<environment id="default">
<!--
事务管理器type的取值:
1. JDBC:由JDBC进行事务的管理
2. MANAGED:事务由容器来管理,后期学习Spring框架的时候,所有的事务由容器管理
-->
<transactionManager type="JDBC"/>
<!--
数据源:
1. POOLED:使用mybatis创建的连接池
2. UNPOOLED:不使用连接池,每次自己创建连接
3. JNDI:由服务器提供连接池的资源,我们通过JNDI指定的名字去访问服务器中资源
-->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
<!-- 生产环境变量-->
<environment id="produce">
<!--事务管理器:由JDBC管理事务 -->
<transactionManager type="JDBC"/>
<!--数据源配置信息:POOLED 使用连接池 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 加载其他的映射文件 -->
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
4.4 mappers标签
作用
加载外部的实体类映射文件。
应用
image-20210313170246901
代码语言:javascript复制1. 加载指定的resources目录下的映射文件
<mapper resource="UserMapper.xml"/>
2. 加载指定接口的全限定名
<mapper class="com.dao.UserMapper"/>
3. 加载并扫描指定包下所有的接口
<package name="com.mapper"/>
4.5 知识小结
4.5.1 mybatis文件的关系介绍
1589005133152
4.5.2 核心配置文件标签顺序
1589005246218
要注意标签的顺序,不然会报错。
4.5.3 常用标签
properties标签:该标签可以加载外部的properties文件
代码语言:javascript复制<!--定义属性文件
resource:从类路径下面读取外部文件
url:从一个资源定位地址来读取配置文件
提供参数使用: 可以使用 ${参数名} 进行参数引用
-->
<properties resource="jdbc.properties" >
<!--先读取内部属性,后读取外部属性,在属性名一样时,外部属性起作用-->
<property name="jdbc.username" value="root"/>
<property name="jdbc.password" value="root"/>
</properties>
typeAliases标签:设置类型别名
代码语言:javascript复制<!--
typeAlias :
1. type:指定实体类全名
2. alias: 指定别名,如果省略这个属性,默认使用类名字做为别名,别名不区分大小写,通常别名使用小写。
-->
<typeAliases>
<!--
package指定包名
1. 自动将这个包下所有的实体类定义别名,别名就是类的名字。(在日志输出中会有乱码,不用理会,不影响使用,这是mybatis的bug)
2. 如果有多个子包,只需要指定父包即可。
3. 可以使用多个package标签,指定不同的包名
-->
<package name="com.lijw.entity"/>
</typeAliases>
environments标签:数据源环境配置
代码语言:javascript复制<!--mybatis环境的配置-->
<!-- 一个核心配置文件,可以配置多个运行环境,default默认使用哪个运行环境 -->
<environments default="produce">
<!-- 其中的一个运行环境,通过id来进行标识-->
<!-- 默认环境变量-->
<environment id="default">
<!--
事务管理器type的取值:
1. JDBC:由JDBC进行事务的管理
2. MANAGED:事务由容器来管理,后期学习Spring框架的时候,所有的事务由容器管理
-->
<transactionManager type="JDBC"/>
<!--
数据源:
1. POOLED:使用mybatis创建的连接池
2. UNPOOLED:不使用连接池,每次自己创建连接
3. JNDI:由服务器提供连接池的资源,我们通过JNDI指定的名字去访问服务器中资源
-->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
<!-- 生产环境变量-->
<environment id="produce">
<!--事务管理器:由JDBC管理事务 -->
<transactionManager type="JDBC"/>
<!--数据源配置信息:POOLED 使用连接池 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
mappers标签:加载映射配置
代码语言:javascript复制<!-- 加载其他的映射文件 -->
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
4.5.4 核心配置文件模板
上面我们已经了解了 Mybatis 配置文件的相关标签,但是每次都要去写一遍挺麻烦的,所以我们可以创建一个文件模板。方便我们后续直接使用。
image-20210313171603718
设置的模板内容如下:
代码语言:javascript复制<?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>
<!--定义属性文件
resource:从类路径下面读取外部文件
url:从一个资源定位地址来读取配置文件
提供参数使用: 可以使用 ${参数名} 进行参数引用
-->
<properties resource="jdbc.properties" >
<!--先读取内部属性,后读取外部属性,在属性名一样时,外部属性起作用-->
<property name="jdbc.username" value="root"/>
<property name="jdbc.password" value="root"/>
</properties>
<!--
typeAlias :
1. type:指定实体类全名
2. alias: 指定别名,如果省略这个属性,默认使用类名字做为别名,别名不区分大小写,通常别名使用小写。
-->
<typeAliases>
<!--
package指定包名
1. 自动将这个包下所有的实体类定义别名,别名就是类的名字。(在日志输出中会有乱码,不用理会,不影响使用,这是mybatis的bug)
2. 如果有多个子包,只需要指定父包即可。
3. 可以使用多个package标签,指定不同的包名
-->
<package name="com.lijw.entity"/>
</typeAliases>
<!--mybatis环境的配置-->
<!-- 一个核心配置文件,可以配置多个运行环境,default默认使用哪个运行环境 -->
<environments default="produce">
<!-- 其中的一个运行环境,通过id来进行标识-->
<!-- 默认环境变量-->
<environment id="default">
<!--
事务管理器type的取值:
1. JDBC:由JDBC进行事务的管理
2. MANAGED:事务由容器来管理,后期学习Spring框架的时候,所有的事务由容器管理
-->
<transactionManager type="JDBC"/>
<!--
数据源:
1. POOLED:使用mybatis创建的连接池
2. UNPOOLED:不使用连接池,每次自己创建连接
3. JNDI:由服务器提供连接池的资源,我们通过JNDI指定的名字去访问服务器中资源
-->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
<!-- 生产环境变量-->
<environment id="produce">
<!--事务管理器:由JDBC管理事务 -->
<transactionManager type="JDBC"/>
<!--数据源配置信息:POOLED 使用连接池 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 加载其他的映射文件 -->
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
配置完毕之后,我们来使用一下,如下:
image-20210313171702626
image-20210313171727133
image-20210313171745301