前言
Java Persistence API ,连接数据库的多种方法中:
最基本、最繁琐的JDBC
简化了持久层代码的JPA
框架级别的 Hibernate 、Mybatis 、 Mybatis
一、使用JPA (SpringBoot项目)
- 导入jar包
spring-boot-starter-data-jpa - 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
- 配置实体类
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;
}
!!! 属性类型别用基本类型,用封装类型
- 编写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;
}
}
}