mybatis的配置都写在核心配置文件 mybatis-config.xml 中,这个文件包含了会深深影响 MyBatis 行为的设置和属性信息。
所有配置的内容如下:
configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)
在配置文件中的配置必须按照以上顺序,否则会报错
属性(properties)
这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置
第一步:在资源目录下新建一个 db.properties 属性配置文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?createDatabaseIfNotExist=true&useSSL=false
username=root
password=123456
第二步:将 properties 属性文件导入到核心配置文件中
<properties resource="db.properties"/>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
注意:除了以上方式以外还可以将属性设置在 properties 元素的子元素中,并且当两种方式的属性出现同名时,会优先采用上面那种方式设置的属性
<properties resource="db.properties">
<property name="username" value="root"/>
<property name="password" value="123456"/>
</properties>
设置(settings)
这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为.
类型别名(typeAliases)
类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写.
第一种:这样配置后,可以在任何使用 com.lv.pojo.User 的时候用 user 代替它,好处是可以DIY名字.
<typeAliases>
<typeAlias type="com.lv.pojo.User" alias="user"/>
</typeAliases>
第二种:指定一个包名,mybatis 会搜索包下所有的 java bean 在没有注解的情况下,将它的首字母小写的非限定类名作为它的别名,好处是java bean过多时可以简化代码
<typeAliases>
<package name="com.lv.pojo"/>
</typeAliases>
如果想DIY别名可以在javabean加上注解,它的别名就会变成注解中设置的名字
//实体类
@Alias("cnm")
public class User {
private int id;
private String name;
private String pwd;
}
类型处理器(typeHandlers)
MyBatis 在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时, 都会用类型处理器将获取到的值以合适的方式转换成 Java 类型。
对象工厂(objectFactory)
每次 MyBatis 创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成实例化工作。 默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认无参构造方法,要么通过存在的参数映射来调用带有参数的构造方法。 如果想覆盖对象工厂的默认行为,可以通过创建自己的对象工厂来实现。
环境配置 (environments)
MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中,必须指定一个作为默认的运行环境(通过default指定)
environment 代表具体的一套环境,通过设置id进行区别,确保id唯一性
transactionManager 事务管理器(type="[JDBC|MANAGED]")
JDBC : 这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。
MANAGED : 这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接。然而一些容器并不希望连接被关闭,因此需要将 closeConnection 属性设置为 false 来阻止默认的关闭行为。
dataSource 数据源(type="[UNPOOLED|POOLED|JNDI]")
dataSource元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。
unpooled: 这个数据源的实现只是每次被请求时打开和关闭连接。
pooled: 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来 , 这是一种使得并发 Web 应用快速响应请求的流行处理方式。
jndi:这个数据源的实现是为了能在如 Spring 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。
数据源也有很多第三方的实现,比如dbcp,c3p0,druid等等...
<environments default="test">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
<environment id="test">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
映射器(mappers)
定义映射sql语句文件
mapper文件引入的四种方式
第一种方式:
<!-- 使用相对于类路径的资源引用-->
<mappers>
<mapper resource="com/lv/dao/UserMapper.xml"/>
</mappers>
第二种方式:
<!-- 使用完全限定资源定位符(URL)file:/// 后面写绝对路径-->
<mappers>
<mapper url="file:///C:\Users\xxx\IdeaProjects\mybatis-Study\mybatis-04\src\main\java\com\lv\dao\UserMapper.xml"/>
</mappers>
第三种方式:
<!-- 使用映射器接口实现类的完全限定类名 需要配置文件名称和接口名称一致,并且位于同一目录下-->
<mappers>
<mapper class="com.lv.dao.UserMapper"/>
</mappers>
第四种方式:
<!-- 将包内的映射器接口实现全部注册为映射器,但是需要配置文件名称和接口名称一致,并且位于同一目录下-->
<mappers>
<package name="com.lv.dao"/>
</mappers>
mapper文件的编写
namespace中文意思:命名空间,作用如下:
1. namespace和子元素的id联合保证唯一 , 区别不同的mapper
2. 绑定DAO接口,namespace的命名必须跟某个接口同名,接口中的方法与映射文件中sql语句id应该一一对应
3. namespace命名规则 : 包名+类名
<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lv.dao.UserMapper">
</mapper>