whbing 2020-02-21
Jpa (Java Persistence API) 是 Sun 官方提出的 Java 持久化规范。它为 Java 开发人员提供了一种对象/关联映射工具来管理 Java 应用中的关系数据。它的出现主要是为了简化现有的持久化开发工作和整合 ORM 技术,结束现在 Hibernate,TopLink,JDO 等 ORM 框架各自为营的局面。
值得注意的是,Jpa是在充分吸收了现有 Hibernate,TopLink,JDO 等 ORM 框架的基础上发展而来的,具有易于使用,伸缩性强等优点。从目前的开发社区的反应上看,Jpa 受到了极大的支持和赞扬,其中就包括了 Spring 与 EJB3. 0的开发团队。
注意:Jpa 是一套规范,不是一套产品,那么像 Hibernate,TopLink,JDO 他们是一套产品,如果说这些产品实现了这个 Jpa 规范,那么我们就可以叫他们为 Jpa 的实现产品。
Spring Boot Jpa 是 Spring 基于 ORM 框架、Jpa 规范的基础上封装的一套 Jpa 应用框架,可使开发者用极简的代码即可实现对数据的访问和操作。它提供了包括增删改查等在内的常用功能,且易于扩展!学习并使用 Spring Data Jpa 可以极大提高开发效率!
Spring Boot Jpa 让我们解脱了 DAO 层的操作,基本上所有 CRUD 都可以依赖于它来实现
在Spring Data中,只要按照既定的规范命名方法,Spring Data Jpa就知道你想干嘛,这样就不用写SQL了,那么规范是什么呢?


当然,这种方法命名主要是针对查询,但是一些特殊需求,可能并不能通过这种方式解决,例如想要查询id最大的用户,这时就需要开发者自定义查询SQL了,如上代码所示,自定义查询SQL,使用@Query注解,在注解中写自己的SQL,默认使用的查询语言不是SQL,而是JPQL,这是一种数据库平台无关的面向对象的查询语言,有点定位类似于Hibernate中的HQL,在@Query注解中设置nativeQuery属性为true则表示使用原生查询,即大伙所熟悉的SQL。
1. 添加pom依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--测试-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
<version>2.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
</dependencies>2. 配置文件application.yml
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: 123456
jpa:
properties:
hibernate:
hbm2ddl:
auto: update
dialect: org.hibernate.dialect.MySQL5InnoDBDialect
show-sql: true3. 实体类
package com.demo.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class User {
@Id
@GeneratedValue
private Long id;
@Column(nullable = false, unique = true)
private String username;
@Column(nullable = false, unique = true)
private String address;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username=‘" + username + ‘\‘‘ +
", address=‘" + address + ‘\‘‘ +
‘}‘;
}
}4. UserRepository和UserService
//要继承JpaResponsitorypublic interface UserRepository extends JpaRepository<User, Long> {
@Query(value = "select id,username,address from user where username like %?1%", nativeQuery = true)
List<User> findAllByUsernameLike(String username);
}
// UserService
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public User addUser(User user){
return userRepository.save(user);
}
public void delUserById(Long id){
userRepository.deleteById(id);
}
@Transactional(timeout = 10)
public void updateUser(User user){
User resultUser = userRepository.getOne(user.getId());
resultUser.setUsername(user.getUsername());
resultUser.setAddress(user.getAddress());
userRepository.flush();
}
@Transactional(timeout = 10)
public Optional<User> getUserById(Long id){
return userRepository.findById(id);
}
public List<User> getAll(){
return userRepository.findAll();
}
public List<User> getAllByUsernameLike(String name){
return userRepository.findAllByUsernameLike(name);
}
}测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class JpaTest {
@Autowired
private UserService userService;
@Test
public void add(){
User user = new User();
user.setUsername("八戒");
user.setAddress("众界");
User result = userService.addUser(user);
System.out.println(result.toString());
}
@Test
public void del(){
userService.delUserById(7L);
}
@Test
public void update(){
User user = new User();
user.setId(3L);
user.setUsername("齐天大圣");
user.setAddress("众界");
userService.updateUser(user);
}
@Test
public void select(){
List<User> userList1 = userService.getAll();
for (User user : userList1){
System.out.println(user.toString());
}
List<User> userList2 = userService.getAllByUsernameLike("霞");
for (User user : userList2){
System.out.println(user.toString());
}
}
@Test
public void selectOne(){
User user = userService.getUserById(5L).get();
System.out.println(user.toString());
}
}都测试通过即可,自行深入研究
是一个替代hibernate的一个作用于数据库的框架。 这里整合后不需要写一些简单的sql语句。 2、在resources下创建templates文件夹,在其下就可以书写页面了,和HTML的风格相似。