前言
JPA(Java Persistence API)是 Java 标准中的一套ORM规范,是Springboot一个持久化框架,可以通过注解或者XML描述【对象-关系表】之间的映射关系,并将实体对象持久化到数据库中,而且可以很好的切换数据库
jpa官网
可以从以下网址了解jpa
https://docs.spring.io/spring-data/jpa/reference/?spm=a2c6h.12873639.article-detail.7.79103500RuSHYY#preface
jpa注解说明
jpa提供了一些注解,例如
@Entity: 用于标注实体类,指出该 Java 类为实体类,将映射到指定的关系数据库表,一般是必须的
@Table: 标注在实体类,一般用于数据库表名
- schema属性:指定数据库名
- name属性:指定表名
@Id: 用于指定数据库表主键
@GeneratedValue: 用于标记主键的生成方式,通过 strategy 属性指定
- AUTO: JPA自动选择合适的策略,是默认选项
- IDENTITY:采用数据库 ID自增长的方式来自增主键字段,Oracle 不支持这种方式
- TABLE:通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植。
- SEQUENCE:通过序列产生主键,通过 @SequenceGenerator 注解指定序列名
@Column: 用于指定列名,也可以用于生成数据库表字段
@Transient: 用于标记不将实体类某字段生成数据库表名
等等
引入jpa依赖
jpa依赖为
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
然后加入数据库驱动
mysql
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
postgressql驱动
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
jpa操作
数据库配置
(1)application.properties配置为
server.port=9051
spring.application.name=demo-jpa
# MySQL
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# JPA
spring.jpa.database=MySQL
spring.jpa.show-sql=true
#spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.hibernate.ddl-auto=update
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
说明:
spring.jpa.hibernate.ddl-auto=update: 用于数据库表自动生成,有几种生成策略
ddl-auto:create ----每次运行该程序,没有表格会新建表格,表内有数据会清空;
ddl-auto:create-drop ----每次程序结束的时候会清空表
ddl-auto:update ---- 每次运行程序,没有表格会新建表格,表内有数据不会清空,只会更新
ddl-auto: validate ---- 运行程序会校验数据与数据库的字段类型是否相同,不同会报错。
spring.jpa.show-sql=true: 用于数据库语句打印
spring.jpa.database=MySQL: 用于指定使用数据库
Hibernate5之后
采用implicit-strategy和physical-strategy两个配置项分别控制命名策略
spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
1、implicit-strategy和physical-strategy的区别
(1)、implicit-strategy负责模型对象层次的处理,将对象模型处理为逻辑名称。physical-strategy负责映射成真实的数据名称的处理,将上述的逻辑名称处理为物理名称。
(2)、当没有使用@Table和@Column注解时,implicit-strategy配置项才会被使用,当对象模型中已经指定时,implicit-strategy并不会起作用。physical-strategy一定会被应用,与对象模型中是否显式地指定列名或者已经被隐式决定无关。
jpa编程
实体类定义
@Data
@Entity
@Table(name = "user")
@JsonIgnoreProperties(ignoreUnknown = true)
@EntityListeners(AuditingEntityListener.class)
public class User implements Serializable {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name = "userName")
private String userName;
@Column(name = "mobile")
private String mobile;
}
dao层定义
@Repository
public interface UserRepository extends JpaRepository<User, Long>,
JpaSpecificationExecutor<User> {
}
数据库操作
@RestController
public class UserController {
@Autowired
private UserRepository userRepository;
@GetMapping("/save")
public void save() {
User user = new User();
user.setId(1L);
user.setMobile("aaa");
userRepository.save(user);
}
@PostMapping("/update")
public void update(@RequestBody User user) {
userRepository.save(user);
}
@GetMapping("/findById")
public User findById(@RequestParam("id") Long id) {
return userRepository.findById(id).orElse(null);
}
@GetMapping("/deleteById")
public void deleteById(@RequestParam("id") Long id) {
userRepository.deleteById(id);
}
}
备注:程序启动之后,会生成数据库表
总结
jpa可以是操作数据库更加方便,并且方便切换数据库,但是在开发中,根据自己使用习惯选型