最近在做的功能,由于别的数据库有值,需要这边的不同入口的进来查询,所以需要同步过来,如果再继续一个一个生成列对应处理感觉不方便,如果没有别的操作,只是存储和查询,那就可以用MySql支持的json格式存储了。
MySql的json是5.7之后才可以处理的,所以版本一定要是这个或者比这个高呦!
首先第一步我们需要定义个处理json类型类,可以叫BaseAttributeTypeHandler,来继承BaseTypeHandler这个ibatis的类,一定要定义类型,后期传参用,
package xx;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.type.TypeFactory;
import io.lettuce.core.dynamic.support.ResolvableType;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.springframework.util.Assert;
import java.io.IOException;
import java.lang.reflect.Type;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* @Author df
* @Description: 基础类, 处理mySql字段为json类型
* @Date 2023/10/19 9:52
*/
public abstract class BaseAttributeTypeHandler extends BaseTypeHandler
定义要存储的json类型的实体类,假如存储个用户信息把,我们就定义了UserSportTypeHandler,然后继承刚才的类BaseAttributeTypeHandler,传入json实体UserSport(你们自己定义的要存储或者查询出来的实体哈)
public class UserSportTypeHandler extends BaseAttributeTypeHandler {
}
存储时在po实体里添加如下的说明,好让MySql知道是json,这里的typeHandler则定义为UserSportTypeHandler
@Data
public class User {
private Long id;
private String username;
@TableField(jdbcType = JdbcType.OTHER, typeHandler = UserSportTypeHandler.class)
private UserSport userSport;
}
调用mybatis插件直接保存即可
public class UserBusinessImpl extends ServiceImpl implements UserBusiness {
public Boolean saveSportDataBatch(List users) {
super.saveBatch(users);
}
}
测试下,可以哦,直接存储了json的数据
当然还可以存储list以及list
public class UserSportTypeHandler extends BaseAttributeTypeHandler> {
}
也可以在mapper.xml里这样添加,也要指明typeHadler
INSERT INTO user_sport_record (user_sport)
VALUES (
#{item.userSport,javaType=com.uniigym.Uniiuser.infrastructure.po.HeartDistribute,typeHandler=HeartDistributeTypeHandler,jdbcType=OTHER});
当然你要是自己在mapper里写,可以在resultMap下里写,示例:
这样查询和添加都可以用这个,但是要在sql种指定resultMap的id,但是如果实体上写了 @TableField(jdbcType = JdbcType.OTHER, typeHandler = UserSportTypeHandler.class),就不用在ResultMap标签在定义了。如果都不配置typeHandler则关于json的字段查询出来为空,只有对了查询和保存才可以处理。