SpringBoot-集成JPA

JPA、Hibernate和SpringDataJPA之间的关系

JPA(Java Persistence API) 最早是Sun官方提出的Java持久化规范,JPA的出现有两个原因:

  1. 简化现有Java EE和Java SE应用的对象持久化的开发工作。
  2. Sun希望整合对ORM技术,实现持久化领域的统一。

JPA仅仅是一种规范,也就是说JPA仅仅定义了一些接口,而接口是需要实现才能工作的。所以底层需要某种实现,而Hibernate就是实现了JPA接口的ORM框架,是一套成熟的产品。
SpringBoot-集成JPA_第1张图片
Spring提供了一套极简化的JPA开发框架:SpringDataJPA,我们只需要按照约定好的【方法命名规则】编写Dao层,就可以在不实现接口的情况下,实现对数据库的访问操作,SpringDataJPA内置了除了CRUD外其他一些其它功能,如分页、排序复杂查询等。
SpringBoot-集成JPA_第2张图片

使用SpringDataJPA实现数据的CRUD操作

快速构建一个SpringBoot项目,并添加如下依赖:

>
	>org.springframework.boot>
    >spring-boot-starter-data-jpa>
>
>
	>mysql>
    >mysql-connector-java>
    >runtime>
>

在application.yml文件中配置如下信息:

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://192.168.145.165:3306/chapter04?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
    username: root
    password: 123456

  jpa:
    properties:
      hibernate:
        hbm2ddl:
          auto: create
        dialect: org.hibernate.dialect.MySQL5InnoDBDialect
    show-sql: true

配置信息主要分为两部分,spring.datasource部分用于配置数据库连接信息,spring.jpa部分用于配置表创建策略以及是否显示sql等。
auto属性取值说明:
create:程序每次启动,都会先删除表,然后再创建。(不保留数据)
update:程序每次启动,没有表会新建表,实体中新增属性,表中会增加字段。(保留数据)

创建项目包结构如下:
SpringBoot-集成JPA_第3张图片
从下往上结构依次为:entity----repository(dao)—-controller----dto

编写User实体类,完成实体到数据表的映射:

@Data
@Entity
@Table(name = "tb_user")
@GenericGenerator(name = "jpa-uuid", strategy = "uuid")
public class User {
    @Id
    @GeneratedValue(generator = "jpa-uuid")
    public String id;

    @Column(nullable = false,unique = true,length = 50)
    private String userName;

    @Column(nullable = false,length = 100)
    private String passWord;

    @Column(nullable = false,length = 200)
    private String address;

    @Column(length = 50)
    private String email;

    @Column(nullable = false,length = 10)
    private Integer level;
}

@Data:lombok注解,简化实体,无需手动写getter和setter。
@Entity:定义此类为一个可持久化类,与数据库中的表建立关系。
@Table:指定name属性,设置生成表的名称。
@GenericGenerator:自定义主键生成策略,这里我们使用uuid。
@Id:定义表中的主键
@GeneratedValue:指定主键的生成策略为我们自定义的策略名称
@Column:表中字段属性定义,是否允许为空、字段长度和唯一约束等。

编写完实体与表的映射后,我们在repository包下创建UserRepository接口,继承JpaRepository,指定实体类和主键类型。

public interface UserRepository extends JpaRepository<User,String> {
}

至此,我们已经完成了SpringDataJPA的集成,项目已经具备了与数据库建立连接和操作数据库表的能力。
我们不需要编写任何sql语句或者xml配置文件,接着在controller包下创建一个UserController,将UserRepository注入进去,写几个restful api 来测试SpringDataJPA内置的一些常用操作。

@RestController
@RequestMapping("user")
public class UserController {
    @Autowired
    UserRepository userRepository;
}

保存用户信息:

@PostMapping("saveUser")
public User saveUser(@RequestBody User user){
    userRepository.save(user);
    return user;
}

userRepository.save()是内置方法,直接可以调用。

按照ID删除用户信息:
在UserRepository中自定义如下方法:

@Transactional
String deleteUserById(String id);

方法上必须使用 @Transactional开启事物支持,否则执行会报错,SpringDataJPA框架会自动按照方法名称生成可执行的SQL语句。

UserController中增加如下接口:

@PostMapping("deleteUserById")
public String deleteUserById(@RequestBody User user){
    return userRepository.deleteUserById(user.getId());
}

按照ID查询用户信息:

User findUserById(String id);
@PostMapping("findUserById")
public User findUserById(@RequestBody User user){
     return userRepository.findUserById(user.getId());
 }

按照用户名或者地址查询用户信息:

User findByUserNameOrAddress(String userName,String addredd);
@PostMapping("findByUserNameOrAddress")
public User findByUserNameOrAddress(@RequestBody User user){
    return userRepository.findByUserNameOrAddress(user.getUserName(),user.getAddress());
}

查询区间等级中的用户信息:

List<User> findByLevelBetween(int start,int end);
@PostMapping("findByLevelBetween")
public List<User> findByPassWordBetween(@RequestBody CommonDTO commonDTO){
    return userRepository.findByLevelBetween(commonDTO.getStart(),commonDTO.getEnd());
}

自定义查询方法生成SQL对照表:
SpringBoot-集成JPA_第4张图片
点击这里获取示例源码

你可能感兴趣的:(Spring,Boot学习记录)