1:什么是JPA?
维基百科:Java 持久化 API (JPA)是一个 Java 应用程序接口 规范,描述了使用 Java标准版平台(Java SE) 和 Java企业版平台(Java EE)的应用中的 关系数据 的管理。
百度百科:JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
简而言之,JPA就是持久化关系型数据到数据库的API。
2:数据持久化框架
当前java开发种,常用的数据持久化框架基本有俩大类。
其中之一是mybatis,数据库sql编写灵活,mybatis将java方法和sql关联,允许用户充分的使用数据的各种功能,例如存储过程,视图,各种复杂的查询等。而且可以完全的控制sql;
另外一种是hibernate为代表的对象关系映射框架,此类框架完成java实体类到数据库表的映射,类型到数据库类型的映射。基本不需要开发人员编写sql,可以使开发人员从复杂的手动持久化数据中解放出来。
springBoot JPA就是类似hibernate框架的一种数据持久化的规范。
3:springBoot中JPA的使用
首先引入maven依赖
org.springframework.boot
spring-boot-starter-data-jpa
笔者这里使用的数据库是mysql,所以这里引入mysql的maven依赖
mysql
mysql-connector-java
runtime
接下来配置数据库连接,在application.properties中配置数据库连接,
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/
spring.datasource.username= root
spring.datasource.password= 123
spring.jpa.database=mysql
# 显示后台处理的SQL语句
spring.jpa.show-sql=true
# 自动检查实体和数据库表是否一致,如果不一致则会进行更新数据库表
spring.jpa.hibernate.ddl-auto=update
笔者使用的springBoot的版本是2.0.6.RELEASE,有些版本的配置和该配置可能有所不同。
entity编写
@Entity
@Table(name="user")
public class UserEntity {
private Long id;
private String userName;
private String passWord;
private String email;
private String phone;
private Date createDate;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Column(name="user_name")
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
@Column(name="password")
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
@Column(name="email")
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Column(name="phone")
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
@Column(name="create_date")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
}
@Entity表示该类是一个实体类
@Table表示该类映射到数据库表user
@Id表示该字段是主键
@Column表示该类的属性映射到数据的哪一列和该列的数据结构信息;unique是否唯一,nullable是否允许为空。
@JsonFormat格式化属性
@GeneratedValue提供了主键生成策略;GenrationType提供了四种生成主键的策略,
TABLE:使用一个特定的数据库表格来保存主键。
SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。(orcale)
IDENTITY:主键由数据库自动生成(主要是自动增长型) (Mysql)
AUTO:主键由程序控制。
接下来编写DAO
public interface UserDao extends JpaRepository {
}
springBoot的dao需要继承JpaRepository接口,这个接口包含了基本的CURD方法
service接口编写
@Service
public class UserService {
@Autowired
private UserDao userDao;
public void insert(UserEntity user){
userDao.save(user);
}
public void delete(Long id){
userDao.deleteById(id);
}
public List findAll(){
return userDao.findAll();
}
public UserEntity findUser(Long id){
return userDao.findById(id).get();
}
}
controller接口的使用
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping(value = "/insert",method = RequestMethod.POST)
public void insert(@RequestBody UserEntity user){
user.setCreateDate(new Date());
userService.insert(user);
}
@RequestMapping("/findAll")
public List findAllUsers(){
return userService.findAll();
}
@RequestMapping("/{id}")
public UserEntity findUser(@PathVariable Long id){
return userService.findUser(id);
}
}
简单的springBootJPA使用完成了。
4:springBootJPA使用续
①:当接口所提供的的方法不能满足我们项目中的实际情况时,可以自定义方法。
用数据库某一列查询所有数据的方法
public interface UserDao extends JpaRepository {
UserEntity findAllByUserName(String userName);
}
然后正常调用该查询方法即可。
②:当自定义方法不能满足我们的项目使用需求时,可以手动编写sql,以满足实际项目
@Modifying
@Query("UPDATE UserEntity SET passWord=?2 where userName=?1")
UserEntity updateUserByUserName(String userName,String passWord);
@Query主键用于所有无法通过关键字查询获取结果的查询,该查询不受关键字查询的约束,通过sql得到结果。
@Modifying该注解的作用是告诉SpringBoot该方法是一个DELETE或者UPDATE方法,java中这两个方法需要添加事物,可以在service中添加,也可以添加到该sql的头部。JPQL不支持INSERT操作。
?*是索引,从1开始。
③:JPA的分页使用
service中代码
public Page findAll(Pageable pageable){
return userDao.findAll(pageable);
}
controller
@RequestMapping(value = "/findAll",method = RequestMethod.POST)
public Page findAll(int page, int size){
Sort sort = new Sort(Sort.Direction.DESC, "id");
Pageable pageable = PageRequest.of(page,size,sort);
return userService.findAll(pageable);
}
详细的分页使用后续再做扩展。
项目git地址:完整代码地址
springBoot JPA的简单使用就到此结束了,欢迎大家交流!