mybatis–基础–2.4–xml配置–类型处理器(typeHandlers)
代码地址
https://gitee.com/DanShenGuiZu/learnDemo/tree/mysql_mybaties_DB/mybatis-learn-master
1、类型处理器(typeHandlers)
1.1、发生时机
- 预处理语句(PreparedStatement)中设置参数值
- 结果集中取出一个值
1.2、用于JavaType与JdbcType之间的转换
2、自定义类型处理器
- 重写已有的类型处理器或创建你自己的类型处理器
- 具体做法为:
- 实现org.apache.ibatis.type.TypeHandler接口
- 继承类org.apache.ibatis.type.BaseTypeHandler,并且可以(可选地)将它映射到一个JDBC类型。
- 配置方式:
- 直接配置
- 包名配置
- 注意点
- 使用自动发现功能的时候,只能通过注解方式来指定JDBC的类型。
- 默认不使用自动发现功能
- 使用自动发现功能的时候,只能通过注解方式来指定JDBC的类型。
3、案例–long类型处理器
- 自己定义处理器的会覆盖相同的类型处理器
- 假如你自定义一个 jdbc varchar,java Strng 的类型处理器,那么你会覆盖mybaties的StringTypeHandler处理。
- 配置类型的映射关系
3.1、自定义类型处理器的方式
3.1.1、方式1:通过类型处理器的泛型来处理
3.1.2、方式2:通过注解来处理
3.1.3、方式3:通过配置来处理
3.2、整体代码
3.2.1、数据库表结构
3.2.2、字段结构
3.2.3、转换器
3.2.4、配置
3.2.5、结果
3.2.6、测试代码
package com.cl.mybatis.learn.day05;
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;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
/**
* 将 数据库String类型转为Java Long类型
*
* @author feizhou
* @return
* @since 2020/10/15 0015 下午 11:26
*/
@MappedTypes(Long.class)
@MappedJdbcTypes(JdbcType.VARCHAR)
public class Long2TypeHandler extends BaseTypeHandler<Long> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Long parameter, JdbcType jdbcType)throws SQLException {
ps.setLong(i, parameter);
}
@Override
public Long getNullableResult(ResultSet rs, String columnName)throws SQLException {
return rs.getLong(columnName);
}
@Override
public Long getNullableResult(ResultSet rs, int columnIndex)throws SQLException {
return rs.getLong(columnIndex);
}
@Override
public Long getNullableResult(CallableStatement cs, int columnIndex)throws SQLException {
return cs.getLong(columnIndex);
}
}
package com.cl.mybatis.learn.day05;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class Mybatis001 {
public static void main(String[] args)throws IOException {
String resource = "day05/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 数据库数据
// id user_name password
// 6 6 6
// 7 userName7 password7
SqlSession session = sqlSessionFactory.openSession();
// 可以转换
User test1 = session.selectOne(UserMapper.class.getName()+ ".selectById", 6);
System.out.println("第一次:" + test1);
// userName7 不能转换long
try {
User test2 = session.selectOne(UserMapper.class.getName()+ ".selectById", 7);
System.out.println("第二次:" + test2);
} finally {
session.close();
}
}
}
package com.cl.mybatis.learn.day05;
public class User {
private Long id;
private Long user_name;
private String password;
public Long getId(){
return id;
}
public void setId(Long id){
this.id = id;
}
public String getPassword(){
return password;
}
public void setPassword(String password){
this.password = password;
}
public Long getUser_name(){
return user_name;
}
public void setUser_name(Long user_name){
this.user_name = user_name;
}
@Override
public String toString(){
return "User{" + "id=" + id + ", user_name=" + user_name + ", password='" + password + '\'' + '}';
}
}
package com.cl.mybatis.learn.day05;
public interface UserMapper {
User selectById(Integer id);
}
username=root
password=root
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://zhoufei.ali.db.com:3306/test
<?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 resource="day04/config.properties">
</properties>
<typeAliases>
<!-- 使用包名 -->
<package name="com.cl.mybatis.learn.day05"/>
</typeAliases>
<!-- 类型转换器 -->
<typeHandlers>
<typeHandler handler="com.cl.mybatis.learn.day05.Long2TypeHandler"/>
</typeHandlers>
<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>
<mappers>
<mapper resource="day05/UserMapper.xml"/>
</mappers>
</configuration>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cl.mybatis.learn.day05.UserMapper">
<select id="selectById" resultType="user">
select * from user where id = #{id}
</select>
</mapper>
4、案例–枚举类型处理器
- 继承EnumTypeHandler
- 继承EnumOrdinalTypeHandler
4.1、代码结构
4.2、关键代码
4.2、代码
package com.cl.mybatis.learn.day06;
public enum Enabled {
isClose(0, "关闭"),
isOpen(1, "开启");
private final int code;
private final String name;
private Enabled(int code, String name){
this.code = code;
this.name = name;
}
public int getCode(){
return code;
}
public String getName(){
return name;
}
}
package com.cl.mybatis.learn.day06;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
/**
* Enabled类型处理器
*/
public class EnabledTypeHandler implements TypeHandler<Enabled> {
private final Map<Integer, Enabled> enabledMap = new HashMap<Integer, Enabled>();
public EnabledTypeHandler(){
for(Enabled enabled : Enabled.values()){
enabledMap.put(enabled.getCode(), enabled);
}
}
@Override
public void setParameter(PreparedStatement preparedStatement, int i, Enabled enabled, JdbcType jdbcType)throws SQLException {
preparedStatement.setInt(i, enabled.getCode());
}
@Override
public Enabled getResult(ResultSet resultSet, String s)throws SQLException {
Integer value = resultSet.getInt(s);
return enabledMap.get(value);
}
@Override
public Enabled getResult(ResultSet resultSet, int i)throws SQLException {
Integer value = resultSet.getInt(i);
return enabledMap.get(value);
}
@Override
public Enabled getResult(CallableStatement callableStatement, int i)throws SQLException {
Integer value = callableStatement.getInt(i);
return enabledMap.get(value);
}
}
package com.cl.mybatis.learn.day06;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import org.apache.ibatis.type.EnumOrdinalTypeHandler;
import org.apache.ibatis.type.EnumTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;
/**
* Enabled类型处理器
*/
public class EnabledTypeHandler2 extends EnumOrdinalTypeHandler<Enabled> {
private final Map<Integer, Enabled> enabledMap = new HashMap<Integer, Enabled>();
public EnabledTypeHandler2(Class<Enabled> type){
super(type);
for(Enabled enabled : Enabled.values()){
enabledMap.put(enabled.getCode(), enabled);
}
}
@Override
public void setParameter(PreparedStatement preparedStatement, int i, Enabled enabled, JdbcType jdbcType)
throws SQLException {
preparedStatement.setInt(i, enabled.getCode());
}
@Override
public Enabled getResult(ResultSet resultSet, String s)throws SQLException {
Integer value = resultSet.getInt(s);
return enabledMap.get(value);
}
@Override
public Enabled getResult(ResultSet resultSet, int i)throws SQLException {
Integer value = resultSet.getInt(i);
return enabledMap.get(value);
}
@Override
public Enabled getResult(CallableStatement callableStatement, int i)throws SQLException {
Integer value = callableStatement.getInt(i);
return enabledMap.get(value);
}
}
package com.cl.mybatis.learn.day06;
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;
import java.io.InputStream;
//https://segmentfault.com/a/1190000020974188
public class Mybatis001 {
public static void main(String[] args)throws IOException {
String resource = "day06/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
try {
User test1 = session.selectOne(UserMapper.class.getName()+ ".selectById", 0);
System.out.println("第一次:" + test1);
User test2 = session.selectOne(UserMapper.class.getName()+ ".selectById", 1);
System.out.println("第二次:" + test2);
} finally {
session.close();
}
}
}
package com.cl.mybatis.learn.day06;
import org.apache.ibatis.type.Alias;
@Alias("UserInfo")
public class User {
private Enabled id;
private String nameName;
private String password;
public Enabled getId(){
return id;
}
public void setId(Enabled id){
this.id = id;
}
public String getNameName(){
return nameName;
}
public void setNameName(String nameName){
this.nameName = nameName;
}
public String getPassword(){
return password;
}
public void setPassword(String password){
this.password = password;
}
@Override
public String toString(){
return "User{" +
"id=" + id +
", nameName='" + nameName + '\'' +
", password='" + password + '\'' +
'}';
}
}
public interface UserMapper {
User selectById(Integer id);
}
username=root
password=root
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://zhoufei.ali.db.com:3306/test
<?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 resource="day06/config.properties">
</properties>
<typeAliases>
<!-- 使用包名 -->
<package name="com.cl.mybatis.learn.day06"/>
</typeAliases>
<!-- 类型转换器 -->
<typeHandlers>
<!--枚举类型-->
<typeHandler handler="com.cl.mybatis.learn.day06.EnabledTypeHandler2"
javaType="com.cl.mybatis.learn.day06.Enabled"/>
</typeHandlers>
<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>
<mappers>
<mapper resource="day06/UserMapper.xml"/>
</mappers>
</configuration>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cl.mybatis.learn.day06.UserMapper">
<select id="selectById" resultType="UserInfo">
select * from user where id = #{id}
</select>
</mapper>