Mybatis desde la entrada a la utilización competentes de --TypeHandler (18)

A, TypeHandler

TypeHandler conversión mutua procesador entre un JdcbType mybatis El javaType y proporcionado, para la conversión durante la transmisión del valor de referencia y el retorno, en consecuencia, el valor de retorno Identificación del mapa tal etiqueta, generalmente no requiere conversión, porque mybatis ha proporcionado más de TypeHandler adecuada y de uso común.

 

En segundo lugar, el caso

Descripción del caso:

Para la conversión enumerado, mybatis no está disponible, necesitamos una base de datos y el sexo de género y 0 se convierte en un conjunto de valores de enumeración a la propiedad correspondiente.

clase de entidad de usuario:

public class User {
    private Integer id;

    private String userName;

    private String realName;

    private Sex sex;

    private String mobile;

    private String email;

    private String note;

    private Integer positionId;
}

Sexo clase de enumeración:

public enum Sex {

  MALE(1, "男"),
  FEMALE(0, "女");

  Sex(int id, String name) {
    this.id = id;
    this.name = name;
  }

  private int id;
  private String name;

  public static Sex getSexById(int id) {
    for (Sex sex : Sex.values()) {
      if (sex.getId() == id) {
        return sex;
      }
    }
    return null;
  }

  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;
  }

  @Override
  public String toString() {
    return "Sex{" +
      "id=" + id +
      ", name='" + name + '\'' +
      '}';
  }
}

TypeHandler clase de implementación:

@MappedJdbcTypes({JdbcType.CHAR,JdbcType.VARCHAR})
@MappedTypes(Sex.class)
public class SexTypeHandler extends BaseTypeHandler<Sex> {

    /**
     * 参数设置
     * @param ps Statement
     * @param i 参数位置
     * @param parameter 参数
     * @param jdbcType jdbc类型
     * @throws SQLException
     */
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Sex parameter, JdbcType jdbcType) throws SQLException {
        Integer sex = parameter.getId();
        ps.setString(i,sex.toString());
    }

    /**
     * 返回值处理
     * @param rs ResultSet结果集
     * @param columnName 当前列名
     * @return Sex
     * @throws SQLException
     */
    @Override
    public Sex getNullableResult(ResultSet rs, String columnName) throws SQLException {
        Integer id = Integer.valueOf(rs.getString(columnName));
        return Sex.getSexById(id);
    }

    /**
     * 返回值处理
     * @param rs 结果集
     * @param columnIndex 当前需要转为的列的位置
     * @return Sex
     * @throws SQLException
     */
    @Override
    public Sex getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        Integer id = Integer.valueOf(rs.getInt(columnIndex));
        return Sex.getSexById(id);
    }

    /**
     * 存储过程结果处理
     * @param cs
     * @param columnIndex 列的位置
     * @return 映射到属性上的值
     * @throws SQLException
     */
    @Override
    public Sex getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        Integer id = Integer.valueOf(cs.getInt(columnIndex));
        return Sex.getSexById(id);
    }
}

asignador de archivo de asignación:

<?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.my.mapper.UserMapper">

  <resultMap id="BaseResultMap" type="com.my.entity.User">
    <id column="id" jdbcType="INTEGER" property="id" />
    <result column="user_name" jdbcType="VARCHAR" property="userName" />
    <result column="real_name" jdbcType="VARCHAR" property="realName" />
    <!--  typeHandler指明使用的类型转换器,也可以不写会根据属性声明查找  -->
    <result column="sex" jdbcType="CHAR" property="sex" typeHandler="com.my.typehandler.SexTypeHandler"/>
    <result column="mobile" jdbcType="VARCHAR" property="mobile" />
    <result column="email" jdbcType="VARCHAR" property="email" />
    <result column="note" jdbcType="VARCHAR" property="note" />
    <result column="position_id" jdbcType="INTEGER" property="positionId" />
  </resultMap>

  <sql id="Base_Column_List">
    id, user_name, real_name, sex, mobile, email, note, position_id
  </sql>

  <select id="selectBySex" resultMap="BaseResultMap" parameterType="com.my.enums.Sex">
    select
    <include refid="Base_Column_List" />
    from user
    where sex = #{sex}
  </select>
</mapper>

Mybatis perfil:

    <typeHandlers>
<!--    可以在typeHandler标签上写javaType和jdbcType    -->
<!--        <typeHandler handler="com.my.typehandler.SexTypeHandler" javaType="com.my.enums.Sex" jdbcType="CHAR"></typeHandler>-->
                <typeHandler handler="com.my.typehandler.SexTypeHandler"></typeHandler>
    </typeHandlers>

Código de ensayo:

public class MybatisTest {

    private SqlSessionFactory sqlSessionFactory;

    @Before
    public void init() throws IOException {
        String resource = "mybatis-config.xml";
        //1.使用mybatis的工具读取配置文件
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        //2.创建sqlSessionFactory
        sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
        inputStream.close();
    }

    /**
     * 测试TypeHandler
     */
    @Test
    public void testTypeHandler() {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        List<User> users = userMapper.selectBySex(Sex.FEMALE);
        System.out.println(users);
        sqlSession.close();
    }

}

 

En tercer lugar, utilice los pasos

pasos:

1. Inheritance BaseTypeHandler <T> clase o implementar TypeHandler <T> interfaz, generalmente heredan BaseTypeHandler <T> clase, T se refiere a la java tipo de conversión genérico

2. El método de la reescritura de 4, de aquí en adelante se describirá

3. Entra mybatis perfil TypeHandler

4. Añadir @MappedJdbcTypes @MappedTypes y anotaciones en su clase de implementación de interfaz y notas explicativas convierten javaType jdbcType

 

BaseTypeHandler <T> anular el método descrito:

1..void setNonNullParameter (PreparedStatement ps, int i, el parámetro T, jdbcType jdbcType):

    Este método se llama cuando el ajuste de atributo, cuando el tipo de parámetro pasado es el método T, cómo el proceso de conversión, i es el número de columna

2.T getNullableResult (ResultSet rs, Cadena columnName):

    Este método se llama cuando la propiedad se establece en el valor de retorno, el valor de retorno cuando el tipo de propiedad es T, y JDBC partido de tipos, cómo el proceso de conversión, un nombre de columna columnName

3.T getNullableResult (ResultSet rs, int columnIndex):

    Este método se llama cuando la propiedad se establece en el valor de retorno, el valor de retorno cuando el tipo de propiedad es T, y JDBC partido de tipos, cómo el proceso de conversión, la columna número columnName

4.T getNullableResult (CallableStatement cs, int columnIndex):

    Este método se llama cuando la propiedad se establece en el valor de retorno, el valor de retorno cuando el tipo de propiedad es T, y los tipos JDBC coinciden, cómo el proceso de conversión, el número columnName columna, el método es un procedimiento almacenado en el proceso de operación.

 

Descripción @MappedJdbcTypes

La anotación utilizada en TypeHandler <T> clase de implementación, lo que indica que los conversos tipo JDBC y puede ser una pluralidad de escritura.

 

Descripción @MappedTypes

La anotación se utiliza en TypeHandler <T> clase de implementación, Java indicar el tipo de conversión se requiere, en general, sólo uno escrito.

 

En cuarto lugar, suplemento

1.BaseTypeHandler <T> clase también implementa TypeHandler <T> interfaz, y para hacer un poco de paquetes, tipo personalizado clase Converter puede heredar.

2.id, atributos de etiqueta TypeHandler resultan en prescindible, porque encuentra basado en el tipo de declaración de propiedad.

3. Cuando el convertidor de tipos de registro, puede definir el bien y el javaType jdbcType en mybatis perfil, pero en general está definido en la clase de implementación de la interfaz.

 

Publicado 61 artículos originales · ganado elogios 81 · Vistas de 100.000 +

Supongo que te gusta

Origin blog.csdn.net/m0_37914588/article/details/104757034
Recomendado
Clasificación