SpringBoot集成JPA+hikariCP连接池实现增删改查以及相关的注意事项

目录

一、新建工程:

二、关键依赖

三、配置文件 application.yml

四.创建实体

五.创建repository

六.创建controller 

七.修改启动类,增加@EnableJpaAuditing注解

注意事项:

1.Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException

2.org.hibernate.id.IdentifierGenerationException

3.com.mysql.cj.jdbc.exceptions.MysqlDataTruncation

4.java.sql.SQLIntegrityConstraintViolationException


一、新建工程:

 

创建一个springboot工程,maven或者gradle来管理依赖包。

二、关键依赖

<!-- mysql连接驱动 -->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- jpa相关的依赖包 -->
<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <scope>runtime</scope>
</dependency>
<!-- lombok插件 -->
<dependency>
   <groupId>org.projectlombok</groupId>
   <artifactId>lombok</artifactId>
   <optional>true</optional>
</dependency>

spring-boot-starter-data-jpa相关的依赖包里包含了连接池 HikariCP ,从 Spring Boot 2.x 开始, Spring Boot 默认的连接池更换成为 HikariCP,据说这是目前性能最好的java数据库连接池。

三、配置文件 application.yml

server:
  port: 8080

spring:
  application:
    name: demo
  jpa:
    #数据库
    database: mysql
    #控制台打印jpa的执行sql
    show-sql: true
    #是否执行datasource.schema脚本
    generate-ddl: false
    #数据库引擎
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    #建立/更新数据表的配置
    hibernate:
      ddl-auto: none
  datasource:
    #数据库地址
    url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
    #数据库用户名
    username: root
    #数据库密码
    password: 123456
    #驱动类
    driver-class-name: com.mysql.jdbc.Driver
    #数据源的类型
    type: com.zaxxer.hikari.HikariDataSource
    #数据库连接池hikari配置信息
    hikari:
      #此属性控制从池返回的连接的默认自动提交行为,默认值:true
      auto-commit: true
      #最小空闲连接数量
      minimum-idle: 2
      #空闲连接存活最大时间,默认600000(10分钟)
      idle-timeout: 60000
      #数据库连接超时时间,默认30秒,即30000
      connection-timeout: 30000
      #此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟
      max-lifetime: 1800000
      #连接池母子
      pool-name: DatebookHikariCP
      #连接池最大连接数,默认是10
      maximum-pool-size: 5

spring.jpa.hibernate.ddl-auto值说明:

  • update:Hibernate根据给定的Entity结构改变数据库。
  • create: 每次都会创建数据库,关闭时不会删除
  • none: mysql的默认设置 , 不改变数据结构
  • create-drop: 创建数据库,但是每次sessionFactory关闭后都会删除

注意:jpa.generate-ddl和jpa.hibernate.ddl-auto都可以控制是否执行datasource.schema脚本,来初始化数据库结构,只要有一个为可执行状态就会执行,比如jpa.generate-ddl:true或jpa.generate-ddl:update,并没有相互制约上下级的关系。要想不执行,两者都必须是不可执行状态,比如false和none。

四.创建实体

实体中的@EntityListeners(AuditingEntityListener.class) 注解下方注意事项中有涉及

@Entity
@Data
@EntityListeners(AuditingEntityListener.class)
@Table(name = "test")
public class Test {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @Column(name = "name")
    private String name;

    @CreatedDate
    @Column(name = "create_time")
    private Date createTime;

    @LastModifiedDate
    @Column(name = "update_time")
    private Date updateTime;
}

五.创建repository

public interface TestRepository extends JpaRepository<Test, Long> {
}

六.创建controller 

@RestController
public class TestController {
    @Resource
    TestRepository testRepository;

    /**
     * 根据ID查询.
     * @param id ID
     * @return Test对象
     */
    @GetMapping("/getOne")
    public Test getOne(Long id) {
        return testRepository.getOne(id);
    }

    /**
     * 新增数据.
     * @param test 新增Test对象
     * @return
     */
    @PostMapping("/insert")
    public String insert(Test test) {
        testRepository.save(test);
        return "success";
    }

    /**
     * 根据ID删除数据.
     * @param id ID
     * @return
     */
    @GetMapping("/delete")
    public String delete(Long id) {
        testRepository.deleteById(id);
        return "success";
    }

    /**
     * 修改test数据.
     * @param test Test对象
     * @return
     */
    @PostMapping("/update")
    public String update(Test test) {
        // 有主键为修改,无主键为新增
        testRepository.save(test);
        return "success";
    }
}

七.修改启动类,增加@EnableJpaAuditing注解

@SpringBootApplication
@EnableJpaAuditing
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

注意事项:

前面的集成是比较简单的,这些坑需要注意。

1.Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException

异常信息
Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value '?й???????' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the 'serverTimezone' configuration property) to use a more specific time zone value if you want to utilize time zone support.
错误原因:spring.datasource.url 配置中没有设置serverTimezone(服务器时区)
解决方式:设置时区:serverTimezone=UTC
参考:
spring:
  datasource: 
     url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC

2.org.hibernate.id.IdentifierGenerationException

异常信息:
org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): com.gene.lottery.analysis.system.entity.ShuangsqFullDataDictionary
错误原因:springboot集成jpa时没有设置实体类ID的生成策略,数据库设置的是自增长主键,但是对于JPA来说必须在实体内设置才可以。
解决方式:实体主键字段设置生成策略:@GeneratedValue(strategy=GenerationType.IDENTITY)
参考:
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "id")
private String id;

3.com.mysql.cj.jdbc.exceptions.MysqlDataTruncation

异常信息:
com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Incorrect datetime value: '20-11-2 下午8:57' for column 'create_time' at row 1
错误原因:该字段为Date类型,但是当时设置成了String类型,可能导致了框架在处理时间的时候默认做了相应转换,转成了'20-11-2 下午8:57',数据库的时间格式可能是‘yyyy-MM-dd HH:mm:ss’,导致了时间格式不匹配。
解决方式:将该字段修改成Date类型
参考:
    @CreatedDate        // 该注解请参考下一个异常
    @Column(name = "create_time")
    private Date createTime;

4.java.sql.SQLIntegrityConstraintViolationException

异常信息:
java.sql.SQLIntegrityConstraintViolationException: Column 'create_time' cannot be null
错误原因:create_time字段数据库设置不能为null(数据库设置了默认值但是不生效)
解决方式:

  1. 在entity中添加注解 @EntityListeners(AuditingEntityListener.class)
  2. 在时间字段增加 @CreatedDate
  3. 在自动更新时间戳字段增加 @LastModifiedDate
  4. 在Spring boot启动类增加注解 @EnableJpaAuditing

参考:

实体类:

@Entity
@Data
@EntityListeners(AuditingEntityListener.class)
@Table(name = "test")
public class Test {

    @CreatedDate
    @Column(name = "create_time")
    private Date createTime;

    @LastModifiedDate
    @Column(name = "update_time")
    private Date updateTime;

}

启动类:

@SpringBootApplication
@EnableJpaAuditing
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

以上就是我在SpringBoot集成JPA+hikariCP连接池实现增删改查的过程以及该过程中踩到的坑。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值