PGSQL json 字段 插入失败----------- java + mybatis+ PgSQL

本文介绍了一种解决MyBatis在处理JSON字段插入时的问题方法,通过自定义类型处理器(JSONTypeHandler),实现对JSON字段的正确读取与写入,适用于使用PostgreSQL数据库的场景。

      针对最近遇到的一个sql插入问题:表中有一个字段为json,jdbcType=other ,但是无论用对象还是string字符要么报字段为空,要么说输入的是字符串无法装换成json字段。参考了网上很多博客,终于找到一种方法,自己写一个继承org.apache.ibatis.type.BaseTypeHandler类型处理器类,并在mapper映射的xml文件中指定类型,具体步骤如下:

  • 修改自动生成的实体类的字段类型 Object -> com.alibaba.fastjson.JSONObject

 

    @Column(name = "youyou")
    private List<JSONObject> youyou;
  • 写一个JSONTYPEHandler类

  • 
    import org.apache.ibatis.type.BaseTypeHandler;
    import org.apache.ibatis.type.JdbcType;
    import org.apache.ibatis.type.MappedTypes;
    import org.postgresql.util.PGobject;
    
    import java.sql.CallableStatement;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    
    @MappedTypes(Object.class)
    public class JSONTypeHandler extends BaseTypeHandler<Object> {
    
        
    
        private static final PGobject jsonObject = new PGobject();
    
        @Override
        public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
            jsonObject.setType("json");
            jsonObject.setValue(parameter.toString());
            ps.setObject(i, jsonObject);
        }
    
        @Override
        public Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
            return rs.getString(columnIndex);
        }
    
        @Override
        public Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
            return cs.getString(columnIndex);
        }
    
        @Override
        public Object getNullableResult(ResultSet rs, String columnName) throws SQLException {
            return rs.getString(columnName);
        }
    
    
    
    }
    

     

  • 在**mapper.xml文件中指定对应的类型
  • <result column="you_you" javaType="Object" property="youyou"
                jdbcType="OTHER" typeHandler="**.util.JSONTypeHandlerPg" />
    <insert id="insertYouYou" parameterType="**.YouYou" >
        insert into t_table ( you_you)
        values (
        #{youYou.youyou,javaType=Object,jdbcType=OTHER,typeHandler=**.JSONTypeHandlerPg}
        );
      </insert>
      
    <update id="updateYouYou">
        update t_table
        set
          you_you= #{youYou.youyou,javaType=Object,jdbcType=OTHER,typeHandler=**.JSONTypeHandlerPg},
          mtime = #{youYou.mtime}
        where you_id = #{youYou.youId};
      </update>

     

<think>好的,我需要帮助用户了解如何使用SpringBoot和MyBatis-Plus实现PostgreSQL数据库的增删改查操作。首先,我应该回顾用户提供的引用内容,看看里面有没有相关的信息可以利用。 引用[1]提到新建一个Spring Boot项目来讲解MyBatis-Plus的使用,但具体步骤可能没有详细说明。引用[2]讨论了SpringBoot整合MyBatis-Plus的好处,比如减少编写SQL语句,实现简单的CRUD操作,这可能对用户有帮助。引用[3]提到了代码生成器的使用,这可能也是关键步骤之一,因为MyBatis-Plus的代码生成器可以自动生成实体类、Mapper接口等,节省时间。 接下来,我需要组织一个详细的教程。通常,这样的教程会包括以下几个步骤: 1. **创建Spring Boot项目**:使用Spring Initializr或者IDE创建项目,添加必要的依赖,比如PostgreSQL驱动、MyBatis-Plus、Spring Web等。 2. **配置数据库连接**:在application.yml或application.properties中配置PostgreSQL的连接信息,包括URL、用户名、密码。 3. **创建实体类**:使用MyBatis-Plus的注解(如@TableName、@TableId)定义实体类,对应数据库表。 4. **创建Mapper接口**:继承MyBatis-Plus的BaseMapper接口,这样可以直接使用内置的CRUD方法。 5. **配置分页插件**:如果需要分页功能,添加分页插件的配置类。 6. **编写Service层**:创建Service接口及其实现类,调用Mapper的方法实现业务逻辑。 7. **编写Controller层**:处理HTTP请求,调用Service层的方法返回结果。 8. **测试接口**:使用Postman或单元测试验证增删改查功能。 另外,引用[3]提到的代码生成器可以自动生成这些代码,用户可能对此感兴趣,所以需要详细说明如何配置生成器类,指定数据库连接,选择生成哪些模块,设置输出路径等。 需要注意的是,用户提到使用PostgreSQL,所以在配置数据库连接时要确保驱动正确,依赖已添加。同时,MyBatis-Plus默认使用MySQL的语法,某些情况下可能需要调整SQL方言,但通常MyBatis-Plus能自动处理。 在示例代码部分,应该给出实体类、Mapper、Service和Controller的具体代码,并说明每个部分的作用。例如,实体类使用@TableName注解指定表名,主键使用@TableId。Mapper接口继承BaseMapper后,可以直接使用selectList、insert、updateById、deleteById等方法。 可能遇到的问题包括依赖冲突、数据库连接失败、表名或字段名映射不正确等,应该在教程中提醒用户检查这些点,比如开启MyBatis-Plus的SQL日志打印,方便调试。 最后,按照用户要求生成相关问题,可能涉及性能优化、高级功能(如分页、事务管理)、与其他技术的整合等。 现在需要将这些步骤结构化,确保符合用户的要求,使用正确的中文表达,并正确应用LaTeX格式的行内公式(如果有数学表达式的话,但在这个主题中可能较少,不过仍需注意)。同时,引用标记要正确放置在参考内容的末尾。</think>[用户可见层] # SpringBoot + MyBatis-Plus + PostgreSQL 增删改查教程 ### 一、环境准备 1. **创建Spring Boot项目** - 通过[Spring Initializr](https://start.spring.io/)创建项目,选择依赖: - `Spring Web` - `PostgreSQL Driver` - `MyBatis Framework`(或直接引入MyBatis-Plus依赖) - 手动添加MyBatis-Plus依赖至`pom.xml`: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3.1</version> </dependency> ``` 2. **配置数据库连接** - 在`application.yml`中添加PostgreSQL配置: ```yaml spring: datasource: url: jdbc:postgresql://localhost:5432/your_database username: postgres password: your_password driver-class-name: org.postgresql.Driver ``` --- ### 二、代码生成器配置(可选) 通过代码生成器可快速生成实体类、Mapper等文件[^3]: ```java public class CodeGenerator { public static void main(String[] args) { AutoGenerator generator = new AutoGenerator(); generator.setDataSource(new DataSourceConfig.Builder( "jdbc:postgresql://localhost:5432/your_db", "postgres", "your_pwd").build()); // 设置包路径 PackageConfig packageConfig = new PackageConfig.Builder() .parent("com.example.demo") .entity("entity") .mapper("mapper").build(); generator.execute(); } } ``` --- ### 三、核心代码实现 1. **实体类定义** ```java @Data @TableName("user") // 对应数据库表名 public class User { @TableId(type = IdType.AUTO) // 主键自增 private Long id; private String name; private Integer age; } ``` 2. **Mapper接口** ```java public interface UserMapper extends BaseMapper<User> { // 继承BaseMapper后,已包含基础的CRUD方法 } ``` 3. **Service层** ```java public interface UserService extends IService<User> {} @Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {} ``` 4. **Controller层** ```java @RestController @RequestMapping("/user") public class UserController { @Autowired private UserService userService; // 查询所有用户 @GetMapping("/list") public List<User> list() { return userService.list(); } // 新增用户 @PostMapping("/add") public boolean add(@RequestBody User user) { return userService.save(user); } // 修改用户 @PostMapping("/update") public boolean update(@RequestBody User user) { return userService.updateById(user); } // 删除用户 @DeleteMapping("/{id}") public boolean delete(@PathVariable Long id) { return userService.removeById(id); } } ``` --- ### 四、测试验证 1. **启动类添加Mapper扫描** ```java @SpringBootApplication @MapperScan("com.example.demo.mapper") public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } ``` 2. **通过Postman测试接口** - `GET /user/list`:查询用户列表 - `POST /user/add`:提交JSON格式用户数据 - `POST /user/update`:更新用户信息 - `DELETE /user/{id}`:按ID删除用户 --- ### 五、注意事项 1. **SQL日志打印** 在`application.yml`中开启MyBatis-Plus日志: ```yaml mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl ``` 2. **表名与字段映射** 若表名或字段名含下划线(如`user_info`),需使用`@TableField("user_name")`注解显式映射。 3. **分页插件配置** 若需分页查询,添加配置类: ```java @Configuration public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor paginationInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return interceptor; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值