SpringDataJPA框架使用笔记

news2024/9/20 8:52:06

SpringDataJPA框架使用笔记

什么是JPA

jpa概念

JPA是Java中用于实现对象关系映射ORM的API标准,
JPA提供了一种将JAVA对象映射到关系数据库的方式,
使开发人员可以使用面向对象的方式操作数据库,而不需要编写繁琐的SQL语句。
jpa中的一些概念有:
实体类Entity
实体管理器EntityManager
实体管理器工厂EntityManagerFactory
持久化上下文PersistenceContext
主键PrimaryKey
关系映射Relationship Mapping
查询语言JPQL

一些jpa框架

目前Java开发市场中的JPA框架有:
1.Hibernate 
最流行的JPA实现之一,提供了全面的ORM功能,常和Structs2 +Spring一起使用,即SSH技术体系
2.EclipseLink
是Eclipse基金会提供的JPA实现,高性能,可扩展,支持多数据源
3.SpringDataJPA
是Spring提供的JPA实现,可以使用少量代码实现常见的CRUD操作,而无需写复杂的实现代码。
4.OpenJPA
是Apache基金会的一个项目,实现了JPA规范,支持动态代理和动态类增强。

什么是springDataJPA

SpringDataJPA是spring框架下的一个模块,用于简化JPA的开发,
它结合了spring框架和JPA的特性,提供了一种简便的方法来访问和操作数据库。
它使用少量的注解和约定,自动实现常见的CRUD操作,减轻了开发负担

SpringDataJPA的一些主要特性:
1.仓库接口Repository Interface
SpringDataJPA通过仓库接口来提供数据访问功能,
自定义的xxxRepository需要继承 JpaRepository /CrudRepository/JpaSpecificationExecutor
来获取JPA相关操作功能

2.自定义查询方法
通过springDataJPA方法的命名约定实现自动生成查询,它会根据方法名和参数,自动解析出相应的查询条件,并生成相应的SQL语句执行查询

3.查询创建器
可以在方法名中使用findBy\And\Or等关键字,快速定义复杂的查询条件

4.分页和排序
在查询方法中传递Pageable参数,可以指定需要返回的页数、每页记录数和排序方式

5.对其他数据库和NoSql的支持
除了常见的关系数据库,还支持如MongoDB/Neo4j/ES/Redis等NoSQL数据库

springboot整合JPA操作mysql数据库

xml依赖配置

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>   

开启JPA审计功能

@Slf4j

// 启注解事务管理,等同于xml配置方式的 <tx:annotation-driven />
@EnableTransactionManagement 

//启用JPA审计功能-自动写新增时间/修改时间 (插入的时间可以是Date也可以是Long型)
@EnableJpaAuditing

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

yml配置

spring:
  datasource:
#    driver-class-name: com.mysql.jdbc.Driver #mysql5的驱动
    driver-class-name: com.mysql.cj.jdbc.Driver #mysql8的驱动
    name: defaultDataSource
    url: jdbc:mysql://127.0.0.1:3307/aep?serverTimezone=UTC&autoReconnect=true&autoReconnectForPools=true&useUnicode=true&characterEncoding=utf8&useSSL=false
    username: aep
    password: aep123456
    type: com.zaxxer.hikari.HikariDataSource
    hikari:
      maximum-pool-size: 20
      minimum-idle: 5
  jpa:
    database: mysql
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    show-sql: true
    hibernate:
#      ddl-auto: create-drop #开机时重建数据库表结构(清库后重建)
      ddl-auto: update  #开机时更新数据库表结构(更新库表字段)
    open-in-view: false

使用示例代码

实体类

package cn.test.orm.menu;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.*;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.*;
import java.util.Date;

@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "t_menu")
@EntityListeners(AuditingEntityListener.class)
@SQLDelete(sql = "update t_menu set is_del = 1 where id = ?")
@Where(clause = "is_del = 0")
@DynamicUpdate
@DynamicInsert
@org.hibernate.annotations.Table(appliesTo = "t_menu",comment="前端菜单表")
public class MenuDO {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String url;

    private String path;

    private String component;

    private String name;

    private String iconCls;

    private Boolean keepAlive;

    private Boolean requireAuth;

    private Integer parentId;

    private Boolean enabled;


    @Column(columnDefinition = "varchar(255) DEFAULT NULL COMMENT '备注'")
    private String remark;

    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
    @Column(name = "create_time",columnDefinition = "datetime DEFAULT NULL COMMENT '添加时间'")
    @CreatedDate
    private Date createTime;

    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
    @Column(name = "update_time",columnDefinition = "datetime DEFAULT NULL COMMENT '修改时间'")
    @LastModifiedDate
    private Date  updateTime;


    @Column(name = "is_del", columnDefinition = "int(1)  DEFAULT 0 COMMENT '逻辑删除标志'")
    private Integer isDel=0;
}


///
package cn.test.orm.mr;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.*;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.*;
import java.util.Date;

@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "t_menu_role")
@EntityListeners(AuditingEntityListener.class)
@SQLDelete(sql = "update t_menu_role set is_del = 1 where id = ?")
@Where(clause = "is_del = 0")
@DynamicUpdate
@DynamicInsert
@org.hibernate.annotations.Table(appliesTo = "t_menu_role",comment="菜单-角色-关系表")
public class MenuRole {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private Long mid;

    private Long rid;


    @Column(columnDefinition = "varchar(255) DEFAULT NULL COMMENT '备注'")
    private String remark;

    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
    @Column(name = "create_time",columnDefinition = "datetime DEFAULT NULL COMMENT '添加时间'")
    @CreatedDate
    private Date createTime;

    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
    @Column(name = "update_time",columnDefinition = "datetime DEFAULT NULL COMMENT '修改时间'")
    @LastModifiedDate
    private Date  updateTime;


    @Column(name = "is_del", columnDefinition = "int(1)  DEFAULT 0 COMMENT '逻辑删除标志'")
    private Integer isDel=0;


}

//
package cn.test.orm.role;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.*;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.*;
import java.util.Date;

@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "t_role")
@EntityListeners(AuditingEntityListener.class)
@SQLDelete(sql = "update t_role set is_del = 1 where id = ?")
@Where(clause = "is_del = 0")
@DynamicUpdate
@DynamicInsert
@org.hibernate.annotations.Table(appliesTo = "t_role",comment="角色表")
public class RoleDO {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(unique = true,columnDefinition = "varchar(255) DEFAULT NULL COMMENT '角色标志'")
    private String roleFlag;




    @Column(columnDefinition = "varchar(255) DEFAULT NULL COMMENT '备注'")
    private String remark;

    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
    @Column(name = "create_time",columnDefinition = "datetime DEFAULT NULL COMMENT '添加时间'")
    @CreatedDate
    private Date createTime;

    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
    @Column(name = "update_time",columnDefinition = "datetime DEFAULT NULL COMMENT '修改时间'")
    @LastModifiedDate
    private Date  updateTime;


    @Column(name = "is_del", columnDefinition = "int(1)  DEFAULT 0 COMMENT '逻辑删除标志'")
    private Integer isDel=0;
}



package cn.test.orm.ur;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.*;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.*;
import java.util.Date;

@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "t_user_role")
@EntityListeners(AuditingEntityListener.class)
@SQLDelete(sql = "update t_user_role set is_del = 1 where id = ?")
@Where(clause = "is_del = 0")
@DynamicUpdate
@DynamicInsert
@org.hibernate.annotations.Table(appliesTo = "t_user_role",comment="用户-角色-关系表")
public class UserRole {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private Long uid;

    private Long rid;

    @Column(columnDefinition = "varchar(255) DEFAULT NULL COMMENT '备注'")
    private String remark;

    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
    @Column(name = "create_time",columnDefinition = "datetime DEFAULT NULL COMMENT '添加时间'")
    @CreatedDate
    private Date createTime;

    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
    @Column(name = "update_time",columnDefinition = "datetime DEFAULT NULL COMMENT '修改时间'")
    @LastModifiedDate
    private Date  updateTime;

    @Column(name = "is_del", columnDefinition = "int(1)  DEFAULT 0 COMMENT '逻辑删除标志'")
    private Integer isDel=0;
}

//


package cn.test.orm.user;


import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.*;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.*;
import java.util.Date;



@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "t_user")
@EntityListeners(AuditingEntityListener.class)
@SQLDelete(sql = "update t_user set is_del = 1 where id = ?")
@Where(clause = "is_del = 0")
@DynamicUpdate
@DynamicInsert
@org.hibernate.annotations.Table(appliesTo = "t_user",comment="用户表")
public class UserDO {

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

    @Column(unique = true, columnDefinition = "varchar(255) DEFAULT NULL COMMENT '账号'")
    private String account;

    @Column(columnDefinition = "varchar(255) DEFAULT NULL COMMENT '密码'")
    private String pwd;


    @Column(columnDefinition = "varchar(255) DEFAULT NULL COMMENT '备注'")
    private String remark;

    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
    @Column(name = "create_time",columnDefinition = "datetime DEFAULT NULL COMMENT '添加时间'")
    @CreatedDate
    private Date  createTime;

    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
    @Column(name = "update_time",columnDefinition = "datetime DEFAULT NULL COMMENT '修改时间'")
    @LastModifiedDate
    private Date  updateTime;

    /**
     * 版本号,用于乐观锁
     */
    @Column
    @Version
    private Long version;


    @Column(name = "is_del", columnDefinition = "int(1)  DEFAULT 0 COMMENT '逻辑删除标志'")
    private Integer isDel=0;

}

repo操作接口类

package cn.test.orm.menu;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository;

@Repository
public interface MenuRepo extends JpaRepository<MenuDO, Long>, JpaSpecificationExecutor<MenuDO> {
}
//-------------------------------------------------------------
package cn.test.orm.mr;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface MenuRoleRepo extends JpaRepository<MenuRole, Long>, JpaSpecificationExecutor<MenuRole> {
    List<MenuRole> findAllByMid(Long mid);
}
//-----------------------------------------------------------------
package cn.test.orm.role;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository;

@Repository
public interface RoleRepo extends JpaRepository<RoleDO, Long>, JpaSpecificationExecutor<RoleDO> {
}
//-------------------------------------------------------------------
package cn.test.orm.ur;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface UserRoleRepo extends JpaRepository<UserRole, Long>, JpaSpecificationExecutor<UserRole> {
    List<UserRole> findAllByUid(Long uid);
}
//--------------------------------------------------------------------
package cn.test.orm.user;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepo extends JpaRepository<UserDO, Long>, CrudRepository<UserDO, Long>, JpaSpecificationExecutor<UserDO> {


    @Modifying
    @Query("update UserDO m set m.remark=?2 where m.id=?1")
    int updateRemark(Long uid, String desc);


    UserDO findByAccount(String account);

    @Modifying
    @Query("update UserDO m set " +
            "m.account= :#{#userDO.account} " + "," +
            "m.pwd=:#{#userDO.pwd} " +
            "where m.id=:#{#userDO.id}")
    void update(@Param("userDO") UserDO userDO);
}


service层

package cn.test.biz;
import cn.test.orm.user.UserDO;
import cn.test.orm.user.UserRepo;
import cn.test.sys.APIException;
import cn.test.sys.ResultCodeEnum;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class UserService {
    @Autowired
    private UserRepo userRepo;

    @Cacheable(cacheNames = "user", key = "#id",condition = "#id != null ")
    public UserDO getById(Long id) {
        UserDO userDO = userRepo.findById(id).orElse(null);
        return userDO;
    }

    @Transactional(rollbackFor = Exception.class)
    @CacheEvict(cacheNames = "user", key = "#id")
    public void delUser(Long id) {
        UserDO userDO = userRepo.findById(id).orElse(null);
        if (userDO != null) {
            userRepo.delete(userDO);
        }
    }


    @CachePut(cacheNames = "user",
            key = "#userInfo.id",
            condition = "#userInfo != null")
    public UserDO addUser(UserDO userInfo) {
        return userRepo.save(userInfo);
    }

 
    @CachePut(cacheNames = "user", key = "#userInfo.id")
    @Transactional(rollbackFor = Exception.class)
    public UserDO updateUserInfo(UserDO userInfo) {
        UserDO userDO = userRepo.findById(userInfo.getId()).orElse(null);
        if (userDO != null) {
            Long id = userDO.getId();
            BeanUtils.copyProperties(userInfo, userDO);
            userDO.setId(id);
            userRepo.save(userDO);
        }
        return userDO;
    }


    public Integer judgeMoreThan999(int a, int b) {
        int r = a + b;
        if (r < 0) {
            throw new APIException();
        }
        if (r < 999 && r > 0) {
            //适用于 有某业务异常,不往下执行后续业务,直接抛出
            throw new APIException(ResultCodeEnum.BIZ_ERROR);
        } else {
            return r;
        }
    }


    @Transactional(rollbackFor = Exception.class)
    public void test() {
        System.err.println(userRepo.updateRemark(1L, "wer3"));
    }


    @Transactional(rollbackFor = Exception.class)
    public void testError() {
        userRepo.updateRemark(1L, "wer3");
        int a = 3 / 0; //测试除0异常会不会引起事务 , 实测不管 本语句在 updateRemark之前或之后,均会引起事务回退
    }
}

springboot整合JPA操作pgsql(或类pg数据库)

xml依赖配置

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
<!--  本机没有pg数据库,这里使用翰高数据库代替,翰高数据库是类pg数据库-->
 <dependency>
            <groupId>com.highgo</groupId>
            <artifactId>HgdbJdbc</artifactId>
            <version>6.2.2</version>
        </dependency>
 

yml配置

spring:
  datasource:
   #配置pg数据库驱动或类pg数据库的驱动
    driver-class-name: com.highgo.jdbc.Driver 
    name: defaultDataSource
    url: jdbc:highgo://10.11.5.112:5866/QBXT2023?currentSchema=SYNDCOS
    username: QBXT
    password: kSh@88861158
    type: com.zaxxer.hikari.HikariDataSource
    hikari:
      maximum-pool-size: 20
      minimum-idle: 5
  jpa:
    database: postgresql
    database-platform: org.hibernate.dialect.PostgreSQLDialect
    show-sql: true
    hibernate:
#      ddl-auto: create-drop
      ddl-auto: update
    open-in-view: false

使用示例代码

实体类

package cn.test.orm.menu;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.*;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.*;
import java.util.Date;

@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "t_menu")
@EntityListeners(AuditingEntityListener.class)
@SQLDelete(sql = "update t_menu set is_del = 1 where id = ?")
@Where(clause = "is_del = 0")
@DynamicUpdate
@DynamicInsert
public class MenuDO {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String url;

    private String path;

    private String component;

    private String name;

    private String iconCls;

    private Boolean keepAlive;

    private Boolean requireAuth;

    private Integer parentId;

    private Boolean enabled;



    @Column(length = 255)
    private String remark;

    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
    @CreatedDate
    private Date createTime;

    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
    @LastModifiedDate
    private Date  updateTime;


    private Integer isDel=0;
}
//------------------------------------------------------
package cn.test.orm.mr;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.*;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.*;
import java.util.Date;

@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "t_menu_role")
@EntityListeners(AuditingEntityListener.class)
@SQLDelete(sql = "update t_menu_role set is_del = 1 where id = ?")
@Where(clause = "is_del = 0")
@DynamicUpdate
@DynamicInsert
public class MenuRole {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private Long mid;

    private Long rid;


    @Column(length = 255)
    private String remark;

    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")

    @CreatedDate
    private Date createTime;

    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")

    @LastModifiedDate
    private Date  updateTime;



    private Integer isDel=0;


}

//----------------------------------------------------------------
package cn.test.orm.role;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.*;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.*;
import java.util.Date;

@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "t_role")
@EntityListeners(AuditingEntityListener.class)
@SQLDelete(sql = "update t_role set is_del = 1 where id = ?")
@Where(clause = "is_del = 0")
@DynamicUpdate
@DynamicInsert
public class RoleDO {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;


    @Column(length = 255)
    private String roleFlag;


    @Column(length = 255)
    private String remark;

    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
    @CreatedDate
    private Date createTime;

    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
    @LastModifiedDate
    private Date  updateTime;



    private Integer isDel=0;
}
//-------------------------------------------------------------------------

package cn.test.orm.ur;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.*;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.*;
import java.util.Date;

@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "t_user_role")
@EntityListeners(AuditingEntityListener.class)
@SQLDelete(sql = "update t_user_role set is_del = 1 where id = ?")
@Where(clause = "is_del = 0")
@DynamicUpdate
@DynamicInsert
public class UserRole {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private Long uid;


    private Long rid;


    @Column(length = 255)
    private String remark;

    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
    @CreatedDate
    private Date createTime;

    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
    @LastModifiedDate
    private Date  updateTime;

    private Integer isDel=0;
}

//---------------------------------------------------------------------

package cn.test.orm.user;


import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.*;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.*;
import java.util.Date;




@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "t_user")
@EntityListeners(AuditingEntityListener.class)
@SQLDelete(sql = "update t_user set is_del = 1 where id = ?")
@Where(clause = "is_del = 0")
@DynamicUpdate
@DynamicInsert
public class UserDO {

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


    @Column(length = 255)
    private String account;


    @Column(length = 255)
    private String pwd;



    @Column(length = 255)
    private String remark;

    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
    @CreatedDate
    private Date  createTime;

    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
    @LastModifiedDate
    private Date  updateTime;

    /**
     * 版本号,用于乐观锁
     */
    @Column
    @Version
    private Long version; //版本号从0开始,每次update时会version+1


    private Integer isDel=0;


}

repo操作接口类

repo操作接口类与上节相同,这里不再展示

service层

service层与上节相同,这里不再展示

springboot整合JPA操作SQLite

什么是SQLite

SQLite是领先的文件型数据库,类似的文件数据库还有Microsoft Access;
SQLite无序数据库服务器,只需要一个xxx.db文件,即可实现存取数据;
这里推荐一个SQLite客户端管理工具---DB Browser for SQLite;

请添加图片描述

xml依赖配置

<!-- sqlite驱动包-->
<dependency>
            <groupId>org.xerial</groupId>
            <artifactId>sqlite-jdbc</artifactId>
            <version>3.28.0</version>
        </dependency>
<!-- 这里引入一个开源的SQLite方言包-->
        <dependency>
            <groupId>com.github.gwenn</groupId>
            <artifactId>sqlite-dialect</artifactId>
            <version>0.1.0</version>
        </dependency>
 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

yml配置

spring:
  datasource:
  # 配置驱动名
    driver-class-name: org.sqlite.JDBC
    name: defaultDataSource
    #配置jdbc-url地址,直接指向xxx.db数据库文件
    url: jdbc:sqlite:C://Users/Administrator/Desktop/302/test.db
    username: QBXT
    password: Sh@88861158
    type: com.zaxxer.hikari.HikariDataSource
    hikari:
      maximum-pool-size: 20
      minimum-idle: 5
  jpa:
    #指定数据库方言
    database-platform: org.hibernate.dialect.SQLiteDialect
    show-sql: true
    hibernate:
#      ddl-auto: create-drop
      ddl-auto: update
    open-in-view: false
    generate-ddl: true
    properties:
      hibernate:
        format_sql: true  #格式化打印sql日志

以上配置完成后,即可开始使用SpringDataJPA

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/835658.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

牵手科瑞物业,合合信息智能文字识别技术助力企业沉淀数据资产

名片是商务场景中信息传递的重要载体。比起传统的纸质名片&#xff0c;可动态化呈现个人及企业信息&#xff0c;洞察访客偏好的数字名片已成为企业对外展示、拓展客户的重要工具。近期&#xff0c;合合信息旗下名片全能王与科瑞物业达成合作。通过推动企业数字名片在科瑞物业各…

【若依管理系统】开发功能流程总结

1.在菜单管理中&#xff0c;新增需要创建的菜单&#xff0c;如图 并添加查询、新增、修改、删除等按钮和对应的权限和路径 例如如果没有添加查询按钮&#xff0c;那么在修改的时候&#xff0c;会存在报错&#xff1a;没有权限。上图对应后台代码 2.domain中创建设计的表结构及操…

优化全域广告投放效果的方法与技巧

好久不见&#xff01;不少读者催更的《企业广告投放逻辑精讲》系列继续更新啦&#xff01;感谢各位忠实读者的支持&#xff01; 经过前两章的学习&#xff0c;想必你已经了解了广告投放的正确方式&#xff0c;但事实上&#xff0c;掌握方法只是基础&#xff0c;相当于你要学习…

【计算机视觉】干货分享:Segmentation model PyTorch(快速搭建图像分割网络)

一、前言 如何快速搭建图像分割网络&#xff1f; 要手写把backbone &#xff0c;手写decoder 吗&#xff1f; 介绍一个分割神器&#xff0c;分分钟搭建一个分割网络。 仓库的地址&#xff1a; https://github.com/qubvel/segmentation_models.pytorch该库的主要特点是&#…

Python web实战之Django用户认证详解

关键词&#xff1a; Python Web 开发、Django、用户认证、实战案例 概要 今天来探讨一下 Django 的用户认证吧&#xff01;在这篇文章中&#xff0c;我将为大家带来一些有关 Django 用户认证的最佳实践。 1. Django 用户认证 在开发 Web 应用程序时&#xff0c;用户认证是一个…

Android系统APP之SettingsProvider

前言 SettingsProvider顾名思义是一个提供设置数据共享的Provider&#xff0c;SettingsProvider和Android系统其它Provider有很多不一样的地方&#xff0c;如&#xff1a; SettingsProvider只接受int、float、string等基本类型的数据&#xff1b;SettingsProvider由Android系…

喜讯!箱讯AnyCase荣获“2023年度苏州市服务型制造示范平台”

近日&#xff0c;苏州市工业和信息化局公示了“2023年度苏州市服务型制造示范企业&#xff08;平台&#xff09;”名单。箱讯科技&#xff08;上海&#xff09;有限公司子公司苏州箱讯供应链管理有限公司荣耀上榜。 ​ 添加图片注释&#xff0c;不超过 140 字&#xff08;可选…

IFC纹理及着色器研究

最近&#xff0c;yorgunkirmizi 讨论了纹理、着色器、纹理坐标以及所有此类内容在 IFC 中的工作原理。 我们在破译什么是可能的、什么是不可能的方面已经取得了一些重大进展&#xff0c;所以我想我应该打开这个线程&#xff0c;以便其他人也可以参与其中&#xff0c;或者至少密…

恒运资本:货币调控精准有力 8月流动性合理充裕

8月3日&#xff0c;中国人民银行以利率投标方式展开30亿元逆回购操作&#xff0c;由于当日有1140亿元逆回购到期&#xff0c;公开商场完成净回笼1110亿元。 专家表示&#xff0c;为坚持流动性合理富余&#xff0c;估计央即将根据流动性供求和商场利率改变&#xff0c;灵敏运用多…

【雕爷学编程】MicroPython动手做(39)——机器视觉之图像基础

MixPY——让爱(AI)触手可及 MixPY布局 主控芯片&#xff1a;K210&#xff08;64位双核带硬件FPU和卷积加速器的 RISC-V CPU&#xff09; 显示屏&#xff1a;LCD_2.8寸 320*240分辨率&#xff0c;支持电阻触摸 摄像头&#xff1a;OV2640&#xff0c;200W像素 扬声器&#…

阿里云平台WoSignSSL证书应用案例

沃通CA与阿里云达成合作并在阿里云平台上线WoSign品牌SSL证书。自上线以来&#xff0c;WoSignSSL证书成为阿里云“数字证书管理服务”热销证书产品&#xff0c;获得阿里云平台客户认可&#xff0c;助力阿里云平台政府、金融、教育、供应链、游戏等各类行业客户实现网站系统数据…

美团前端研发框架Rome实践和演进趋势

本文整理自美团技术沙龙第76期《大前端研发协同效能提升与实践》&#xff0c;为大家介绍了美团到店前端研发框架Rome实践和演进趋势。 具体来讲&#xff0c;本文首先介绍了Rome整体的工程生态、演变路径、规模化升级以及工程框架外的开发辅助工具&#xff1b;第二部分&#xff…

主流CRM有哪些特点和优势?

现如今&#xff0c;CRM系统是企业实现数字化转型&#xff0c;提高销售收入的首选工具。但市场上有众多CRM品牌&#xff0c;每家都有自己的特点和优势&#xff0c;企业该如何进行选择&#xff1f;下面我们就来进行主流CRM系统比较&#xff0c;并说说什么CRM产品比较好? 主流CR…

控制器(IP盒子类似网关)收不到工位板的状态数据包的问题排查解决

控制器(IP盒子类似网关)收不到工位板的状态数据包 问题描述 如下图通信框图所示&#xff0c;控制器工位板程序通过RS422和控制器(类似网关)通信&#xff0c;控制器在将数据转发给Linux应用程序。 一开始设备装好&#xff0c;整个通信是没有任何问题的。 然后在很久之后&…

【C#学习笔记】装箱和拆箱

文章目录 装箱和拆箱性能消耗装箱拆箱 比较var&#xff0c;object&#xff0c;dynamic&#xff0c;\<T\>varobject\<T\> 泛型dynamic 装箱和拆箱 在讲引用类型object的时候&#xff0c;我们说它是万能的&#xff0c;却没说它万能在哪里。 除了object为每一种变量…

收集 301 医院 451 名老年冠心病患者数据,湖北麻城人民医院推出机器学习模型,准确预测患者一年内死亡率

内容一览&#xff1a;据国际糖尿病联盟 (IDF) 统计&#xff0c;2021 年中国糖尿病患者数量占全球 26%。而糖尿病患者血糖长期失控&#xff0c;有极高风险引起冠心病等并发症。近期&#xff0c;湖北省麻城市人民医院研究人员分析比较了多种模型&#xff0c;并用其中表现最优的机…

Scratch 之 两点之间距离的测算

1.前言 在Scratch中&#xff0c;对于坐标系上的两点&#xff0c;我们可以确定通过x坐标或y坐标之差确定两点横坐标或是纵坐标上的距离&#xff0c;那么如何知道两点之间的直线距离呢&#xff1f; 2.勾股定理 对于一个直角三角形&#xff0c;两条直角边的平方和等于斜边的平方&a…

电动自行车上架eBay的UL2849、16CFR1512测试标准

在奥运经济的带动下&#xff0c;今年以来运动自行车消费有较大幅度增长&#xff0c;其中高端消费者对进口自行车需求扩张&#xff0c;上半年竞赛型自行车进口量同比增长49.5%。另外&#xff0c;电助力自行车在国际市场也倍受追捧&#xff0c;国际自行车贸易总额的60%来自中国&a…

记一次ubuntu16误删libc.so.6操作的恢复过程

背景 操作系统&#xff1a;ubuntu16 glibc版本&#xff1a;2.23 修改原因&#xff1a; 经过一系列报错和手工构建之后&#xff0c;vulkansdk成功安装&#xff08;起码运行./vulkansdu成功&#xff09;&#xff0c;在进行./vulkaninfo进行验证时&#xff0c;报错&#xff1a…

SpringCloud-Hystrix服务熔断与降级工作原理源码 | 京东物流技术团队

先附上Hystrix源码图 在微服务架构中&#xff0c;根据业务来拆分成一个个的服务&#xff0c;服务与服务之间可以相互调用&#xff08;RPC&#xff09;&#xff0c;在Spring Cloud可以用RestTemplateRibbon和Feign来调用。为了保证其高可用&#xff0c;单个服务通常会集群部署。…