【Spring Boot】整合JPA模糊分页查询
Spring Boot整合JPA
一、POM
<?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>com.squirrel</groupId><artifactId>squirrel-web</artifactId><version>1.0-SNAPSHOT</version><!-- Spring boot 父引用--><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.0.RELEASE</version></parent><!-- Spring boot 核心web--><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.21</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId><version>2.1.0.BUILD-SNAPSHOT</version></dependency><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>18.0</version></dependency></dependencies></project>
二、配置文件
#监听端口号
server.port=8888
#用户会话session过期时间,以秒为单位
server.session-timeout=7200
#数据库配置
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#输出日志级别
logging.level.org.springframework.web=DEBUG#JPA
#1表结构:update自动更新,none不采取措施
spring.jpa.hibernate.ddl-auto=update
#2显示sql
spring.jpa.show-sql=true
#3让控制器输出的json字符格式更美观
spring.jackson.serialization.indent-output=true
三、启动类
package com.squirrel;import com.squirrel.support.CustomRepositoryFactoryBean;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;@SpringBootApplication
@ComponentScan(basePackages={"com.squirrel"})
@EnableJpaRepositories(repositoryFactoryBeanClass = CustomRepositoryFactoryBean.class)
public class StartApplication {public static void main(String[] args) {SpringApplication.run(StartApplication.class, args);}
}
四、entity
package com.squirrel.entity;import javax.persistence.*;@Entity
public class User {private Long id;private String name;private Integer age;public User() {super();}public User(String name, Integer age) {this.name = name;this.age = age;}@Id@GeneratedValuepublic Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}
}
五、分页模糊查询方法封装
package com.squirrel.specs;import static com.google.common.collect.Iterables.toArray;import com.squirrel.entity.User;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.util.ReflectionUtils;
import org.springframework.util.StringUtils;import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;import javax.persistence.EntityManager;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.persistence.metamodel.Attribute;
import javax.persistence.metamodel.EntityType;
import javax.persistence.metamodel.SingularAttribute;public class CustomerSpecs {/*** 1.定义一个返回值为Specification的方法byAuto,这里使用的是泛型 T,所以这个Specification是可以用于任意的实体类的,* 它接受的参数是entityManager和当前的包含值作为查询条件的实体类对象*/public static <T> Specification<T> byAuto(final EntityManager entityManager,final T example){/*** 2.获得当前实体类对象类的类型*/final Class<T> type = (Class<T>) example.getClass();return new Specification<T>() {@Overridepublic Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder cb) {/*** 3.新建Predicate列表存储构造的查询条件*/List<Predicate> predicates = new ArrayList<>();/*** 4.获取实体类的EntityType,我们可以从EntityType获取实体类的属性*/EntityType<T> entity = entityManager.getMetamodel().entity(type);/*** 5.对实体类的所有属性做循环*/for (Attribute<T,?> attr : entity.getDeclaredAttributes()) {/*** 6.获得实体类对象某一个属性的值*/Object attrValue = getValue(example, attr);if(attrValue != null){/*** 7.当前属性值为字符类型的时候*/if(attr.getJavaType() == String.class) {/*** 8.若当前字符不为空的情况下*/if(!StringUtils.isEmpty(attrValue)){/*** 构造当前属性like(前后%)属性值查询条件,并添加到条件列表中*/predicates.add(cb.like(root.get(attribute(entity, attr.getName(),String.class)),panttern((String) attrValue)));}}else{/*** 10.其余情况下,构造属性和属性值equal查询条件,并添加到条件列表中*/predicates.add(cb.equal(root.get(attribute(entity, attr.getName(),attrValue.getClass())),attrValue));}}}/*** 11.将条件列表转换成Predicate*/return predicates.isEmpty() ? cb.conjunction() : cb.and(toArray(predicates, Predicate.class));}/*** 12.通过反射获得实体类对象对应属性的属性值*/private <T> Object getValue(T example, Attribute<T, ?> attr){Field field = null;try {field = example.getClass().getDeclaredField(attr.getName());//设置对象的访问权限,保证对private的属性的访问field.setAccessible(true);return ReflectionUtils.getField(field,example);} catch (NoSuchFieldException e) {e.printStackTrace();return null;}}/*** 13.获得实体类的当前属性的SingularAttribute,SingularAttribute包含的是实体类的某个单独属性*/private <E,T> SingularAttribute<T, E> attribute(EntityType<T> entity, String fileName, Class<E> fieldClass) {return entity.getDeclaredSingularAttribute(fileName,fieldClass);}};}/*** 14.构造like的查询模式,即前后加%*/static private String panttern(String str) {return "%" + str + "%";}
}
package com.squirrel.support;import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.NoRepositoryBean;import java.io.Serializable;@NoRepositoryBean
public interface CustomRepository<T, ID extends Serializable> extends JpaRepository<T, ID> ,JpaSpecificationExecutor<T> {Page<T> findByAuto(T example, Pageable pageable);}
package com.squirrel.support;import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.support.SimpleJpaRepository;import javax.persistence.EntityManager;
import java.io.Serializable;import static com.squirrel.specs.CustomerSpecs.*;public class CustomRepositoryImpl <T, ID extends Serializable>extends SimpleJpaRepository<T, ID> implementsCustomRepository<T,ID> {private final EntityManager entityManager;public CustomRepositoryImpl(Class<T> domainClass, EntityManager entityManager) {super(domainClass, entityManager);this.entityManager = entityManager;}@Overridepublic Page<T> findByAuto(T example, Pageable pageable) {return findAll(byAuto(entityManager, example),pageable);}
}
package com.squirrel.support;import java.io.Serializable;
import javax.persistence.EntityManager;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.support.JpaRepositoryFactory;
import org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean;
import org.springframework.data.jpa.repository.support.SimpleJpaRepository;
import org.springframework.data.repository.core.RepositoryInformation;
import org.springframework.data.repository.core.RepositoryMetadata;
import org.springframework.data.repository.core.support.RepositoryFactorySupport;public class CustomRepositoryFactoryBean<T extends JpaRepository<S, ID>, S, ID extends Serializable>extends JpaRepositoryFactoryBean<T, S, ID>{public CustomRepositoryFactoryBean(Class<? extends T> repositoryInterface) {super(repositoryInterface);}@Overrideprotected RepositoryFactorySupport createRepositoryFactory(EntityManager entityManager){return new CustomRepositoryFactory(entityManager);}private static class CustomRepositoryFactory extends JpaRepositoryFactory{public CustomRepositoryFactory(EntityManager entityManager){super(entityManager);}@Override@SuppressWarnings({"unchecked"})protected <T, ID extends Serializable> SimpleJpaRepository<?, ?> getTargetRepository(RepositoryInformation information, EntityManager entityManager){return new CustomRepositoryImpl<T, ID>((Class<T>) information.getDomainType(), entityManager);}@Overrideprotected Class<?> getRepositoryBaseClass(RepositoryMetadata metadata){return CustomRepositoryImpl.class;}}
}
六、DAO
package com.squirrel.dao;import com.squirrel.entity.User;
import com.squirrel.support.CustomRepository;import java.util.List;public interface UserDao extends CustomRepository<User, Long> {List<User> findByName(String name);}
七、controller
package com.squirrel.controller;import com.squirrel.dao.UserDao;
import com.squirrel.entity.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
@RequestMapping("user")
public class UserController {private final Logger log = LoggerFactory.getLogger(UserController.class);@Autowiredprivate UserDao userDao;@RequestMapping("/getName")public List<User> getName (){log.info("访问/user/getName接口成功");List<User> users = userDao.findByName("哈哈");return users;}@RequestMapping("/insert")public String insert (){log.info("访问/user/insert接口成功");User user = new User();user.setName("是我");user.setAge(18);userDao.save(user);return "插入成功";}@RequestMapping("/sort")public List<User> sort (){log.info("访问/user/sort接口成功");List<User> users = userDao.findAll(new Sort(Sort.Direction.DESC,"age"));return users;}@RequestMapping("/page")public Page<User> page (){log.info("访问/user/sort接口成功");Page<User> userPage = userDao.findAll(new PageRequest(10, 2));return userPage;}@RequestMapping("/auto")public Page<User> auto(User user){log.info("访问/user/auto接口成功");Page<User> userPage = userDao.findByAuto(user, new PageRequest(0, 10));return userPage;}
}
【Spring Boot】整合JPA模糊分页查询相关推荐
- Spring boot整合jpa Jquery实现三级联动
Spring boot 整合jpa JQuery 实现省,市,区, 三级联动效果 三级联动在很多项目都必不可少,尤其是在付款时,需要选取地址,为了更好的用户体验感,从而出现了三级联动. 实现三级联动的 ...
- spring boot 系列之四:spring boot 整合JPA
上一篇我们讲了spring boot 整合JdbcTemplate来进行数据的持久化, 这篇我们来说下怎么通过spring boot 整合JPA来实现数据的持久化. 一.代码实现 修改pom,引入依赖 ...
- Spring Boot基础学习笔记07:Spring Boot整合JPA
文章目录 零.学习目标 1.熟悉Spring Data JPA基本语法和使用 2.掌握Spring Boot与JPA的整合使用 一.Spring Data JPA概述 1.Spring Data JP ...
- Spring Boot整合Jpa多数据源
Spring Boot整合Jpa多数据源 本文是Spring Boot整合数据持久化方案的最后一篇,主要和大伙来聊聊Spring Boot整合Jpa多数据源问题.在Spring Boot整合JbdcT ...
- Spring Boot整合JPA和人大金仓(Kingbase8)数据库
Spring Boot整合JPA和人大金仓(Kingbase8)数据库 简介 在开发Java应用程序时,使用JPA(Java Persistence API)可以方便地进行数据库操作.而人大金仓(Ki ...
- spring boot整合JPA实现多条件查询并分页
1.在DAO中的实现代码: public Page<User> findAdminUserPage(PageRequest pr, String name) {String sql = & ...
- spring boot 整合 jpa
1.在pom.xml中添加mysql 和 jpa 依赖 <dependency><groupId>org.springframework.boot</groupId> ...
- Spring boot 整合Jpa 配置文件参数
#数据库驱动 spring.datasource.driverClassName = com.mysql.jdbc.Driver #数据库连接地址 spring.datasource.url = jd ...
- springboot整合hibernate_峰哥说技术系列-17 .Spring Boot 整合 Spring Data JPA
今日份主题 Spring Boot 整合 Spring Data JPA JPA(Java Persistence API)是用于对象持久化的 API,是Java EE 5.0 平台标准的 ORM 规 ...
最新文章
- 记录服务器连接jupyter notebook过程
- UILabel的自适应宽高
- Php小数转为百分数,学习猿地-php百分数如何转小数
- Matlab并行编程方法
- 从godaddy转出域名
- 【教育与多媒体技术】
- git bash 界面修改成linux界面
- 晋职称计算机过几,晋职称怎样考计算机 昨日记者采访市人事局有关负责人
- 2018.9.15,Arduino—流水灯实验报告
- 图像处理常用八大算法
- direct.h头文件(对目录操作)
- WPF连接WF4的问题
- 展示数据的3大要点——web数据可视化的实现
- Unity快速实现回合制游戏
- python二维散点图绘画详解
- Skyline WEB端开发3——添加一个弹框
- eplan部件列表手动修改_EPLAN的批量修改功能
- Hadoop Yarn ResourceManager启动失败
- 【方案】去哪儿网徐磊:如何利用开源技术构建日处理130亿+的实时日志平台?...
- Qt项目背景图片无法显示
热门文章
- 快速搞定 MAC 系统 JDK 安装及环境变量配置,让你的开发之路更加顺畅
- 规划一个配置管理数据库(CMDB)
- The Genome Reference Consortium Human Genome Build 37 now Available(GRCh37)
- 拼音相关→PinyinUtils.
- MongoDB 索引之全文索引
- 项目管理软件排行榜!盘点前十名!
- Redis端口占用 Could not create server TCP listening socket *:6379: bind: Address already in use
- 【算法题】求一个字符串的最长不重复子串
- Ubutun20.0.4搭建Opengrok1.3.16查看Android源码
- 如何在html显示当前时间