一:typeHandlers
当MyBatis 对PreparedStatement 设入一个参数或者是从ResultSet 返回一个值的时候,类型句柄被用将值转为相匹配的JAVA 类型。你可以重写(loverride)类型句柄或者是创建你自己的方式来处理不支持或者是非标准的类型。只需要简单地实现org.mybatis.type 包里的TypeHandler,并且映射你的新类型句柄类到一个JAVA 类型,再选定一个JDBC 类型。正如上面所说的那样,通过mybatis你可以实现任意的java类型存储到数据库中的任意类型,这将是一个灵活的转换。
下面是一个简单的TypeHandler的应用,正如你看到的那样,你需要实现TypeHandler接口来进行转换。
/**
* 这是一个自定义类型转换器
* 可以将程序中的布尔类型的数据转换为存储中的char类型的Y或者是N
*/
public class MyTypeHander implements TypeHandler<Object>{
/**
* @param parameter 你需要操作的值 即对应对象的一个属性
* @param i 对应记录的序号
* @param ps 预处理对象
*/
@Override
public void setParameter(PreparedStatement ps, int i, Object parameter,
JdbcType jdbcType) throws SQLException {
String str=(Boolean)parameter==true?"Y":"N";
ps.setString(i, str);
}
/**
* @param rs 结果集
* @param columnName 对应数据库列名
*/
@Override
public Object getResult(ResultSet rs, String columnName)
throws SQLException {
String str=rs.getString(columnName);//获取到该列的值
Boolean bl=Boolean.FALSE;
if(str.equalsIgnoreCase("Y")){
bl=Boolean.TRUE;
}
return bl;
}
@Override
public Object getResult(ResultSet rs, int columnIndex) throws SQLException {
String str=rs.getString(columnIndex);//获取到该列的值
Boolean bl=Boolean.FALSE;
if(str.equalsIgnoreCase("Y")){
bl=Boolean.TRUE;
}
return bl;
}
@Override
public Object getResult(CallableStatement cs, int columnIndex)
throws SQLException {
boolean b=cs.getBoolean(columnIndex);
return b?"Y":"N";
}
}
写完实现类之后你需要在主文件中配置一下信息,在配置文件中写明你要将何种java类型转换为数据库中的何种类型:
<typeHandlers>
<!-- 自定义类型处理器 -->
<typeHandler handler="com.typehander.MyTypeHander" javaType="java.lang.Boolean" jdbcType="CHAR"/>
</typeHandlers>
同时在Mapper映射文件中在你使用到的属性后面你需要这样来做:
#{bool,typeHandler=com.typehander.MyTypeHander}在对应的属性后面加这个类型处理器。
二:ObjectFactory
每次MyBatis 为结果对象创建一个新实例,都会用到ObjectFactory。默认ObjectFactory 与使用目标类的构造函数创建一个实例毫无区别,如果有已经映射的参数,那也可能使用带参数的构造函数。如果你重写ObjectFactory 的默认操作,你可以创建一下你自己的。
三:plugins MyBatis 允许你在映射语句执行过程中某点上拦截调用。默认的,MyBatis 允许插件拦截以下调用:
1 Executor
(update, query, flushStatements, commit, rollback, getTransaction, close,isClosed)
2 ParameterHandler
(getParameterObject, setParameters)
3 ResultSetHandler
(handleResultSets, handleOutputParameters)
4 StatementHandler
(prepare, parameterize, batch, update, query)
要实现一个自己的拦截器,你需要实现Interceptor接口并重写里面的三个方法,如下:
@Intercepts({@Signature(
type=Executor.class,
method = "update",
args = {MappedStatement.class,Object.class}
)})
public class MyInterceptor implements Interceptor {
//调用目标类的方法 让整个流程得以继续执行下去
@Override
public Object intercept(Invocation invocation) throws Throwable {
System.out.println("这里是测试mybatis的拦截器!");
return invocation.proceed();
}
//返回代理对象
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
//这里读取配置文件中plugins标签下面的plugin标签下的property标签的值
@Override
public void setProperties(Properties properties) {
String propertyVlaue=properties.getProperty("propertyKey");
System.out.println(propertyVlaue);
}
}
在配置文件中需要这样写:
<plugins>
<plugin interceptor="com.example.MyInterceptor">
<property name="propertyKey" value="propertyValue"/>
</plugin>
</plugins>