(二)springBoot之springBoot JPA的简介及使用

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

runtime这行是编译时不会用到该jar包,但是运行时需要用到。

接下来配置数据库连接,在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的简单使用就到此结束了,欢迎大家交流!

你可能感兴趣的:(springBoot,springBoot,JPA,JPA)