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/><!-- 属性,可以给系统配置一些运行参数 -->
<settings/><!-- 设置 -->
<typeAliases><!-- 类型命名 -->
<package name="com.xx.xx.tntity"/>
</typeAliases>
<typeHandlers/><!-- 类型处理器 -->
<objectFactory type=""></objectFactory><!-- 对象工厂 -->
<plugins><!-- 插件 -->
<plugin interceptor=""></plugin>
</plugins>
<environments default="development"><!-- 配置环境 -->
<environment id="development"><!-- 环境变量 -->
<transactionManager type="JDBC"></transactionManager><!-- 事务管理器 -->
<dataSource type="POOLED"><!-- 数据源 -->
</dataSource>
</environment>
</environments>
<databaseIdProvider type=""></databaseIdProvider><!-- 数据库厂商标识 -->
<mappers></mappers><!-- 映射器 -->
</configuration>
- properties 属性
可以给系统配置一些运行的参数,可以放在XML文件或者properties文件中,而不是放在java编码中,这样的好处在于方便参数修改,而不会引起代码的重新编译。
property子元素:
<properties>
<property name="database.driver" value="com.mysql.jdbc.Driver"/>
<property name="database.url" value="jdbc:mysql://localhost:3306/test"/>
<property name="database.username" value="root"/>
<property name="database.password" value="root"/>
</properties>
- properties文件
通过键值对应,我们可以配置多个放在文件中,然后在mybatis-config.xml文件中引入:
<properties resource="jdbc.properties"></properties>
- settings 设置
settings是MyBatis中最复杂的配置,它能深刻影响MyBatis底层的运行,但是在大部分情况下使用默认便可以运行,所以大部分情况下不太需要大量配置它,只需要修改一些常用的规则即可,比如自动映射、驼峰命名映射、级联规则、是否启动缓存、执行器类型等。
由于配置太多,这里不再例举,下面给出一个最全的配置样列,如下常用配置:
<settings><!-- 设置 -->
<!-- 该配置影响所有映射器中配置缓存的全局开关 默认:true -->
<setting name="cacheEnabled" value="true"/>
<!-- 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。在特定关系中可通过设置fetchType属性来覆盖该项的开关状态。 默认:false-->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 是否允许单一语句返回多结果集(需要兼容驱动) 默认:(版本3.4.1之前是true,之后是false)true -->
<setting name="multipleResultSetsEnabled" value="true"/>
<!-- 允许jdbc支持自动生成主键,需要驱动兼容。如果设置true,则这个设置强制使用自动生成主键。 默认:false -->
<setting name="useGeneratedKeys" value="false"/>
<!-- 指定MyBatis应该如何自动映射列到字段或属性。NONE表示取消自动映射;PARTIAL表示智慧自动映射,
没有定义嵌套结果集和映射集。FULL会自动映射任意复杂的结果集 默认:PARTIAL -->
<setting name="autoMappingBehavior" value="PARTIAL"/>
<!-- 指定自动映射当中未知列(或位置属性类型)时的行为。默认是不处理,只有当日志级别达到WARN级别或者以下,才会显示相关日志,如果处理失败就会抛出SqlSessionException异常 默认:NONE -->
<setting name="autoMappingUnKnownColumnBehavior" value="WARNING"/>
<!-- 默认的执行器。SIMPLE是普通的执行器;REUSE会重用预处理语句;BATCH执行器将重用语句并执行批量更新 默认:SIMPLE -->
<setting name="defaultExecutorType" value="SIMPLE"/>
<!-- 设置超时时间,它决定驱动等待数据库响应的秒数 默认:Not Set -->
<setting name="defaultStatementTimeout" value="25"/>
<!-- 设置数据库驱动程序默认返回的条数限制,此参数可以重新设置 默认:Not Set -->
<setting name="defaultFetchSize" value="100"/>
<!-- 允许在嵌套语句中使用分页(RowBounds),如果允许设置false 默认:false -->
<setting name="safeRowBoundsEnabled" value="false"/>
<!-- 允许在嵌套语句中使用分页(ResultHandler),如果允许设置false 默认:true -->
<setting name="mapUnderscoreToCamelCase" value="false"/>
<!-- MyBatis利用本地缓存机制防止循环引用和加速重复嵌套查询。SESSION这种情况下会缓存一个会话中执行的所有查询。
STATEMENT,本地会话仅用在语句执行上,对相同SqlSession的不同调用讲不会共享数据 默认:SESSION -->
<setting name="localCacheScope" value="SESSION"/>
<!-- 当没有参数提供特定的JDBC类型时,为空值指定JDBC类型。某些驱动需要制定列的JDBC类型,多数情况下直接用一般类型即可,
比如NULL、VARCHAR、OTHER 默认:OTHER -->
<setting name="jdbcTypeForNull" value="OTHER"/>
<!-- 指定哪个对象的方法触发一次延迟加载 -->
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
typeAliases 别名
由于类的全限定名称很长,需要大量使用的时候,总写那么长的名称不方便。在MyBatis中允许定义一个简写来代表这个类,这就是别名。
别名分为系统定义别名和自定义别名
1、系统别名:在MyBatis初始化的时候,系统自动初始化了一些别名 例如 _byte —> byte
2、自定义别名:指定某几个类使用别名
<typeAliases><!-- 类型命名 -->
<typeAlias type="com.xx.xx.entity.Role" alias="role"/>
</typeAliases>
扫描指定包只用别名
<typeAliases><!-- 类型命名 -->
<package name="com.xx.xx.tntity"/>
</typeAliases>
别名冲突后,可以更改
@Alias("abc")
public class Analyst
- typeHandler 类型转换器
在JDBC中,需要在PreparedStatement对象中设置那些已经预编译过的SQL语句的参数。执行SQL后,会通过ResultSet对象获取得到数据库中的数据,而这些MyBatis
是根据数据的类型通过typeHandler来实现的。
typeHandler又分为 jdbcType(用于定义数据库类型) 和 javaType(用于定义java类型)。
作用:就是承担jdbcType和javaType之间的转换。
它也分两种,一种是系统定义一种是自定义。绝大多数情况下系统定义都可以满足需求,当在使用枚举的时候需要使用自定义,例:
(1):org.apache.ibatis.type.EnumOrdinalTypeHandler
是按MyBatis根据枚举数据下标索引的方式进行匹配的,也是枚举类型的默认转换类,它要求数据库返回一个整数作为下标,它会根据下标找到对应的枚举类型。
1.枚举
public enum SexEnum {
MALE(1,"男"),
FEMALE(0,"女");
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
SexEnum(int id,String name){
this.id=id;
this.name=name;
}
public SexEnum getSexById(int id){
for(SexEnum sex : SexEnum.values()){
if(sex.getId()==id){
return sex;
}
}
return null;
}
}
2.entity
private SexEnum sex;
3.xml
<resultMap id="BaseResultMap" type="com.bob.analyst.model.Analyst">
<id column="id" jdbcType="BIGINT" property="id" />
**<id column="sex" property="sex" typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"/>
</resultMap>**
4.Service
@Override
public Analyst selectByPrimaryKey(Long id) {
Analyst analyst=analystMapper.selectByPrimaryKey(id);
System.out.println(".........sex:"+analyst.getSex().getName());
return analyst;
}
(2):EnumTypeHandler:会把使用的名称转化为对应的枚举,比如它会根据数据库返回的字符串“MALE”,进行 Enum.valueOf(SexEnum.class,”MALE”);转换
<id column="sex" property="sex" typeHandler="org.apache.ibatis.type.EnumTypeHandler"/>