1.课程介绍
1.什么是SpringDataJpa
2.SpringDataJpa的基本使用(掌握)
3.JpaSpecificationExecutor(难点,尽量理解)
4.jpa-spac框架
5.Query的抽取(思想)
6.SpringDataJpa的自定义扩展(拷备完成)
一,什么是SpringDataJpa
咱们要集成三大框架(Spring+SpringMVC+SpringDataJpa)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.itsource</groupId>
<artifactId>yxb</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<org.springframework.version>4.2.5.RELEASE</org.springframework.version>
<org.hibernate.version>4.3.8.Final</org.hibernate.version>
<spring-data-jpa.version>1.9.0.RELEASE</spring-data-jpa.version>
<com.fasterxml.jackson.version>2.5.0</com.fasterxml.jackson.version>
<org.slf4j.version>1.6.1</org.slf4j.version>
</properties>
<dependencies>
<!-- Spring的支持包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${org.springframework.version}</version>
<scope>test</scope>
</dependency>
<!-- 引入web前端的支持 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<!-- SpringMCV上传需要用到io包-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
<!-- 文件上传用到的包 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.2.2</version>
</dependency>
<!-- SpringMVC的json支持包 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${com.fasterxml.jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${com.fasterxml.jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${com.fasterxml.jackson.version}</version>
</dependency>
<!-- hibernate的支持包 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${org.hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${org.hibernate.version}</version>
</dependency>
<!-- SpringData的支持包 -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>${spring-data-jpa.version}</version>
</dependency>
<!-- SpringData的擴展包 -->
<dependency>
<groupId>com.github.wenhao</groupId>
<artifactId>jpa-spec</artifactId>
<version>3.1.1</version>
<!-- 把所有的依賴都去掉 -->
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.5</version>
</dependency>
<!-- 測試包 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<!-- 这个scope 只能作用在编译和测试时,同时没有传递性。表示在运行的时候不添加此jar文件 -->
<scope>provided</scope>
</dependency>
<!-- 日志文件 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${org.slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${org.slf4j.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
</dependency>
<!-- 代码生成器模版技术 -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.6</version>
</dependency>
<!-- shiro的支持包 -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-all</artifactId>
<version>1.4.0</version>
<type>pom</type>
</dependency>
<!-- shiro与Spring的集成包 -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.4.0</version>
</dependency>
<!-- poi支持的jar包 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.11</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.11</version>
</dependency>
<!-- 图片压缩功能 -->
<!-- 缩略图 -->
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.6</version>
</dependency>
<!-- 定时调度 -->
<dependency>
<groupId>quartz</groupId>
<artifactId>quartz</artifactId>
<version>1.5.2</version>
</dependency>
<!-- 邮件支持 -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.1</version>
</dependency>
</dependencies>
<build>
<finalName>yxb</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>8.1.15.v20140411</version>
<configuration>
<stopPort>9966</stopPort>
<stopKey>foo</stopKey>
<webAppConfig>
<contextPath>/</contextPath>
</webAppConfig>
</configuration>
</plugin>
</plugins>
</build>
</project>
二,SpringDataJpa的基本使用(掌握)
抽取id
@MappedSuperclass
public class BaseDomain {
@Id
@GeneratedValue
public Long id;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
抽取查询方法
BaseQuery公共查询对象,完成分页查询和排序
public abstract class BaseQuery {
//当前页数
private Integer currentPage=1;
//每页条数
private Integer pageSize=10;
//排序字段
private String orderByName;
//排序类型默认 降序
private String orderByType="DESC";
public Integer getJpaPage(){
return currentPage -1;
}
public Integer getCurrentPage() {
return currentPage;
}
public void setCurrentPage(Integer currentPage) {
this.currentPage = currentPage;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
public String getOrderByName() {
return orderByName;
}
public void setOrderByName(String orderByName) {
this.orderByName = orderByName;
}
public String getOrderByType() {
return orderByType;
}
public void setOrderByType(String orderByType) {
this.orderByType = orderByType;
}
//排序方法,设置需要排序才排序,不需要就不排序
public Sort createSort(){
Sort sort = null;
if (orderByName!=null){
//三目运算
Sort.Direction type ="ASC".equals(orderByType.toUpperCase())?Sort.Direction.ASC:Sort.Direction.DESC;
//组装sort
sort = new Sort(type,orderByName);
}
return sort;
}
//该方法定义成抽象的目的,让子类都必须覆写该方法
public abstract Specification createSpecification();
}
三,EmployeeRepository extends JpaRepository
//想通过员工的名称来查询员工 -- 如果按照一定的规范来写 底层就会解析完成
List<Employee> findEmployeeByUsername(String username);
//like模糊查询
List<Employee> findEmployeeByUsernameLike(String username);
//查询数据--Query注解查询
@Query("select o from Employee o where o.username like ?1")
List<Employee> findEmpByUsername(String username);
//根据顺序查询
@Query("select o from Employee o where o.username like ?1 and o.email like ?2")
List<Employee> query02(String username,String emial);
//根据名称来查询
@Query("select o from Employee o where o.username like :username and o.email like :email")
List<Employee> query03(@Param("username") String username1, @Param("email")String email1);
//对原生sql语句
@Query(value="select count(*) from employee ",nativeQuery=true)
Long query04();
还可以继承多个接口
public interface EmployeeRepository1 extends JpaRepository<Employee,Long>,
JpaSpecificationExecutor<Employee> {
}
四,各种CRUD ,分页查询,高级搜索,
CRUD
@Autowired
private EmployeeRepository employeeRepository;
//查询所有
@Test
public void testFindAll() throws Exception{
List<Employee> employees = employeeRepository.findAll();
for (Employee employee : employees) {
System.out.println(employee);
}
}
//批量查询
@Test
public void testFindAll1() throws Exception{
List list = Arrays.asList(55L,66L,77L);
List<Employee> employees = employeeRepository.findAll(list);
for (Employee employee : employees) {
System.out.println(employee);
}
}
@Autowired
private EmployeeRepository employeeRepository;
//查询所有
@Test
public void testJpa() throws Exception{
List<Employee> lists = employeeRepository.findAll();
System.out.println(employeeRepository.getClass());
for (Employee employee :lists ) {
System.out.println(employee);
}
}
@Test
public void testfindAll() throws Exception{
//表示多条查询查询25,26,27
List lists = Arrays.asList(25L,26L,27L);
List<Employee> list = employeeRepository.findAll(lists);
for (Employee o : list) {
System.out.println(o);
}
}
//查询一条数据
@Test
public void testFindOne() throws Exception{
Employee employee = employeeRepository.findOne(6L);
System.out.println(employee);
}
//保存
@Test
public void testsave() throws Exception{
Employee employee = new Employee();
employee.setUsername("公鸡");
employee.setPassword("傻逼");
employee.setAge(22);
employeeRepository.save(employee);
}
//修改 如果有id 就修改 没有id 就新增
@Test
public void testUpdate() throws Exception{
Employee employee = new Employee();
employee.setId(275L);
employee.setUsername("大鸡鸡");
employee.setPassword("大傻逼");
employee.setAge(18);
employeeRepository.save(employee);
}
//删除
@Test
public void testDelete() throws Exception{
employeeRepository.delete(275L);
}
@Test
public void testDeleteInBatch() throws Exception{
//指定删除两条
List<Employee> list = employeeRepository.findAll(Arrays.asList(272L, 273L));
employeeRepository.deleteInBatch(list);
}
//总条数
@Test
public void testCount() throws Exception{
System.out.println(employeeRepository.count());
}
JpaSpecificationExecutor
@Autowired
private EmployeeRepository1 employeeRepository1;
@Test
public void testSpec1() throws Exception{
EmployeeQuery employeeQuery = new EmployeeQuery();
employeeQuery.setUsername("呵呵");
employeeQuery.setAge(234);
Specification<Employee> spe = Specifications.<Employee>and().
like(StringUtils.isNotBlank(employeeQuery.getUsername()),
"username", "%" + employeeQuery.getUsername() + "%")
.gt(employeeQuery.getAge() != null, "age", employeeQuery.getAge())
.build();
//排序
Sort sort = null;
if(employeeQuery.getOrderByName()!= null){
String orderByName = employeeQuery.getOrderByName();
Sort.Direction direction = null;
if(employeeQuery.getOrderByType().equals("DESC")){
direction = Sort.Direction.DESC;
}else{
direction = Sort.Direction.ASC;
}
//组装Sort
sort =new Sort(direction,orderByName);
}
//分页
Pageable pageable = new PageRequest(employeeQuery.getJpaPage(), employeeQuery.getPageSize(), sort);
Page<Employee> employees = employeeRepository1.findAll(spe, pageable);
for (Employee employee : employees) {
System.out.println(employee);
}
}
@Test
public void testSpec2() throws Exception{
EmployeeQuery employeeQuery = new EmployeeQuery();
employeeQuery.setUsername("1");
employeeQuery.setAge(18);
Specification spec = employeeQuery.createSpecification();
Sort sort = employeeQuery.createSort();
Pageable pageable = new PageRequest(employeeQuery.getJpaPage(), employeeQuery.getPageSize(), sort);
Page<Employee> lists = employeeRepository1.findAll(spec, pageable);
for (Employee employee : lists) {
System.out.println(employee);
}
}
Query的抽取
@Autowired
private EmployeeRepository employeeRepository;
//按照规范查询
@Test
public void testQuery() throws Exception{
List<Employee> employees = employeeRepository.findEmployeeByUsername("acac");
for (Employee employee : employees) {
System.out.println(employee);
}
}
//按照规范查询
@Test
public void testQuery1() throws Exception{
//模糊查询
List<Employee> employees = employeeRepository.findEmployeeByUsernameLike("%bb%");
for (Employee employee : employees) {
System.out.println(employee);
}
}
//Query注解查询
@Test
public void testQuery2() throws Exception{
List<Employee> emps= employeeRepository.findEmpByUsername("%bbbbbb%");
for (Employee emp : emps) {
System.out.println(emp);
}
}
//根据顺序来查询
@Test
public void testQuery3() throws Exception{
//多条件查询
List<Employee> emps= employeeRepository.query02("%cc%","%33%");
for (Employee emp : emps) {
System.out.println(emp);
}
}
@Test
public void testQuery4() throws Exception{
List<Employee> emps= employeeRepository.query03("b","%2%");
for (Employee emp : emps) {
System.out.println(emp);
}
}
@Test
public void testQuery5() throws Exception{
System.out.println(employeeRepository.query04());
}