本文共 22039 字,大约阅读时间需要 73 分钟。
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 ListgetAll(){ return studentDao.findAll(); }}
测试
查询所有 增加 修改与新增运行同一个方法判断是否有这个id有则修改无则新增 删除本次案例采取的是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); }}
后台代码
StringUtilspackage 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 ListfilterWhite(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 MapparamMap;// 保存上次查询的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("
实体类
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 PagelistPager(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 PagelistPager(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(); Pageteachers = 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/