引入dtd文件
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
一、引入外部的属性文件 - properties
- 在类路径下添加db.properties
mysql.driver=com.mysql.jdbc.Driver
mysql.url=jdbc:mysql://127.0.0.1:3306/ssm?characterEncoding=utf-8&useUnicode=true
mysql.user=root
mysql.password=a123456
mysql.maxSize=10
mysql.initSize=5
- 在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:表示从类路径中加载对应的属性文件
url:表示从网络中或者磁盘中读取对应的属性文件
-->
<properties resource="db.properties" ></properties>
</configuration>
二、运行时行为的设置 -settings
在MyBatis的全局配置文件中,可以使用setting标签设置MyBatis运行时的行为,有很多可以设置的项
<settings>
<!--
settings:Mybatis运行时行为设置,可以配置多个
- setting :单个行为设置标签
- name :设置项名称
- value : 设置项的值
-->
<!-- 设置自动驼峰命名 -->
<setting name="mapUnderscoreToCamelCase" value="true"></setting>
</settings>
三、别名处理器 - typeAliases
可以给MyBatis中经常用到的类型起一个别名。比如说我们之前的sql映射文件中,对于查询来说,都需要设置返回值类型,如下代码:
<select id="selectEmp" resultType="com.wanbangee.entities.Emp">
select * from emp
</select>
发现设置的resultType的名称太长,这个时候可以使用别名处理器,给对应的类型起一个别名
<!--
别名处理器typeAliases:可以给多个类型设置别名处理器
typeAlias : 给一个类型设置一个别名
type : 指定要器别名的类型的全类名
alias : 指定的起的别名
如果typeAlias 没有设置 alias属性,默认的别名就是类名,而且不区分大小写
我们在项目开发中,有很多很多的实体类,那么一个一个的配置非常麻烦,有一种新的写法
- package 标签:表示指定包中的所有的类都起别名
- name :指定包名
之后指定包中的所有类的别名就是类名,而且不区分大小写
而且我们还可以给指定包中的类指定别名,在实体类的类声明出使用@Alias注解声明 此类的别名
@Alias("emp")
public class Emp {
-->
<typeAliases>
<!-- <typeAlias type="com.wanan.entities.Emp" alias="emp"/> -->
<package name="com.wanan.entities"/>
</typeAliases>
别名也有规则:
- 所有的别名不能相同,不能使用已经被定义过的别名
约定:
- 起的别名要有语义
- MyBatis已经帮我们定义好了很多常用类型的别名
以上即是定义好的别名,这些别名是不能再用的。当然我们在开发中,别名处理器一般不用(除了MyBatis已经定义好的别名外),因为使用全类名定义实际效果更好,在开发工具中使用全类名也更好的去查看这个类。
四、 类型处理器 - typeHandlers
类型处理器作用于数据库的类型和Java的类型之间的相互转换,比如MYSQL数据库中varchar类型到Java的String类型,比如ORacle数据库中的number类型到Java的Integer类型,还有类似于日期类型等等。无论是MyBatis在预处理语句中设置的一个参数,还是从结果集中取出一个值,都会使用类型处理器将获取的值已合适的方式转换成Java类型。
配置:
<!--
类型处理器 typeHandlers
typeHandler :配置单个的类型处理器
handler : 类型处理器的全类名ing
javaType : 表示Java类型
jdbcType : 表示兼容的数据库类型
-->
<!-- <typeHandlers>
<typeHandler handler="org.apache.ibatis.type.StringTypeHandler" javaType="java.lang.String" jdbcType="varchar2"/>
</typeHandlers> -->
五、运行环境 - environments
MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中, 现实情况下有多种理由需要这么做。例如,开发、测试和生产环境需要有不同的配置;或者想在具有相同 Schema 的多个生产数据库中使用相同的 SQL 映射。
尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。
<!--
environments:表示可以配置多个环境,default 属性表示指定使用哪一种环境、
- environment 表示配置单个数据库环境 ,必须存在id属性,表示的此环境的唯一标识,而且多个环境的id不能重复,存在两个标签
- transactionManager :配置事务管理器,type表示设置事务管理器的类型,有两种
- JDBC :这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域
- MANAGED :这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。
默认情况下它会关闭连接。然而一些容器并不希望连接被关闭,因此需要将 closeConnection 属性设置为 false 来阻止默认的关闭行为
<property name="closeConnection" value="false"/>
- dataSource :配置数据源,type表示设置数据源类型,有三种:
- POOLED : 使用连接池,这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间
- UNPOOLED :不使用连接池,这个数据源的实现会每次请求时打开和关闭连接
- JNDI :这个数据源实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的数据源引用。
-->
<environments default="oracle">
<environment id="mysql">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${mysql.driver}" />
<property name="url" value="${mysql.url}" />
<property name="username" value="${mysql.user}" />
<property name="password" value="${mysql.password}" />
</dataSource>
</environment>
<environment id="oracle">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${oracle.driver}" />
<property name="url" value="${oracle.url}" />
<property name="username" value="${oracle.user}" />
<property name="password" value="${oracle.password}" />
</dataSource>
</environment>
</environments>
六、数据库厂商标识(databaseIdProvider)
MyBatis 可以根据不同的数据库厂商执行不同的语句,这种多厂商的支持是基于映射语句中的 databaseId 属性。 MyBatis 会加载带有匹配当前数据库 databaseId 属性和所有不带 databaseId 属性的语句。 如果同时找到带有 databaseId 和不带 databaseId 的相同语句,则后者会被舍弃。
<!--
databaseIdProvider:表示配置多数据源厂商支持,为不同的数据库厂商起一个别名
sql语句中可以使用databaseid指定这条sql语句是在何种厂商的数据库环境下执行
-->
<databaseIdProvider type="DB_VENDOR">
<property name="MySQL" value="mysql"/>
<property name="Oracle" value="oracle"/>
<property name="SQL Server" value="sqlserver"/>
</databaseIdProvider>
在sql语句中指定不同的数据库执行不同的sql语句:
<!-- public List<Emp> selectEmp();
-->
<select id="selectEmp" resultType="com.wanbangee.entities.Emp" databaseId="oracle">
select empno empId,ename empName from emp
</select>
<select id="selectEmp" resultType="com.wanbangee.entities.Emp" databaseId="mysql">
select * from emp
</select>
七、映射注册 (mappers)
使用mappers标签可以注册sql映射文件,将sql映射文件注册到全局配置文件中是必不可少的步骤,正常开发来说,一个SQL映射文件对应到一个DAO[Mapper]接口
<!-- 注册sql映射文件
mappers : 可以注册多个sql映射文件
mapper : 注册单个sql映射文件
- resource : 表示配置类路径中的sql映射文件
- url:表示配置网络中或者硬盘中的sql映射文件
- class : 表示引用接口注册,
- 要求,sql映射文件和接口要同名同包
- 也可以不适用sql映射文件,而是在接口的方法上注解sql,这种方式不提倡,因为MyBatis本来就是想将sql和Java代码相分离
@Select("select * from emp")
public List<Emp> selectEmp();
package : 扫描此包及子包的接口和sql映射文件
- 需要在接口中使用@Mapper注解
@Mapper
public interface EmpDao {
- 要求,sql映射文件和接口要同名同包
-->
<mappers>
<package name="com.wanbangee.dao"/>
<!-- <mapper class="com.wanbangee.dao.EmpDao"/> -->
<!-- <mapper resource="com/wanbangee/dao/EmpDao.xml"/> -->
</mappers>
八、编写顺序
元素类型为 “configuration” 的内容必须匹配 “(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,plugins?,environments?,databaseIdProvider?,mappers?)”