title: “SpringDataJpa基本使用方法”
tags:

  • Java
    categories:
  • Java
    date: 2019-05-04 23:46:08

整理,非原创

例子

gradle

  1. dependencies {
  2. runtime('mysql:mysql-connector-java')
  3. compile('org.springframework.boot:spring-boot-starter-web')
  4. testCompile('org.springframework.boot:spring-boot-starter-test')
  5. compile('org.springframework.boot:spring-boot-starter-data-jpa')
  6. compile group: 'org.flywaydb', name: 'flyway-core', version: '5.2.4'
  7. compile group: 'javax.persistence', name: 'javax.persistence-api', version: '2.2'
  8. }

resources/application.yml

  1. server:
  2. port: 8083
  3. spring:
  4. datasource:
  5. url: jdbc:mysql://localhost:3306/employee_db?characterEncoding=utf-8&useSSL=false
  6. username: root
  7. password: root
  8. driveClassName: com.mysql.jdbc.Driver
  9. jpa:
  10. show-sql: true
  11. hibernate:
  12. naming:
  13. implicitStrategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
  14. physicalStrategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

注意高版本的mysql要加上?characterEncoding=utf-8&useSSL=false,ssl根据情况确定true和false

EmployeeAPIApplication

  1. package com.example.employee;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. @SpringBootApplication
  5. public class EmployeeAPIApplication {
  6. public static void main(String[] args) {
  7. SpringApplication.run(EmployeeAPIApplication.class, args);
  8. }
  9. }

employee

  1. package com.example.employee.entity;
  2. import javax.persistence.Entity;
  3. import javax.persistence.Id;
  4. @Entity //这个要有
  5. public class Employee {
  6. @Id
  7. private Integer id;
  8. private String name;
  9. private Integer age;
  10. private String gender;
  11. private Integer companyId;
  12. private Integer salary;
  13. public Employee() { //这个默认构造要有,如果没有自定义构造可以都不写
  14. }
  15. public Employee(Integer id, String name, Integer age, String gender, Integer companyId, Integer salary) {
  16. this.id = id;
  17. this.name = name;
  18. this.age = age;
  19. this.gender = gender;
  20. this.companyId = companyId;
  21. this.salary = salary;
  22. }
  23. //getter setter
  24. }

EmployeeRepository

  1. package com.example.employee.repository;
  2. import com.example.employee.entity.Employee;
  3. import org.springframework.data.jpa.repository.JpaRepository;
  4. import org.springframework.data.jpa.repository.Query;
  5. import org.springframework.data.repository.query.Param;
  6. import org.springframework.stereotype.Repository;
  7. @Repository
  8. public interface EmployeeRepository extends JpaRepository<Employee, Integer> {
  9. Employee findByName(String name);
  10. @Query(value = "select e.* from employee e, (select d.salary from employee d where d.name = :name) c where e.name like CONCAT('%',:namelike,'%') and e.salary > c.salary limit 1",
  11. nativeQuery=true)
  12. Employee findOneNameContainAndSalaryGreaterThan(@Param("namelike") String nameLike, @Param("name") String nameOfCompare);
  13. }

注意emplyee和对应的EmployeeRepository要在和EmployeeAPIApplication同级目录下,否则可能出错

-EmployeeAPIApplication

-model

—-emplyee

-Repository

—-EmployeeRepository

Repository

继承

https://blog.csdn.net/qq_22172133/article/details/81192040

  • Repository: 最顶层的接口,是一个空接口,目的是为了统一所有的Repository的类型,且能让组件扫描时自动识别
  • CrudRepository: Repository的子接口,提供CRUD 的功能。
  • PagingAndSortingRepository:CrudRepository的子接口, 添加分页排序。
  • JpaRepository: PagingAndSortingRepository的子接口,增加批量操作等。
  • JpaSpecificationExecutor: 用来做复杂查询的接口。

可以继承上面几个,自带功能逐级增加

CURD操作

直接操作

https://blog.csdn.net/qq_22172133/article/details/81192040

解析方法名查询

通过方法名自动解析生成

  1. 全局修饰: Distinct Top First
  2. 关键词: IsNull IsNotNull Like NotLike Containing In NotIn
  3. IgnoreCase Between Equals LessThan GreaterThan After Before
  4. 排序方向: Asc Desc
  5. 连接词: And Or
  6. And 等价于 SQL 中的 and 关键字,比如 findByUsernameAndPassword(String user, Striang pwd);
  7. Or 等价于 SQL 中的 or 关键字,比如 findByUsernameOrAddress(String user, String addr);
  8. Between 等价于 SQL 中的 between 关键字,比如 findBySalaryBetween(int max, int min);
  9. LessThan 等价于 SQL 中的 “<”,比如 findBySalaryLessThan(int max);
  10. GreaterThan 等价于 SQL 中的”>”,比如 findBySalaryGreaterThan(int min);
  11. IsNull 等价于 SQL 中的 is null”,比如 findByUsernameIsNull();
  12. IsNotNull 等价于 SQL 中的 is not null”,比如 findByUsernameIsNotNull();
  13. NotNull IsNotNull 等价;
  14. Like 等价于 SQL 中的 like”,比如 findByUsernameLike(String user);
  15. NotLike 等价于 SQL 中的 not like”,比如 findByUsernameNotLike(String user);
  16. OrderBy 等价于 SQL 中的 order by”,比如 findByUsernameOrderBySalaryAsc(String user);
  17. Not 等价于 SQL 中的 “! =”,比如 findByUsernameNot(String user);
  18. In 等价于 SQL 中的 in”,比如 findByUsernameIn(Collection userList) ,方法的参数可以是 Collection 类型,也可以是数组或者不定长参数;
  19. NotIn 等价于 SQL 中的 not in”,比如 findByUsernameNotIn(Collection userList) ,方法的参数可以是 Collection 类型,也可以是数组或者不定长参数;

JPQL及SQL查询

通过增加@Query(value = sql, nativeQuery=true)实现对ql语句按照sql进行查询,为false按照jpql查询。不写第二参数则默认为jpql查询

如果语句有修改需要增加 @Modifying 否则无法正确修改内容

LIKE查询

a like ‘%xxx%’在Query中无法正常解析,需要用 a like CONCAT(‘%’,?1,’%’),可能是在字符串你替换时的问题,也可以用:xxx和param关键字

@Query(value = “select * from a where time like CONCAT(‘%’,:time,’%’) “, nativeQuery = true)
Object findByCreateTimeLike(@Param(“time”) String time);

JPA中的*

select x.* from nnn x;应写为select x from nnn x,因为jpql中都以对象进行操作将每个结果视为对象

JPQL差异

JPQL只能在WHERE 和 HAVING 条件中进行子查询select o from Order as o where o.ower in(select p from Person as p where p.age =26),原生sql可在select中使用

JPQL不支持limit限定