博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
springboot对JPA的支持
阅读量:3960 次
发布时间:2019-05-24

本文共 22039 字,大约阅读时间需要 73 分钟。

jpa支持

JPA的pom依赖

5.1.44
org.springframework.boot
spring-boot-starter-data-jpa
com.alibaba
druid-spring-boot-starter
1.1.10
org.springframework
spring-aspects
mysql
mysql-connector-java
${mysql.version}
runtime

JPA的application.yml文件配置

server:  port: 80  servlet:    context-path: /spring:  datasource:    #1.JDBC    type: com.alibaba.druid.pool.DruidDataSource    driver-class-name: com.mysql.jdbc.Driver    url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC    username: root    password: 123    druid:      #2.连接池配置      #初始化连接池的连接数量 大小,最小,最大      initial-size: 5      min-idle: 5      max-active: 20      #配置获取连接等待超时的时间      max-wait: 60000      #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒      time-between-eviction-runs-millis: 60000      # 配置一个连接在池中最小生存的时间,单位是毫秒      min-evictable-idle-time-millis: 30000      validation-query: SELECT 1 FROM DUAL      test-while-idle: true      test-on-borrow: true      test-on-return: false      # 是否缓存preparedStatement,也就是PSCache  官方建议MySQL下建议关闭   个人建议如果想用SQL防火墙 建议打开      pool-prepared-statements: true      max-pool-prepared-statement-per-connection-size: 20      # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙      filter:        stat:          merge-sql: true          slow-sql-millis: 5000      #3.基础监控配置      web-stat-filter:        enabled: true        url-pattern: /*        #设置不统计哪些URL        exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"        session-stat-enable: true        session-stat-max-count: 100      stat-view-servlet:        enabled: true        #        配置druid监控平台的请求地址        url-pattern: /druid/*        reset-enable: true        #设置监控页面的登录名和密码        login-username: admin        login-password: admin        #        控制谁能够访问        allow: 127.0.0.1  jpa:    hibernate:      ddl-auto: update    show-sql: true

在这里插入图片描述

测试t_springboot_Student表增删查改
dao层

package com.zxp.springboot04.dao;import com.zxp.springboot04.entity.Student;import org.springframework.data.jpa.repository.JpaRepository;/** * @author笑笑 * @site www.xiaoxiao.com * @company * @create 2020-01-03 15:26 */public interface StudentDao extends JpaRepository 
{}

controller层

package com.zxp.springboot04.controller;import com.zxp.springboot04.dao.StudentDao;import com.zxp.springboot04.entity.Student;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import java.util.List;/** * @author笑笑 * @site www.xiaoxiao.com * @company * @create 2020-01-03 15:29 */@RestControllerpublic class StudentController {    @Autowired    private StudentDao studentDao;    @RequestMapping("/add")    public String add(Student student){        studentDao.save(student);        return "success";    }    @RequestMapping("/edit")    public String edit(Student student){        studentDao.save(student);        return "success";    }    @RequestMapping("/del")    public String del(Student student){        studentDao.delete(student);        return "success";    }    @RequestMapping("/getOne")    public Student getOne(Integer sid){        return studentDao.findById(sid).get();    }    @RequestMapping("/getAll")    public List
getAll(){ return studentDao.findAll(); }}

测试

查询所有
在这里插入图片描述
在这里插入图片描述
增加
在这里插入图片描述
在这里插入图片描述
修改与新增运行同一个方法判断是否有这个id有则修改无则新增
在这里插入图片描述
在这里插入图片描述
删除
在这里插入图片描述
在这里插入图片描述

案例:Springboot+bootstrap界面版之增删改查及图片上传

本次案例采取的是spring data jpa和bootstrap3来完成的,并没有使用github提供的分页插件Pagehelper,pagehelper与SSM配合分页在前面博客已经有所讲解。

工程创建需要用到的
在这里插入图片描述
pom依赖

5.1.44
org.springframework.boot
spring-boot-starter-data-jpa
com.alibaba
druid-spring-boot-starter
1.1.10
org.springframework
spring-aspects
commons-fileupload
commons-fileupload
1.3.1

application.yml文件配置

server:  port: 80  servlet:    context-path: /spring:  datasource:    #1.JDBC    type: com.alibaba.druid.pool.DruidDataSource    driver-class-name: com.mysql.jdbc.Driver    url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC    username: root    password: 123    druid:      #2.连接池配置      #初始化连接池的连接数量 大小,最小,最大      initial-size: 5      min-idle: 5      max-active: 20      #配置获取连接等待超时的时间      max-wait: 60000      #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒      time-between-eviction-runs-millis: 60000      # 配置一个连接在池中最小生存的时间,单位是毫秒      min-evictable-idle-time-millis: 30000      validation-query: SELECT 1 FROM DUAL      test-while-idle: true      test-on-borrow: true      test-on-return: false      # 是否缓存preparedStatement,也就是PSCache  官方建议MySQL下建议关闭   个人建议如果想用SQL防火墙 建议打开      pool-prepared-statements: true      max-pool-prepared-statement-per-connection-size: 20      # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙      filter:        stat:          merge-sql: true          slow-sql-millis: 5000      #3.基础监控配置      web-stat-filter:        enabled: true        url-pattern: /*        #设置不统计哪些URL        exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"        session-stat-enable: true        session-stat-max-count: 100      stat-view-servlet:        enabled: true        #        配置druid监控平台的请求地址        url-pattern: /druid/*        reset-enable: true        #设置监控页面的登录名和密码        login-username: admin        login-password: admin        #        控制谁能够访问        allow: 127.0.0.1  thymeleaf:          cache: false          # 解决图片上传大小限制问题,也可采取配置类 servlet:            multipart:#              默认最大只能上传1mb              max-file-size: 20MB              max-request-size: 60MB jpa:  hibernate:     ddl-auto: update  show-sql: true

上传文件映射配置类MyWebAppConfigurer.java

package com.zxp.springboot05.config;/** * @author笑笑 * @site www.xiaoxiao.com * @company * @create 2020-01-03 16:01 */import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;/** * 资源映射路径 */@Configurationpublic class MyWebAppConfigurer extends WebMvcConfigurationSupport {    @Override    protected void addResourceHandlers(ResourceHandlerRegistry registry) {        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");        registry.addResourceHandler("/uploadImages/**").addResourceLocations("file:E:/zxp/");        super.addResourceHandlers(registry);    }}

后台代码

StringUtils

package com.zxp.springboot05.utils;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import java.util.Set;public class StringUtils {	// 私有的构造方法,保护此类不能在外部实例化	private StringUtils() {	}	/**	 * 如果字符串等于null或去空格后等于"",则返回true,否则返回false	 * 	 * @param s	 * @return	 */	public static boolean isBlank(String s) {		boolean b = false;		if (null == s || s.trim().equals("")) {			b = true;		}		return b;	}		/**	 * 如果字符串不等于null或去空格后不等于"",则返回true,否则返回false	 * 	 * @param s	 * @return	 */	public static boolean isNotBlank(String s) {		return !isBlank(s);	}	/**	 * set集合转string	 * @param hasPerms	 * @return	 */	public static String SetToString(Set hasPerms){		return  Arrays.toString(hasPerms.toArray()).replaceAll(" ", "").replace("[", "").replace("]", "");	}	/**	 * 转换成模糊查询所需参数	 * @param before	 * @return	 */	public static String toLikeStr(String before){		return isBlank(before) ? null : "%"+before+"%";	}	/**	 *	将图片的服务器访问地址转换为真实存放地址	 * @param imgpath	图片访问地址(http://localhost:8080/uploadImage/2019/01/26/20190126000000.jpg)	 * @param serverDir	uploadImage	 * @param realDir	E:/temp/	 * @return	 */	public static String serverPath2realPath(String imgpath, String serverDir, String realDir) {		imgpath = imgpath.substring(imgpath.indexOf(serverDir));		return imgpath.replace(serverDir,realDir);	}	/**	 * 过滤掉集合里的空格	 * @param list	 * @return	 */	public static List
filterWhite(List
list){ List
resultList=new ArrayList
(); for(String l:list){ if(isNotBlank(l)){ resultList.add(l); } } return resultList; } /** * 从html中提取纯文本 * @param strHtml * @return */ public static String html2Text(String strHtml) { String txtcontent = strHtml.replaceAll("
]+>", ""); //剔出的标签 txtcontent = txtcontent.replaceAll("
\\s*|\t|\r|\n", "");//去除字符串中的空格,回车,换行符,制表符 return txtcontent; } public static void main(String[] args) { }}

PageBean

package com.zxp.springboot05.utils;import javax.servlet.http.HttpServletRequest;import java.util.Map;/** * 分页工具类 */public class PageBean {	private int page = 1;// 页码	private int rows = 3;// 页大小	private int total = 0;// 总记录数	private boolean pagination = true;// 是否分页	//	保存上次查询的参数	private Map
paramMap;// 保存上次查询的url private String url; public void setRequest(HttpServletRequest request) { String page = request.getParameter("page"); String rows = request.getParameter("offset"); String pagination = request.getParameter("pagination"); this.setPage(page); this.setRows(rows); this.setPagination(pagination); this.setUrl(request.getRequestURL().toString()); this.setParamMap(request.getParameterMap()); } public PageBean() { super(); } public Map
getParamMap() { return paramMap; } public void setParamMap(Map
paramMap) { this.paramMap = paramMap; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public int getPage() { return page; } public void setPage(int page) { this.page = page; } public void setPage(String page) { if(StringUtils.isNotBlank(page)) { this.page = Integer.parseInt(page); } } public int getRows() { return rows; } public void setRows(String rows) { if(StringUtils.isNotBlank(rows)) { this.rows = Integer.parseInt(rows); } } public int getTotal() { return total; } public void setTotal(int total) { this.total = total; } public void setTotal(String total) { if(StringUtils.isNotBlank(total)) { this.total = Integer.parseInt(total); } } public boolean isPagination() { return pagination; } public void setPagination(boolean pagination) { this.pagination = pagination; } public void setPagination(String pagination) { if(StringUtils.isNotBlank(pagination) && "false".equals(pagination)) { this.pagination = Boolean.parseBoolean(pagination); } } /** * 最大页 * @return */ public int getMaxPage() { int max = this.total/this.rows; if(this.total % this.rows !=0) { max ++ ; } return max; } /** * 下一页 * @return */ public int getNextPage() { int nextPage = this.page + 1; if(nextPage > this.getMaxPage()) { nextPage = this.getMaxPage(); } return nextPage; } /** * 上一页 * @return */ public int getPreviousPage() { int previousPage = this.page -1; if(previousPage < 1) { previousPage = 1; } return previousPage; } /** * 获得起始记录的下标 * * @return */ public int getStartIndex() { return (this.page - 1) * this.rows; } @Override public String toString() { return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", pagination=" + pagination + "]"; }}

PageUtil

package com.zxp.springboot05.utils;import java.util.Map;import java.util.Set;/** * * 基于bootstrap3生成分页代码 */public class PageUtil {    public static String createPageCode(PageBean pageBean) {        StringBuffer sb = new StringBuffer();        /*         * 拼接向后台提交数据的form表单         * 	注意:拼接的form表单中的page参数是变化的,所以不需要保留上一次请求的值         */        sb.append("
"); sb.append("
"); Map
parameterMap = pageBean.getParamMap(); if(parameterMap != null && parameterMap.size() > 0) { Set
> entrySet = parameterMap.entrySet(); for (Map.Entry
entry : entrySet) { if(!"page".equals(entry.getKey())) { String[] values = entry.getValue(); for (String val : values) { sb.append("
"); } } } } sb.append(""); if(pageBean.getTotal()==0){ return "未查询到数据"; }else{ sb.append("
  • 首页
  • "); if(pageBean.getPage()>1){ sb.append("
  • 上一页
  • "); }else{ sb.append("
  • 上一页
  • "); } for(int i=pageBean.getPage()-1;i<=pageBean.getPage()+1;i++){ if(i<1||i>pageBean.getMaxPage()){ continue; } if(i==pageBean.getPage()){ sb.append("
  • "+i+"
  • "); }else{ sb.append("
  • "+i+"
  • "); } } if(pageBean.getPage()
    下一页"); }else{ sb.append("
  • 下一页
  • "); } sb.append("
  • 尾页
  • "); } /* * 给分页条添加与后台交互的js代码 */ sb.append("
    "); return sb.toString(); }}

    实体类

    package com.zxp.springboot05.entity;import lombok.ToString;import javax.persistence.*;/** * @author笑笑 * @site www.xiaoxiao.com * @company * @create 2020-01-03 16:06 */@Entity@Table(name = "t_springboot_teacher")@ToStringpublic class Teacher {    @Id    @GeneratedValue    private Integer tid;    @Column(length = 16)    private String tname;    @Column(length = 4)    private String sex;    @Column(length = 100)    private String description;    @Column(length = 200)    private String imagePath;    public Integer getTid() {        return tid;    }    public void setTid(Integer tid) {        this.tid = tid;    }    public String getTname() {        return tname;    }    public void setTname(String tname) {        this.tname = tname;    }    public String getSex() {        return sex;    }    public void setSex(String sex) {        this.sex = sex;    }    public String getDescription() {        return description;    }    public void setDescription(String description) {        this.description = description;    }    public String getImagePath() {        return imagePath;    }    public void setImagePath(String imagePath) {        this.imagePath = imagePath;    }}

    dao层

    package com.zxp.springboot05.dao;import com.zxp.springboot05.entity.Teacher;import org.springframework.data.jpa.repository.JpaRepository;import org.springframework.data.jpa.repository.JpaSpecificationExecutor;/** * @author笑笑 * @site www.xiaoxiao.com * @company * @create 2020-01-03 16:26 * * 只要继承JpaRepository,通常所用的增删查改方法都有 *  第一个参数:操作的实体类 *  第二个参数:实体类对应数据表的主键 * *  要使用高级查询必须继承 * org.springframework.data.jpa.repository.JpaSpecificationExecutor
    接口 */public interface TeacherDao extends JpaRepository
    , JpaSpecificationExecutor
    {}

    service层

    package com.zxp.springboot05.service;import com.zxp.springboot05.entity.Teacher;import com.zxp.springboot05.utils.PageBean;import org.springframework.data.domain.Page;/** * @author笑笑 * @site www.xiaoxiao.com * @company * @create 2020-01-03 16:27 */public interface TeacherService {    public Teacher save(Teacher teacher) ;    public void deleteById(Integer id);    public Teacher findById(Integer id);    public Page
    listPager(Teacher teacher, PageBean pageBean);}

    service实现层

    package com.zxp.springboot05.service.impl;import com.zxp.springboot05.dao.TeacherDao;import com.zxp.springboot05.entity.Teacher;import com.zxp.springboot05.service.TeacherService;import com.zxp.springboot05.utils.PageBean;import com.zxp.springboot05.utils.StringUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.domain.Page;import org.springframework.data.domain.PageRequest;import org.springframework.data.domain.Pageable;import org.springframework.data.jpa.domain.Specification;import org.springframework.stereotype.Service;import javax.persistence.criteria.CriteriaBuilder;import javax.persistence.criteria.CriteriaQuery;import javax.persistence.criteria.Predicate;import javax.persistence.criteria.Root;/** * @author笑笑 * @site www.xiaoxiao.com * @company * @create 2020-01-03 16:29 */@Servicepublic class TeacherServiceImpl implements TeacherService {    @Autowired    private TeacherDao teacherDao;    @Override    public Teacher save(Teacher teacher) {        return teacherDao.save(teacher);    }    @Override    public void deleteById(Integer id) {        teacherDao.deleteById(id);    }    @Override    public Teacher findById(Integer id) {        return teacherDao.findById(id).get();    }    @Override    public Page
    listPager(Teacher teacher, PageBean pageBean) {// jpa的Pageable分页是从0页码开始 Pageable pageable = PageRequest.of(pageBean.getPage()-1, pageBean.getRows()); return teacherDao.findAll(new Specification
    () { @Override public Predicate toPredicate(Root
    root, CriteriaQuery
    criteriaQuery, CriteriaBuilder criteriaBuilder) { Predicate predicate = criteriaBuilder.conjunction(); if(teacher != null){ if(StringUtils.isNotBlank(teacher.getTname())){ predicate.getExpressions().add(criteriaBuilder.like(root.get("tname"),"%"+teacher.getTname()+"%")); } } return predicate; } },pageable); }}

    controler层

    package com.zxp.springboot05.controller;import com.zxp.springboot05.entity.Teacher;import com.zxp.springboot05.service.TeacherService;import com.zxp.springboot05.utils.PageBean;import com.zxp.springboot05.utils.PageUtil;import com.zxp.springboot05.utils.StringUtils;import org.apache.commons.io.FileUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.domain.Page;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.multipart.MultipartFile;import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;import java.io.File;import java.io.IOException;/** * @author笑笑 * @site www.xiaoxiao.com * @company * @create 2020-01-03 16:33 */@Controller@RequestMapping("/teacher")public class TeacherController {    @Autowired    private TeacherService teacherService;    @RequestMapping("/listPager")    public ModelAndView list(Teacher teacher, HttpServletRequest request){        PageBean pageBean = new PageBean();        pageBean.setRequest(request);        ModelAndView modelAndView = new ModelAndView();        Page
    teachers = teacherService.listPager(teacher, pageBean); modelAndView.addObject("teachers",teachers.getContent()); pageBean.setTotal(teachers.getTotalElements()+""); modelAndView.addObject("pageCode", PageUtil.createPageCode(pageBean)/*.replaceAll("<","<").replaceAll(">:",">")*/); modelAndView.setViewName("list"); return modelAndView; } @RequestMapping("/toEdit") public ModelAndView toEdit(Teacher teacher){ ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("edit"); modelAndView.addObject("sexArr",new String[]{"男","女"}); if(!(teacher.getTid() == null || "".equals(teacher.getTid()))) { Teacher t = teacherService.findById(teacher.getTid()); modelAndView.addObject("teacher", t); } return modelAndView; } @RequestMapping("/add") public String add(Teacher teacher, MultipartFile image){ try { String diskPath = "E://temp/"+image.getOriginalFilename(); String serverPath = "http://localhost:8080/springboot/uploadImages/"+image.getOriginalFilename(); if(StringUtils.isNotBlank(image.getOriginalFilename())){ FileUtils.copyInputStreamToFile(image.getInputStream(),new File(diskPath)); teacher.setImagePath(serverPath); } teacherService.save(teacher); } catch (IOException e) { e.printStackTrace(); } return "redirect:/teacher/listPager"; } @RequestMapping("/edit") public String edit(Teacher teacher, MultipartFile image){ String diskPath = "E://temp/"+image.getOriginalFilename(); String serverPath = "http://localhost:8080/springboot/uploadImages/"+image.getOriginalFilename(); if(StringUtils.isNotBlank(image.getOriginalFilename())){ try { FileUtils.copyInputStreamToFile(image.getInputStream(),new File(diskPath)); teacher.setImagePath(serverPath); } catch (IOException e) { e.printStackTrace(); } } teacherService.save(teacher); return "redirect:/teacher/listPager"; } @RequestMapping("/del/{bid}") public String del(@PathVariable(value = "bid") Integer bid){ teacherService.deleteById(bid); return "redirect:/teacher/listPager"; }}

    页面层

    list.html

        
    书籍列表
    书籍名称:
    新增
    ID 头像 姓名 性别 简介 操作
    删除 修改

    edit.html

        
    用户编辑界面
    教员名称:
    教员描述:
    单选回显

    查询全部

    在这里插入图片描述
    查询单个
    在这里插入图片描述
    在这里插入图片描述
    新增
    在这里插入图片描述
    在这里插入图片描述
    修改
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    删除
    在这里插入图片描述
    在这里插入图片描述

    转载地址:http://qurzi.baihongyu.com/

    你可能感兴趣的文章
    Eclipse离线安装Java Decompiler插件
    查看>>
    Http预请求options
    查看>>
    未来设计师的工作模式?从室内设计领域的实时设计说起 | Mixlab趋势
    查看>>
    智能设计 | MixAI 知识库 No.69
    查看>>
    通过研究微信文章的相关推荐逻辑 ,尝试生成指南| Mixlab设计黑客
    查看>>
    这个世界上肯定有另一个我,做着我不敢做的事,过着我想过的生活 | MixAI 知识库 No.70...
    查看>>
    表情包数据挖掘 | Mix群聊
    查看>>
    如何阅读科研论文
    查看>>
    理解本真的REST架构风格
    查看>>
    10款免费且开源的项目管理工具
    查看>>
    java调用javascript :js引擎rhino
    查看>>
    asp 中常用的文件处理函数
    查看>>
    ADO中sqlserver存储过程使用
    查看>>
    Linux KernelTech版FAQ 1.0
    查看>>
    ntfs分区iis故障的解决
    查看>>
    个人创业“六大死穴”
    查看>>
    最重要的 12个 J2EE 最佳实践
    查看>>
    通过Java Swing看透MVC设计模式
    查看>>
    Java 理论与实践: 关于异常的争论
    查看>>
    编写高效的线程安全类
    查看>>