资料来自互联网,在此只是做一个汇总备忘,在做公司JAP数据脱敏,加解密用到了,就想如果是mybatis该怎么做方便,这里就找资料做一下备忘。
2.JAP 转换:
在java JPA注解中,有个
@Convert
注解,其中需要传入一个Class作为convert参数,该class需要实现
AttributeConverter<X,Y>
接口。下面来看看AttributeConverter接口的作用。
AttributeConverter<X,Y>
实体属性类型转换器。主要使用场景:
代码中数据类型,到数据库中类型,可能不一致或者需要做一个修饰转换,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 接口里面 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,...
我先提出我对于jpa与mybatis使用后的理解
**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
查询大量数据,若不想内存溢出,一般会使用分页查询,但分页查询,随着页数的变大会有性能问题,所以这次可以使用流式查询了,本文针对不同的持久层框架(mybatis,JPA,原始JDBC),各自码了一版流式查询的代码
用于数据库属性类型与java存储的类型做转换,例如枚举类型,在存储到数据库时或者在数据库取出来时,不用手动转换。
必须实现接口AttributeConverter<X,Y>,源码如下:
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 , 只...