08_SpringBoot_整合PageHelper(掌握)
PageHelper插件
我们在正常的查询业务之中,只需要加上一行代码就可以实现分页的数据的封装处理
实现原理
PageHelper方法使用了静态的ThreadLocal参数,分页参数和线程是绑定的。内部流程是ThreadLocal中设置了分页参数(pageIndex,pageSize),之后在查询执行的时候,获取当线程中的分页参数,执行查询的时候通过拦截器在sql语句中添加分页参数,之后实现分页查询,查询结束后在 finally 语句中清除ThreadLocal中的查询参数
使用方法
1.调用PageHelper方法:PageHelper.startPage(pageNum, pageSize)
2. MyBatis 查询方法
注意:只要你可以保证在PageHelper方法调用后紧跟 MyBatis 查询方法,这就是安全的。因为PageHelper在finally代码段中自动清除了ThreadLocal存储的对象。
MyBatis整合PageHelper插件,自行阅读即可
mybatis中pageHelper的配置使用_铛铛响的博客-CSDN博客
添加PageHelper启动器依赖
1. <dependency>
2. <groupId>com.github.pagehelper</groupId>
3. <artifactId>pagehelper-spring-boot-starter</artifactId>
4. <version>1.2.12</version>
5. </dependency>
EmpController
1. package com.msb.controller;
2.
3. import com.msb.pojo.Emp;
4. import com.msb.service.EmpService;
5. import org.springframework.beans.factory.annotation.Autowired;
6. import org.springframework.stereotype.Controller;
7. import org.springframework.web.bind.annotation.PathVariable;
8. import org.springframework.web.bind.annotation.RequestMapping;
9. import org.springframework.web.bind.annotation.ResponseBody;
10.
11. import java.util.List;
12.
13. /**
14. * @Author: Ma HaiYang
15. * @Description: MircoMessage:Mark_7001
16. */
17. @Controller
18. @RequestMapping("/emp")
19. public class EmpController {
20.
21. @Autowired
22. private EmpService empService;
23.
24. @RequestMapping("/findByPage/{pageNum}/{pageSize}")
25. @ResponseBody
26. public List<Emp> findByPage(@PathVariable("pageNum") Integer pageNum,@PathVariable("pageSize") Integer pageSize){
27. return empService.findByPage(pageNum,pageSize);
28. }
29. }
30.
Service层代码编写
1. package com.msb.service.impl;
2.
3. import com.github.pagehelper.Page;
4. import com.github.pagehelper.PageHelper;
5. import com.github.pagehelper.PageInfo;
6. import com.msb.mapper.EmpMapper;
7. import com.msb.pojo.Emp;
8. import com.msb.service.EmpService;
9. import org.springframework.beans.factory.annotation.Autowired;
10. import org.springframework.stereotype.Service;
11.
12. import java.util.List;
13.
14. /**
15. * @Author: Ma HaiYang
16. * @Description: MircoMessage:Mark_7001
17. */
18. @Service
19. public class EmpServiceImpl implements EmpService {
20. @Autowired
21. private EmpMapper empMapper;
22. @Override
23. public List<Emp> findByPage(Integer pageNum, Integer pageSize) {
24. Page<Emp> page = PageHelper.startPage(pageNum, pageSize);
25. List<Emp> list =empMapper.findAll();
26.
27. // 方式1
28. System.out.println("当前页:"+page.getPageNum());
29. System.out.println("总页数"+page.getPages());
30. System.out.println("页大小:"+page.getPageSize());
31. System.out.println("总记录数:"+page.getTotal());
32. System.out.println("当前页数据"+page.getResult());
33.
34. // 方式2
35. PageInfo<Emp> pi =new PageInfo<>(list);
36. System.out.println("当前页"+pi.getPageNum());
37. System.out.println("总页数"+pi.getPages());
38. System.out.println("页大小"+pi.getSize());
39. System.out.println("总记录数"+pi.getTotal());
40. System.out.println("当前页数据"+pi.getList());
41.
42. return list;
43. }
44. }
PageInfo对象和Page对象的区别
Page和PageInfo_程序员^晓洋的博客-CSDN博客_page和pageinfo
09_SpringBoot_整合Druid((掌握)
Druid是由阿里巴巴推出的数据库连接池。它结合了C3P0、DBCP、PROXOOL等数据库连接池的优点。之所以从众多数据库连接池中脱颖而出,还有一个重要的原因就是它包含控制台,很方便的帮助我们实现对于sql执行的监控。
添加依赖
<dependency>
2. <groupId>com.alibaba</groupId>
3. <artifactId>druid-spring-boot-starter</artifactId>
4. <version>1.1.10</version>
5. </dependency>
修改配置文件application.yml
1. spring:
2. datasource:
3. # 使用阿里的Druid连接池
4. type: com.alibaba.druid.pool.DruidDataSource
5. driver-class-name: com.mysql.cj.jdbc.Driver
6. # 填写你数据库的url、登录名、密码和数据库名
7. url: jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
8. username: root
9. password: root
10. druid:
11. # 连接池的配置信息
12. # 初始化大小,最小,最大
13. initial-size: 5
14. min-idle: 5
15. maxActive: 20
16. # 配置获取连接等待超时的时间
17. maxWait: 60000
18. # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
19. timeBetweenEvictionRunsMillis: 60000
20. # 配置一个连接在池中最小生存的时间,单位是毫秒
21. minEvictableIdleTimeMillis: 300000
22. validationQuery: SELECT 1
23. testWhileIdle: true
24. testOnBorrow: false
25. testOnReturn: false
26. # 打开PSCache,并且指定每个连接上PSCache的大小
27. poolPreparedStatements: true
28. maxPoolPreparedStatementPerConnectionSize: 20
29. # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
30. filters: stat,wall,slf4j
31. # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
32. connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
33. # 配置DruidStatFilter
34. web-stat-filter:
35. enabled: true
36. url-pattern: "/*"
37. exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"
38. # 配置DruidStatViewServlet
39. stat-view-servlet:
40. url-pattern: "/druid/*"
41. # IP白名单(没有配置或者为空,则允许所有访问)
42. allow: 127.0.0.1,192.168.8.109
43. # IP黑名单 (存在共同时,deny优先于allow)
44. deny: 192.168.1.188
45. # 禁用HTML页面上的“Reset All”功能
46. reset-enable: false
47. # 登录名
48. login-username: admin
49. # 登录密码
50. login-password: 123456
代码测试
访问监控页面
10_SpringBoot_整合JSP(了解)
添加依赖
<!--JSP依赖-->
2. <dependency>
3. <groupId>org.apache.tomcat.embed</groupId>
4. <artifactId>tomcat-embed-jasper</artifactId>
5. <scope>provided</scope>
6. </dependency>
添加webapps目录并设置目录
设置工作目录,如果在IDEA中项目结构为聚合工程。那么在运行jsp是需要指定路径。如果项目结构为独立项目则不需要。
在 yml配置文件中配置视图解析器参数
在控制类中声明单元方法请求转发jsp资源
1. package com.msb.controller;
2.
3. import org.springframework.stereotype.Controller;
4. import org.springframework.web.bind.annotation.PathVariable;
5. import org.springframework.web.bind.annotation.RequestMapping;
6.
7. /**
8. * @Author: Ma HaiYang
9. * @Description: MircoMessage:Mark_7001
10. */
11. @Controller
12. public class PageController {
13. @RequestMapping("/{uri}")
14. public String getPage(@PathVariable("uri") String uri){
15. return uri;
16. }
17. }
11_SpringBoot_整合FreeMarker(熟悉)
1FreeMarker的简介
FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。
FreeMarker是免费的,基于Apache许可证2.0版本发布。其模板编写为FreeMarker Template Language(FTL),属于简单、专用的语言。需要准备数据在真实编程语言中来显示,比如数据库查询和业务运算, 之后模板显示已经准备好的数据。在模板中,主要用于如何展现数据, 而在模板之外注意于要展示什么数据。
常用的java模板引擎还有哪些?
Jsp、Freemarker、Thymeleaf 、Velocity 等。
模板+数据模型=输出
freemarker并不关心数据的来源,只是根据模板的内容,将数据模型在模板中显示并输出文件(通常为html,也可以生成其它格式的文本文件)
freemarker作为springmvc一种视图格式,默认情况下SpringMVC支持freemarker视图格式。 需要创建Spring Boot+Freemarker工程用于测试模板。
2FreeMarker初次使用
导入依赖
<!--freeMaker依赖-->
2. <dependency>
3. <groupId>org.springframework.boot</groupId>
4. <artifactId>spring-boot-starter-freemarker</artifactId>
5. </dependency>
创建controller
@RequestMapping("/freemarker")
2. @Controller
3. public class FreemarkerController {
4. @RequestMapping("/show")
5. public String freemarker(Map<String, Object> map){
6. map.put("name","msb");
7. //返回模板文件名称
8. return "show";
9. }
10. }
通过查阅配置信息发现,默认前缀为 '' ,后缀为.ftlh,默认路径为templates
templates目录下创建模板文件
1. <!DOCTYPE html>
2. <html lang="en">
3. <head>
4. <meta charset="UTF-8">
5. <title>Title</title>
6. </head>
7. <body>
8. this is showftlh
9. <br/>
10. ${name}
11. <img src="img/a.jpg"></img>
12. </body>
13. </html>
3FreeMarker常用指令
A遍历List集合
1、注释,即<#‐‐和‐‐>,介于其之间的内容会被freemarker忽略
2、插值(Interpolation):即${..}部分,freemarker会用真实的值代替${..}
3、FTL指令:和HTML标记类似,名字前加#予以区分,Freemarker会解析标签中的表达式或逻辑。
4、文本,仅文本信息,这些不是freemarker的注释、插值、FTL指令的内容会被freemarker忽略解析,直接输出内容。
1. @Controller
2. public class FreemarkerController {
3. @Autowired
4. private EmpService empService;
5.
6. @RequestMapping("/showEmp")
7. public ModelAndView testList(){
8. ModelAndView mv =new ModelAndView();
9. List<Emp> list =empService.findAll();
10. mv.addObject("empList", list);
11. mv.setViewName("showEmp");
12. return mv;
13. }
14. }
15.
页面代码
1. <!DOCTYPE html>
2. <html lang="en">
3. <head>
4. <meta charset="UTF-8">
5. <title>Title</title>
6. <style type="text/css">
7. #empTable{
8. width: 80%;
9. border: 1px solid blue;
10. margin: 0px auto;
11. }
12. #empTable th,td{
13. border: 1px solid green;
14. text-align: center;
15. }
16.
17. </style>
18. </head>
19. <body>
20.
21. <table id="empTable" cellpadding="0px" cellspacing="0px">
22. <tr>
23. <th>索引</th>
24. <th>工号</th>
25. <th>姓名</th>
26. <th>岗位</th>
27. <th>薪资</th>
28. <th>部门号</th>
29. </tr>
30. <#list empList as emp>
31. <tr>
32. <td>${emp_index}</td>
33. <td>${emp.empno}</td>
34. <td>${emp.ename}</td>
35. <td>${emp.job}</td>
36. <td>${emp.sal}</td>
37. <td>${emp.deptno}</td>
38. </tr>
39. </#list>
40.
41.
42. </table>
43.
44. </body>
45. </html>
说明: _index:得到循环的下标,使用方法是在stu后边加"_index",它的值是从0开始
B遍历Map数据
遍历输出指定内容
controller
1. @Controller
2. public class FreemarkerController {
3. @Autowired
4. private EmpService empService;
5.
6. @RequestMapping("/showEmpMap")
7. public ModelAndView testMap(){
8. ModelAndView mv =new ModelAndView();
9. List<Emp> list =empService.findAll();
10. Map<String,Emp> empMap =new HashMap<>();
11. for (Emp emp : list) {
12. empMap.put(emp.getEmpno().toString(), emp);
13. }
14.
15. mv.addObject("empMap", empMap);
16. mv.setViewName("showEmpMap");
17. return mv;
18. }
页面
1. <!DOCTYPE html>
2. <html lang="en">
3. <head>
4. <meta charset="UTF-8">
5. <title>Title</title>
6. <style type="text/css">
7. #empTable{
8. width: 80%;
9. border: 1px solid blue;
10. margin: 0px auto;
11. }
12. #empTable th,td{
13. border: 1px solid green;
14. text-align: center;
15. }
16.
17. </style>
18. </head>
19. <body>
20.
21. 输出7521员工信息:<br/>
22. 工号:${empMap['7521'].empno}<br/>
23. 姓名:${empMap['7521'].ename}<br/>
24. 岗位:${empMap['7521'].job}<br/>
25. 薪资:${empMap['7521'].sal}<br/>
26. 部门号:${empMap['7521'].deptno}<br/>
27. <br/>
28. 遍历EmpMap
29.
30. <table id="empTable" cellpadding="0px" cellspacing="0px">
31. <tr>
32. <th>索引</th>
33. <th>工号</th>
34. <th>姓名</th>
35. <th>岗位</th>
36. <th>薪资</th>
37. <th>部门号</th>
38. </tr>
39. <#list empMap?keys as k>
40. <tr>
41. <td>${k_index}</td>
42. <td>${k}</td>
43. <td>${empMap[k].ename}</td>
44. <td>${empMap[k].job}</td>
45. <td>${empMap[k].sal}</td>
46. <td>${empMap[k].deptno}</td>
47. </tr>
48. </#list>
49.
50.
51. </table>
52.
53. </body>
54. </html>
FreeMarker在遍历map集合是,key必须是String
C if指令
if 指令即判断指令,是常用的FTL指令,freemarker在解析时遇到if会进行判断,条件为真则输出if中间的内容,否 则跳过内容不再输出。
if中支持的运算符
a算数运算符 FreeMarker表达式中完全支持算术运算,FreeMarker支持的算术运算符包括:+, - , * , / , %
b逻辑运算符有如下几个: 逻辑与:&& 逻辑或:|| 逻辑非:! 逻辑运算符只能作用于布尔值,否则将产生错误
c比较运算符有如下几个:
① =或者==:判断两个值是否相等.
② !=:判断两个值是否不等.
③ > 或者gt:判断左边值是否大于右边值
④ >=或者gte:判断左边值是否大于等于右边值
⑤ <或者lt:判断左边值是否小于右边值
⑥ <=或者lte:判断左边值是否小于等于右边值
注意: =和!=可以用于字符串,数值和日期来比较是否相等,但=和!=两边必须是相同类型的值,否则会产生错误,而且FreeMarker是精确比较,"x","x ","X"是不等的.其它的运行符可以作用于数字和日期,但不能作用于字符串,大部分的时候,使用gt等字母运算符代替>会有更好的效果,因为 FreeMarker会把>解释成FTL标签的结束字符,当然,也可以使用括号来避免这种情况,如:<#if (x>y)>
如何判断空值
1、判断某变量是否存在使用 “??” 用法为:variable??,如果该变量存在,返回true,否则返回false 例:为防止stus为空报错可以加上判断如下
2、缺失变量默认值使用 “!” 使用!要以指定一个默认值,当变量为空时显示默认值。例: ${name!''}表示如果name为空显示空字符串。如果是嵌套对象则建议使用()括起来。
<#if empList??>
2. <#list empList as emp>
3. <tr <#if emp_index%2 ==0 > style="background-color: gray" </#if>>
4. <td>${emp_index}</td>
5. <td>${emp.empno}</td>
6. <td <#if emp.ename == 'KING'> style="color: aqua" </#if>>${emp.ename}</td>
7. <td>${emp.job}</td>
8. <td>${emp.mgr!'无'}</td>
9. <td <#if emp.sal gte 2000.0> style="color: red" </#if>>${emp.sal}</td>
10. <td>${emp.comm!'0'}</td>
11. <td>${emp.deptno}</td>
12. </tr>
13. </#list>
14. </#if>
4 内置函数
内建函数语法格式: 变量+?+函数名称
1、内建函数获取某个集合的大小
${集合名?size}
2、内建函数日期格式化
显示年月日: ${today?date}
显示时分秒: ${today?time}
显示日期+时间:${today?datetime}
自定义格式化: ${today?string("yyyy年MM月")}
3、内建函数将json字符串转成对象
1. <#assign text="{'bank':'工商银行','account':'10101920201920212'}" />
2. <#assign data=text?eval />
3. 开户行:${data.bank} 账号:${data.account}
其中用到了 assign标签,assign的作用是定义一个变量。
页面
1. 员工人数:${empList?size}
2. <table id="empTable" cellpadding="0px" cellspacing="0px">
3. <tr>
4. <th>索引</th>
5. <th>工号</th>
6. <th>姓名</th>
7. <th>岗位</th>
8. <th>上级</th>
9. <th>入职日期a</th>
10. <th>入职日期b</th>
11. <th>入职日期c</th>
12. <th>入职日期d</th>
13. <th>薪资</th>
14. <th>补助</th>
15. <th>部门号</th>
16. </tr>
17. <#if empList??>
18. <#list empList as emp>
19. <tr <#if emp_index%2 ==0 > style="background-color: gray" </#if>>
20. <td>${emp_index}</td>
21. <td>${emp.empno}</td>
22. <td <#if emp.ename == 'KING'> style="color: aqua" </#if>>${emp.ename}</td>
23. <td>${emp.job}</td>
24. <td>${emp.mgr!'无'}</td>
25. <td>${emp.hiredate?date}</td>
26. <td>${emp.hiredate?time}</td>
27. <td>${emp.hiredate?datetime}</td>
28. <td>${emp.hiredate?string("yyyy年MM月dd日")}</td>
29. <td <#if emp.sal gte 2000.0> style="color: red" </#if>>${emp.sal}</td>
30. <td>${emp.comm!'0'}</td>
31. <td>${emp.deptno}</td>
32. </tr>
33. </#list>
34. </#if>
35.
36. </table>
更多内置函数FreeMarker内置函数的用法_WO木子的博客-CSDN博客_freemarker lower_case
12_SpringBoot_整合Thymeleaf(掌握)
Thymeleaf的主要目标是将优雅的自然模板带到开发工作流程中,并将HTML在浏览器中正确显示,并且可以作为静态原型,让开发团队能更容易地协作。Thymeleaf能够处理HTML,XML,JavaScript,CSS甚至纯文本。
长期以来,jsp在视图领域有非常重要的地位,随着时间的变迁,出现了一位新的挑战者:Thymeleaf,Thy