Java——持久层之JPA详解

前言

Java Persistence API ,连接数据库的多种方法中: 最基本、最繁琐的JDBC 简化了持久层代码的JPA 框架级别的 Hibernate 、Mybatis 、 Mybatis

一、使用JPA (SpringBoot项目)

  1. 导入jar包 spring-boot-starter-data-jpa
  2. JPA配置
# 数据库的基础配置
spring.datasource.url = 
spring.datasource.deiverClassName = 
spring.datasource.username = 
spring.datasource.password = 

# 帮助开发的配置
spring.jpa.properties.hibernate.hbm2ddl.auto=update
spring.jpa.show-sql = true
  1. 配置实体类
import javax.persistence.*;

@Entity                 // 表明是个对应数据库的实体类
@Table(name="t_users")         //对应表名
@Data                  // 用到了lombok插件,自动生成getter、setter
public class Users {
          
   

	@Id	  //表明该属性为主键
	@GeneratedValue(strategy=GenerationType.IDENTITY)//主键生成策略
	@Column(name="id")  //对应表中的字段名
	private Integer id;
	
	@Column(name="name")
	private String name;
	
	@Column(name="age")
	private Integer age;
	
	@Column(name="address")
	private String address;

	@ManyToOne(cascade = CascadeType.PERSIST)	//表示多方
	@JoinColumn(name ="role_id")	//维护一个外键,外键在Users一侧
	private Roles roles;
}

!!! 属性类型别用基本类型,用封装类型

  1. 编写DAO Spring Boot提供了许多接口,我们这里用第4个  1、Repository接口  2、CrudRepository接口  3、PagingAndSortingRepository接口  4、JpaRepository接口  5、JPASpecificationExecutor接口
/**
 * 参数一 T :当前需要映射的实体
 * 参数二 ID :当前映射的实体中的主键的类型
 *
 */
@Repository
public interface UserRepository extends JpaRepository<User, Integer> {
          
   

    //手写sql
    @Query(value = "update user set name=?1 where id=?4",nativeQuery = true)   //占位符传值形式
    @Modifying                     
    int updateById(String name,int id);

    @Query("from User u where u.username=:username")   //SPEL表达式
    User findUser(@Param("username") String username);// 参数username 映射到数据库字段username
}

@Query用来执行自定义sql的方法,nativeQuery=true标识使用原生SQL @Modifying则标识该方法支持insert

二、常用注解

1.修饰实体类

    @Entity   表明这是个实体类 @Table   表明对应的表 @DynamicInsert   insetr时,生成动态SQL(有几个参数,sql语句就加几个字段) @DynamicUpdate   update时,生成动态SQL(有几个参数,sql语句就加几个字段)

2.修饰成员变量

    @Id   表明该属性为主键 @Column   表明该属性对应了表中的字段 @CreatedDate、@CreatedBy、@LastModifiedBy、@LastModifiedDate   需要在类上加上注解@EntityListeners(AuditingEntityListener.class),其次在application启动类中加上注解EnableJpaAuditing,   这个时候,在save方法被调用的时候,时间字段会自动设置并插入数据库,但是CreatedBy和LastModifiedBy并没有赋值,因为需要实现AuditorAware接口来返回你需要插入的值。
@Configuration
public class UserIDAuditorBean implements AuditorAware<Long> {
          
   
    @Override
    public Long getCurrentAuditor() {
          
   
        SecurityContext ctx = SecurityContextHolder.getContext();
        if (ctx == null) {
          
   
            return null;
        }
        if (ctx.getAuthentication() == null) {
          
   
            return null;
        }
        if (ctx.getAuthentication().getPrincipal() == null) {
          
   
            return null;
        }
        Object principal = ctx.getAuthentication().getPrincipal();
        if (principal.getClass().isAssignableFrom(Long.class)) {
          
   
            return (Long) principal;
        } else {
          
   
            return null;
        }
    }
}
经验分享 程序员 微信小程序 职场和发展