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: true
3. 实体类
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的风格相似。