一、JPA介绍java
JPA(Java Persistence API)是Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据。它的出现主要是为了简化现有的持久化开发工做和整合ORM技术mysql
Spring data jpa是在JPA规范下提供了Repository层的实现。虽然ORM框架都实现了JPA规范,可是在不一样的ORM框架之间切换仍然须要编写不一样的代码,而经过使用Spring data jpa可以方便你们在不一样的ORM框架之间进行切换而不要更改代码,使代码看上去更加优雅,而且spring data jpa 对Repository层封装的很好,也省去了很多的麻烦。git
二、springboot集成github
pom依赖:spring
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>
配置文件添加:sql
#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集成JPAspringboot