配置
类型处理器
类处理器的作用就是配置javatype和jdbctype的映射关系
MyBatis配置文件(四)--typeHandlers
基本用法
数据库如下,类型分别是int和float
id | money |
---|---|
1 | 1000 |
package domain;
public class Money {
private float handlerMoney;//故意将该类名改变成不是money
public float getHandlerMoney() {return handlerMoney;}
public void setHandlerMoney(float handlerMoney) {this.handlerMoney = handlerMoney;}
@Override
public String toString() {
return "Money{" +"handlerMoney=" + handlerMoney +'}';
}
}
package typeHandler;
import domain.Money;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
@MappedJdbcTypes(JdbcType.FLOAT)
public class FloatTypeHandler extends BaseTypeHandler<Money> {
public void setNonNullParameter(PreparedStatement preparedStatement, int i, Money money, JdbcType jdbcType) throws SQLException {
preparedStatement.setFloat(i,money.getMoney());
}
public Money getNullableResult(ResultSet resultSet, String s) throws SQLException {
float money=resultSet.getFloat(s);
Money m=new Money();
m.setHandlerMoney(money);
return m;
}
public Money getNullableResult(ResultSet resultSet, int i) throws SQLException {
float money=resultSet.getFloat(i);
Money m=new Money();
m.setHandlerMoney(money);
return m;
}
public Money getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
float money=callableStatement.getFloat(i);
Money m=new Money();
m.setHandlerMoney(money);
return m;
}
}
在mybatis-config.xml
里配置类型处理器
<typeHandlers>
<package name="typeHandler"/>
</typeHandlers>
注意,配置文件里的配置是要有明确的先后顺序的,顺序乱了会报错的,顺序如官网文档中对于配置文件的介绍一样
以及使用
import dao.AccountMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
public class TestSqlSession {
public static void main(String[] args) throws IOException {
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
AccountMapper mapper = sqlSession.getMapper(AccountMapper.class);
System.out.println(mapper.selectMoney(1));
}
}
Mybatis提供了两种关于Enum
的handler,一个是EnumOrdinalTypeHandler
和EnumTypeHandler
。前者是处理枚举序数,后者是处理枚举类型。通过分析源码可以知道,举例来讲,数据库里存的是int
类型,那么EnumOrdinalTypeHandler
就是处理从int
映射到Enum
类型,比如数据库里存的是1
,那么返回的java类型就是对应Enum
的序号1的枚举对象。而EnumTypeHandler
处理的是,如果数据库里存的是String
类型,假如存的是“A”
,那么取的是枚举类型里为A
的枚举对象
plugin
DatabaseIdProvider
MyBatis之databaseIdProvider多数据库支持
JNDI
Mapper.xml
parameter
insert
ResultMap
MyBatis系列(十三):使用discriminator鉴别器映射
Java8获取参数名称 使用constructor的时候会用到