添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

资料来自互联网,在此只是做一个汇总备忘,在做公司JAP数据脱敏,加解密用到了,就想如果是mybatis该怎么做方便,这里就找资料做一下备忘。

2.JAP  转换:

在java JPA注解中,有个 @Convert 注解,其中需要传入一个Class作为convert参数,该class需要实现 AttributeConverter<X,Y> 接口。下面来看看AttributeConverter接口的作用。

AttributeConverter<X,Y>

实体属性类型转换器。主要使用场景:

  • 持久化enum
  • 加解密数据
  • 持久化日期

代码中数据类型,到数据库中类型,可能不一致或者需要做一个修饰转换,JPA里需要实现 AttributeConverter<X,Y> 该接口中现两个方法:

  • y convertToDatabaseColumn(x) 作用:将实体属性x转化为y存储到数据库中,即插入和更新操作时执行;
  • x convertToEntityAttribute(y) 作用:将数据库中的字段y转化为实体属性x,即查询操作时执行。

例如 :实体枚举类型到数据库种类型的相互转换:

@Entity
@Table(name = "t_demo")
public class DemoEntity {
    @Convert(converter = StatusAttributeConverter.class)
    private String status; //状态:1 启用,-1 禁用,-2 已删除
//-----------------------------------------------
public class StatusAttributeConverter implements AttributeConverter<String, Integer> {
    @Override
    public Integer convertToDatabaseColumn(String status) {
        try {
            return Integer.parseInt(status);    //如果是数字,则直接返回(这里可以遍历StatusEnum的value来进一步验证)
        } catch (NumberFormatException e) {
            for (StatusEnum type : StatusEnum.values()) {    //如果不是数字,则通过StatusEnum来找到描述对应的数字
                if (status.equals(type.getDescription())) {
                    return type.getValue();
        throw new RuntimeException("Unknown StatusEnum: " + status);    //如果StatusEnum里不存在代表数字或描述,则抛出异常
    @Override
    public String convertToEntityAttribute(Integer value) {
        for (StatusEnum type : StatusEnum.values()) {    //将数字转换为描述
            if (value.equals(type.getValue())) {
                return type.getDescription();
        throw new RuntimeException("Unknown database value: " + value);
//-----------------------------------------------
public enum StatusEnum {
    ENABLE(1, "启用"), DISABLE(-1, "禁用"), DELETED(-2, "已删除");
    StatusEnum(Integer value, String description) {
        this.value = value;
        this.description = description;

3.mybatis 字段类型转换 

调研发现,有两种套路可寻,使用mybatis的拦截插件和自定义TypeHandler,这里先介绍TypeHandler的方式,需要自己代码实践验证。摘自:https://blog.csdn.net/acm_lkl/article/details/78609341

  • TypeHandler接口方式

    首先实现 TypeHandler 接口里面 getXXX,setXXX 方法,注意实现类上面的注解:@MappedJdbcTypes,@MappedTypes,MappedJdbcTypes是配置jdbc类型,这里的Jdbc类型必须org.apache.ibatis.type.JdbcType中的枚举类型, MappedTypes定义的是需要被拦截的java类型,TypeHandler T泛型,是传入的java类型。

package com.sankuai.lkl.typeHandler;
import com.sun.deploy.util.StringUtils;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
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.Arrays;
import java.util.List;
@MappedJdbcTypes(JdbcType.VARCHAR)
@MappedTypes({List.class})
public class ListTypeHandler implements TypeHandler<List<String>> {
    @Override
    public void setParameter(PreparedStatement ps, int i, List<String> parameter, JdbcType jdbcType) throws SQLException {
        String hobbys = StringUtils.join(parameter, ",");
        try {
            ps.setString(i, hobbys);
        } catch (Exception e) {
            e.printStackTrace();
    @Override
    public List<String> getResult(CallableStatement cs, int columnIndex) throws SQLException {
        String hobbys = cs.getString(columnIndex);
        return Arrays.asList(hobbys.split(","));
    @Override
    public List<String> getResult(ResultSet rs, int columnIndex) throws SQLException {
        return Arrays.asList(rs.getString(columnIndex).split(","));
    @Override
    public List<String> getResult(ResultSet rs, String columnName) throws SQLException {
        return Arrays.asList(rs.getString(columnName).split(","));

   然后,在mybaites配置文件 mybatis-config.xml里面,注册typehandler:

<typeHandlers>
        <typeHandler jdbcType="VARCHAR" javaType="list"
                     handler="com.sankuai.lkl.typeHandler.ListTypeHandler"/>
</typeHandlers>

 最后,在实体类sql mapping xml里面配置,字段的typehandler:

<insert id="insertPerson" parameterType="person">
        INSERT INTO person (id,name,sex,hobbys,data_time) values(#{id},#{name},#{sex},#{hobbys,typeHandler=com.sankuai.lkl.typeHandler.ListTypeHandler},#{date})
</insert>
<resultMap id="personMap" type="person">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="sex" column="sex"/>
        <result property="hobbys" column="hobbys" typeHandler="com.sankuai.lkl.typeHandler.ListTypeHandler"/>
        <result property="date" column="data_time"/>
</resultMap>
我们平时在做开发的时候,会遇到一个字段保存json串的情况。一般情况下mybatis-plus在做插入/更新之前将对象手动转换成json串,查询要用的时候再手动的从json转换成对象,非常的low。有没有什么方案将这个过程进行自动转换呢?有,通过这个注解实现> type;> type) {} // 这里对json串进行解析 protected Object parse(String json) {try { 什么是JPAJPA(Java Persistence API)是Java标准中的一套ORM规范,借助JPA技术可以通过注解或者XML描述【对象-关系表】之间的映射关系,并将实体对象持久化到数据库中(即Object Model与Data Model间的映射)。JPA之于ORM(持久层框架,如MyBatis、Hibernate等,用于管理应用层Object与数据库Data之间的映射)正如JDBC之于数... spring-data-jpa-template主要解决的问题:动态的拼接 SQL, 类似 MyBatis, 通过 freemarker 来实现的能够返回任何对象,List,Page..... 一、为什么使用Spring Data JPA 上篇文章《SpringBoot讲解一:搭建SSM项目+Thymeleaf+HikariCP》之所以选用Mybatis框架,是因为SSM框架在国内大火了几年,Mybatis几乎成了Java从业者的必备技术。十年前具有煊赫名头,被称之为Java三大框架的SSH,其中的Struts2和Hibernate已经少初学者问津了,而且就算在企业中也是纷纷弃用SSH,... 我先提出我对于jpamybatis使用后的理解 **mybatis:**半自动化orm框架,所有sql语句均需要开发者把握,我觉得不太喜欢的就是增加类时,有需要去增加它的映射文件,好吧,你说有生成器,但还是难免需要修改实体类,如增加一个属性,那我是不是需要去xml,好好的把属性加上去。就是mybatis的这一点觉得有点小烦 **jpa:**全自动的orm框架,有点是sql语句不用开发者... 一、Jpa 方案一:利用Jpa的自定义数据类转换 实现原理:利用Jpa的自定义数据类转换,只不过我们这里是String转String,即从明文转密文或者密文转明文 package com.cdn.test.entity; import lombok.Data; import lombok.extern.slf4j.Slf4j; import javax.persistence.*; @Slf4j @Data @Entity @Table(na 查询大量数据,若不想内存溢出,一般会使用分页查询,但分页查询,随着页数的变大会有性能问题,所以这次可以使用流式查询了,本文针对不同的持久层框架(mybatisJPA,原始JDBC),各自码了一版流式查询的代码 用于数据库属性与java存储的类转换,例如枚举类,在存储到数据库时或者在数据库取出来时,不用手动转换。 必须实现接口AttributeConverter&lt;X,Y&gt;,源码如下: package javax.persistence; * A class that implements this interface can be used to conver... MyBatis 插入空值时,需要指定jdbcType,否则会出现出现1111错误 当数据类不同时如果数据库id字段是int类,那么它的jdbc就是Integer类。当实体类的这个映射属性id为Long类时,如果不设置jdbcType和javaType的话,查询的结果返回给实体时就会转换错误,写了这两个mybatis就会帮我们转换成相应的类,从来避免发生错误 其余情况可以... java有java的数据类,数据库有数据库的数据类, 那么在往数据库中插入数据的时候是如何把java类当做数据库类插入数据库? 在从数据库读取数据的时候又是如何把数据库类当做java类来处理呢? mybatis中jdbcType时间类 jdbcType = DATE , 只传入年月日  (数据库中的时间为yyyy-MM-dd) jdbcType = TIME , 只...