美文网首页
springboot项目自定义mybatis TypeHandl

springboot项目自定义mybatis TypeHandl

作者: 云中小鱼 | 来源:发表于2021-08-11 15:58 被阅读0次

    项目中需要将java对象以json的方式存储到数据库中的一个字段;最简单的方式是添加、修改时手动进行序列化,查询时再手动进行反序列化;还有一种方式就是自定义实现TypeHandler(mybatis作为持久层框架)将对象的序列与反序列化交给框架。

    一、核心依赖

    <!--      springboot      -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot</artifactId>
        <version>2.4.5</version>
    </dependency>
    <!--      lombok      -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.10</version>
    </dependency>
    <!--      fastjson      -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.68</version>
    </dependency>
    <!--      数据库相关      -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.18</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.2.6</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.2.0</version>
    </dependency>
    

    二、实现自定义TypeHandler

    1. bean关系Order中包含User和Item如下

    /**
     * 订单类
     */
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @Accessors(chain = true)
    public class Order {
        private Long id;
        private BigDecimal price;
        /**
         * 物品信息
         */
        private Item item;
        /**
         * 用户
         */
        private User user;
    }
    
    /**
     * 物品
     */
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @Accessors(chain = true)
    public class Item {
        private String name;
        private BigDecimal length;
        private BigDecimal width;
        private BigDecimal weight;
    }
    
    /**
     * 用户
     */
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @Accessors(chain = true)
    public class User {
        private String name;
        private Long id;
    }
    

    2. 自定义TypeHandler

    // 声明数据库中对应数据类型
    @MappedJdbcTypes(JdbcType.VARCHAR)
    // 转化后的类型
    @MappedTypes(Item.class)
    // 继承BaseTypeHandler(TypeHandler接口的实现类)
    public class ItemTypeHandler extends BaseTypeHandler<Item> {
    
        public Item delResult(String jsonSource) throws SQLException {
            if (jsonSource != null) {
                Item item = null;
                try {
                    item = JSON.parseObject(jsonSource, Item.class);
                } catch (JSONException ex) {
                    throw new SQLException("There is an error converting JSONObject to json format for the content:" + jsonSource);
                }
                return item;
            }
            return null;
        }
    
        @Override
        public void setNonNullParameter(PreparedStatement ps, int i, Item parameter, JdbcType jdbcType) throws SQLException {
            ps.setString(i, JSON.toJSONString(parameter));
        }
    
        @Override
        public Item getNullableResult(ResultSet rs, String columnName) throws SQLException {
            return delResult(rs.getString(columnName));
        }
    
        @Override
        public Item getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
            return delResult(rs.getString(columnIndex));
        }
    
        @Override
        public Item getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
            return delResult(cs.getString(columnIndex));
        }
    }
    
    @MappedJdbcTypes(JdbcType.VARCHAR)
    @MappedTypes(User.class)
    public class UserTypeHandler extends BaseTypeHandler<User> {
    
        public User delResult(String jsonSource) throws SQLException {
            if (jsonSource != null) {
                User user = null;
                try {
                    user = JSON.parseObject(jsonSource, User.class);
                } catch (JSONException ex) {
                    throw new SQLException("There is an error converting JSONObject to json format for the content:" + jsonSource);
                }
                return user;
            }
            return null;
        }
    
        @Override
        public void setNonNullParameter(PreparedStatement ps, int i, User parameter, JdbcType jdbcType) throws SQLException {
            ps.setString(i, JSON.toJSONString(parameter));
        }
    
        @Override
        public User getNullableResult(ResultSet rs, String columnName) throws SQLException {
            return delResult(rs.getString(columnName));
        }
    
        @Override
        public User getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
            return delResult(rs.getString(columnIndex));
        }
    
        @Override
        public User getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
            return delResult(cs.getString(columnIndex));
        }
    }
    

    3. 配置文件中配置扫描自定义TypeHandler

    # 值为包名
    mybatis.type-handlers-package=com.example.demo.dao.handler
    

    三、测试

    1. Controller

    @RestController
    public class OrderController {
    
        @Autowired
        private OrderDAO orderDAO;
    
        @PostMapping("/add")
        public Object putOne(@RequestBody Order order) {
            int insert = orderDAO.insert(order);
            return order.getId();
        }
    
        @GetMapping("/get")
        public Object getOne(Long id){
            Order order = orderDAO.selectByPrimaryKey(id);
            return order;
        }
    
    }
    

    2. 调用测试

    • 插入


      图片.png
    • 查询


      图片.png
    • 数据库中数据


      图片.png

    相关文章

      网友评论

          本文标题:springboot项目自定义mybatis TypeHandl

          本文链接:https://www.haomeiwen.com/subject/yytufltx.html