JPA(Java Persistence API) 最早是Sun官方提出的Java持久化规范,JPA的出现有两个原因:
JPA仅仅是一种规范,也就是说JPA仅仅定义了一些接口,而接口是需要实现才能工作的。所以底层需要某种实现,而Hibernate就是实现了JPA接口的ORM框架,是一套成熟的产品。
Spring提供了一套极简化的JPA开发框架:SpringDataJPA,我们只需要按照约定好的【方法命名规则】编写Dao层,就可以在不实现接口的情况下,实现对数据库的访问操作,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:程序每次启动,没有表会新建表,实体中新增属性,表中会增加字段。(保留数据)
创建项目包结构如下:
从下往上结构依次为: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());
}