1,JPA 介绍
JPA(Java Persistence API) 是 Sun 官方提出的 Java 持久化规范. 它为 Java 开发人员提供了一种对象 / 关联映射工具来管理 Java 应用中的关系数据. 它的出现主要是为了简化现有的持久化开发工作和整合 ORM 技术
Spring data jpa 是在 JPA 规范下提供了 Repository 层的实现. 虽然 ORM 框架都实现了 JPA 规范, 但是在不同的 ORM 框架之间切换仍然需要编写不同的代码, 而通过使用 Spring data jpa 能够方便大家在不同的 ORM 框架之间进行切换而不要更改代码, 使代码看上去更加优雅, 并且 spring data jpa 对 Repository 层封装的很好, 也省去了不少的麻烦.
2,springboot 集成
pom 依赖:
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-data-jpa</artifactId>
- </dependency>
配置文件添加:
- #jpa 配置
- jpa:
- database: MySQL
- show-sql: true
- hibernate:
- ddl-auto: update
- properties:
- hibernate.format_sql: true
- hibernate.naming.physical-strategy: org.hibernate.config.model.naming.PhysicalNamingStrategyStandardImpl
- hibernate.cache.use_second_level_cache: false
- hibernate.search.default.directory_provider: filesystem
- hibernate.search.default.indexBase: ${user.dir}/indexes
部分说明:
hibernate.hbm2ddl.auto 参数的作用主要用于: 自动创建 | 更新 | 验证数据库表结构.
create: 每次加载 hibernate 时都会删除上一次的生成的表, 然后根据你的 model 类再重新来生成新表, 哪怕两次没有任何改变也要这样执行, 这就是导致数据库表数据丢失的一个重要原因.
create-drop : 每次加载 hibernate 时根据 model 类生成表, 但是 sessionFactory 一关闭, 表就自动删除.
update: 最常用的属性, 第一次加载 hibernate 时根据 model 类会自动建立起表的结构 (前提是先建立好数据库), 以后加载 hibernate 时根据 model 类自动更新表结构, 即使表结构改变了但表中的行仍然存在不会删除以前的行. 要注意的是当部署到服务器后, 表结构是不会被马上建立起来的, 是要等 应用第一次运行起来后才会.
validate : 每次加载 hibernate 时, 验证创建数据库表结构, 只会和数据库中的表进行比较, 不会创建新表, 但是会插入新值.
关键代码
- package com.example.springbootjpa.repository;
- import com.example.springbootjpa.domain.User;
- import org.springframework.data.jpa.repository.JpaRepository;
- import org.springframework.data.jpa.repository.Query;
- import org.springframework.data.repository.query.Param;
- import java.util.List;
- public interface UserRepository extends JpaRepository<User, Integer> {
- List<User> findAllBy();
- User findByUserId(Integer userId);
- //@Query 注解, 并提供一个查询语句作为参数, Spring Data JPA 在创建代理对象时, 便以提供的查询语句来实现其功能.
- @Query("from User where user_name = :username")
- User findUser(@Param("username") String name);
- }
Spring Data JPA 在后台为持久层接口创建代理对象时, 会解析方法名字, 并实现相应的功能. 除了通过方法名字以外, 它还可以通过如下两种方式指定查询语句:
Spring Data JPA 可以访问 JPA 命名查询语句. 开发者只需要在定义命名查询语句时, 为其指定一个符合给定格式的名字, Spring Data JPA 便会在创建代理对象时, 使用该命名查询语句来实现其功能.
测试代码:
- @Controller
- public class UserController {
- @Autowired
- private UserService userService;
- @GetMapping(value = "listUser")
- @ResponseBody
- public List<User> listUser() {
- User byUserId = userService.findByUserId(1);
- User fjw = userService.findUser("hzq");
- return userService.listUser();
- }
- }
最终测试查询 sql 如下:
- Hibernate:
- select
- user0_.user_id as user_id1_0_,
- user0_.user_name as user_nam2_0_
- from
- user user0_
- where
- user0_.user_id=?
- Hibernate:
- select
- user0_.user_id as user_id1_0_,
- user0_.user_name as user_nam2_0_
- from
- user user0_
- where
- user_name=?
- Hibernate:
- select
- user0_.user_id as user_id1_0_,
- user0_.user_name as user_nam2_0_
- from
- user user0_
源码参照: springboot 集成 JPA
来源: http://www.bubuko.com/infodetail-2957960.html