Mybatis全局配置文件(项目中的mybatis-config.xml)中configuration包括的(settings)和(properties)等信息对Mybatis行为有着深远的影响。文件结构如下:
标签 | 作用 |
---|---|
properties | 既可以通过元素的子元素配置也可以在典型的Java属性文件中配置 |
settings | 改变Mybatis的运行时行为,例如下划线转驼峰 |
typeAliases | 取别名,类名称复杂或包名复杂可以用一个简短的别名代替 |
typeHandlers | 类型处理器,有自带的也有自定义的转换器,数据库中的表数据类型与类中的属性类型不一致确能相互转换就是这个道理 |
plugins | 配置插件,后面用到的分页插件就用到了该标签 |
environments | 环境配置,配置数据库信息等 |
databaseIdProvider | 数据库厂商标识(目前用的少吧) |
mappers | 映射器,在mybatis初始化时告诉mybatis要引入哪些Mapper映射文件 |
注:这些标签的顺序不能错
<properties>
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis01" />
<property name="username" value="root" />
<property name="password" value="360421" />
properties>
jdbc.properties文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis01
username=root
password=360421
<properties resource="jdbc.properties">properties>
<environments default="mysql">
<environment id="mysql">
<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>
注:environments元素的具体作用见下文,且子元素配置和引入资源文件只用一种方法就行
数据库中字段名:user_name、类属性名:userName开启后不同额外处理
<settings>
<setting name="mapUnderscoreToCamelCase" value="true" />
settings>
OrderMapper.xml配置文件:数据库中用户id名称user_id
<mapper namespace="com.mapper.OrderMapper">
<select id="getAllOrder" resultType="com.mapper.Order">
select id,user_id,finish from orders
select>
mapper>
Order类中部分字段:类中用户id属性名称userId
private Integer id;
private Integer userId;
private String number;
启动下划线转驼峰功能后,能够自动将user_id值赋给userId
<settings>
<setting name="cacheEnabled" value="true" />
<setting name="lazyLoadingEnabled" value="true" />
<setting name="multipleResultSetsEnabled" value="true" />
<setting name="useColumnLabel" value="true" />
<setting name="useGeneratedKeys" value="false" />
<setting name="autoMappingBehavior" value="PARTIAL" />
<setting name="autoMappingUnknownColumnBehavior" value="WARNING" />
<setting name="defaultExecutorType" value="SIMPLE" />
<setting name="defaultStatementTimeout" value="25" />
<setting name="defaultFetchSize" value="100" />
<setting name="safeRowBoundsEnabled" value="false" />
<setting name="mapUnderscoreToCamelCase" value="false" />
<setting name="localCacheScope" value="SESSION" />
<setting name="jdbcTypeForNull" value="OTHER" />
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString" />
settings>
<typeAliases>
<typeAlias type="com.bean.Order" alias="ordernewname" />
typeAliases>
<typeAliases>
<package name="com.bean" />
typeAliases>
给com.bean包中的Order类取了个别名ordernewname,在orderMapper.xml中使用:
<mapper namespace="com.mapper.OrderMapper">
<select id="getAllOrder" resultType="ordernewname">
select id,user_id,finish from orders
select>
mapper>
类型处理器将获取的值以合适的方式转换成Java类型,在未接触类型处理器的时候,常常会疑惑我们在数据库中设置的字段类型,明明为int类型,为什么可以用String类型的数据进行增删改查。
package com.convert;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;
public class BooleanAndStringConvert implements TypeHandler<Boolean> {
@Override
public Boolean getResult(ResultSet arg0, String arg1) throws SQLException {
// TODO Auto-generated method stub
return null;
}
@Override
public Boolean getResult(ResultSet arg0, int arg1) throws SQLException {
// TODO Auto-generated method stub
return null;
}
@Override
public Boolean getResult(CallableStatement arg0, int arg1) throws SQLException {
// TODO Auto-generated method stub
return null;
}
@Override
public void setParameter(PreparedStatement arg0, int arg1, Boolean arg2, JdbcType arg3) throws SQLException {
// TODO Auto-generated method stub
}
}
package com.convert;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
public class BooleanAndIntConvert extends BaseTypeHandler<Boolean> {
//参数ResultSet为携带返回数据的容器,String:为表的列名
@Override
public Boolean getNullableResult(ResultSet arg0, String arg1) throws SQLException {
// TODO Auto-generated method stub
return arg0.getInt(arg1)==1?true:false;
}
//int:表示为第几列
@Override
public Boolean getNullableResult(ResultSet arg0, int arg1) throws SQLException {
// TODO Auto-generated method stub
return arg0.getInt(arg1)==1?true:false;
}
//CallableStatement:存储函数,这里表示:从存储过程中根据第几列拿数据
@Override
public Boolean getNullableResult(CallableStatement arg0, int arg1) throws SQLException {
// TODO Auto-generated method stub
return arg0.getInt(arg1)==1?true:false;
}
//参数:PreparedStatement对象,int为PreparedStatement对象操作参数的位置,Boolean:java值(父类泛型对应)
@Override
public void setNonNullParameter(PreparedStatement arg0, int arg1, Boolean arg2, JdbcType arg3) throws SQLException {
// TODO Auto-generated method stub
if (arg2) {
arg0.setInt(arg1, 1);
}else {
arg0.setInt(arg1, 0);
}
}
}
以继承BaseTypeHandler类为例,配置文件中声明:
<typeHandlers>
<typeHandler handler="com.convert.BooleanAndIntConvert"
javaType="boolean" jdbcType="INTEGER" />
typeHandlers>
数据库中的数据类型(finish字段):
Java类型中的finish字段类型:Boolean类型
public class Order {
private Integer id;
private Integer userId;
private String number;
private Date createtime;
private String note;
private Boolean finish; //Boolean类型
}
可以通过插件来修改Mybatis的一些核心行为,插件可通过动态代理机制,介入四大对象的任何一个方法的执行。
四大对象:
对象名称 |
---|
Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed) |
ParameterHandler (getParameterObject, setParameters) |
ResultSetHandler (handleResultSets, handleOutputParameters) |
StatementHandler (prepare, parameterize, batch, update, query) |
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">plugin>
plugins>
Mybatis可以配置多种环境,比如开发、测试和生产环境需要不同的配置,每种环境使用一个environment标签进行配置并指定唯一标识符,通过environments标签中的default属性来快速切换环境。
type:JDBC | MANAGER | 自定义
JDBC:使用JDBC的提交和回滚设置,依赖于从数据源得到的连接来管理事务范围,JdbcTransactionFactory
MANAGED:不提交或回滚一个连接、让容器来管理事务的整个生命周期(比如JEE应用服务器的上下文)ManagedTransactionFactory
自定义:实现TransactionFactory接口,type=全类名/别名
type:UNPOOLED | POOLED | JNDI | 自定义
UNPOOLED:不使用连接池,UnpooledDataSourceFactory
POOLED:使用连接池,PooledDataSourceFactory
JNDI:在EJB或应用服务器这类容器中查找指定的数据源
自定义:实现DataSourceFactory接口,定义数据源的获取方式
<environments default="mysql">
<environment id="mysql">
<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="oracle">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/mybatis01" />
<property name="username" value="root" />
<property name="password" value="360421" />
dataSource>
environment>
environments>
注:实际开发中使用Spring管理数据源并进行事务控制的配置来覆盖上述配置
在Mybatis初始化的时候告诉Mybatis需要引入哪些Mapper映射文件,mapper逐个注册SQL映射文件
resource:引入类路径下的文件
url:引入网络路径或磁盘下的文件
class:引入Mapper接口
<mappers>
<mapper resource="EmpMapper.xml" />
<mapper resource="OrderMapper.xml" />
<mapper class="bean.bean.EmpMapper"/>
<package name="com.mapper"/>
mappers>