SpringBoot开发常用技术整合

文章目录

  • SpringBoot开发常用技术整合
    • 第一章:基础介绍
      • 1-1 简介说明
    • 第二章:构建springboot工程
      • 2-1 首个项目
      • 2-2 使用Spring官方STS搭建SpringBoot工程
    • 第三章 springboot接口返回json
      • 3-1 SpringBoot 构造并且返回一个json对象
      • 3-2 Jackson的基本演绎法
    • 第四章 springboot热部署
      • 4-1 SpringBoot 使用devtools进行热部署
    • 第五章 springboot资源属性配置
      • 5-1 SpringBoot 资源文件属性配置
      • 5-2 SpringBoot 资源文件配置server以及tomcat
    • 第六章 springboot整合模板引擎
      • 6-1 SpringBoot 整合freemarker
      • 6-2 SpringBoot 整合thymeleaf
      • 6-3 thymeleaf 常用标签的使用方法
    • 第七章 springboot异常处理
      • 7-1 SpringBoot配置全局的异常捕获
    • 第八章 springboot整合MyBatis
      • 8-1 整合MyBatis - 使用generatorConfig生成mapper以及pojo
      • 8-2 整合MyBatis - 实现基于mybatis的CRUD功能
      • 8-3 整合MyBatis - 使用pagehelper实现分页
      • 8-4 整合MyBatis - 自定义mapper的实现
      • 8-5 整合MyBatis - 引入事务执行回滚
    • 第九章 springboot整合redis
      • 9-1 springboot整合缓存Redis
    • 第十章 springboot整合定时任务
      • 10-1 springboot整合定时任务task
    • 第十一章 springboot整合异步任务以及使用场景
      • 11-1 springboot整合异步任务以及使用场景
    • 第十二章 springboot中如何使用拦截器
      • 12-1 springboot中如何使用拦截器

SpringBoot开发常用技术整合

第一章:基础介绍

1-1 简介说明

SpringBoot简介

  • 微框架,与Spring4一起诞生,比如@RestController
  • 可以快速上手,整合了一些子项目(开源框架或者第三方开源库)
  • 可以依赖很少的配置就可以十分快速的搭建并且运行项目

SpringBoot特点

  • Spring全家桶的一员:基于Spring,使开发者快速入门,门槛很低
  • SpringBoot可以创建独立运行的应用而不依赖于容器
  • 不需要打成war包,可以放入tomcat中直接运行
  • 提供maven极简配置,缺点就是会引入很多不需要的包
  • 根据项目来依赖,从而配置Spring,需要什么引用什么
  • 提供可视化的相关功能,方便监控,比如性能、应用的健康程度等
  • 简化配置,不用再看过多的xml,使用注解进行配置
  • 为微服务SpringCloud铺路,SpringBoot可以整合很多框架来构建微服务,比如Dubbo、Thrift等

SpringBoot使用场景

  • 有Spring的地方都可以使用SpringBoot
  • JavaWeb项目:JavaEE项目等
  • 微服务:SpringCloud微服务开发的基础

第二章:构建springboot工程

2-1 首个项目

Spring官方提供的项目骨架生成地址

http://start.spring.io/

https://spring.io/

代码编写

1.创建名为boot-start的maven项目pom文件如下



    4.0.0

    com.myimooc
    boot-start
    0.0.1-SNAPSHOT
    jar

    boot-start
    Demo project for Spring Boot

    
        org.springframework.boot
        spring-boot-starter-parent
        2.0.1.RELEASE
         
    

    
        UTF-8
        UTF-8
        1.8
    

    
        
            org.springframework.boot
            spring-boot-starter
        
        
            org.springframework.boot
            spring-boot-starter-web
        

        
        
            org.springframework.boot
            spring-boot-devtools
            
            true
        

        
        
            org.springframework.boot
            spring-boot-configuration-processor
        

        
        
            org.springframework.boot
            spring-boot-starter-freemarker
        
        
        
            org.springframework.boot
            spring-boot-starter-thymeleaf
        

        
            
            
            
        
        
            mysql
            mysql-connector-java
            5.1.41
        
        
        
            org.mybatis.spring.boot
            mybatis-spring-boot-starter
            1.3.1
        
        
        
            tk.mybatis
            mapper-spring-boot-starter
            1.2.4
        
        
        
            com.github.pagehelper
            pagehelper-spring-boot-starter
            1.2.3
        
        
            
            
            
        
        
            org.mybatis.generator
            mybatis-generator-core
            1.3.2
            compile
            true
        

        
        
            org.springframework.boot
            spring-boot-starter-data-redis
        
        
            org.apache.commons
            commons-pool2
            2.5.0
        

        
            org.springframework.boot
            spring-boot-starter-aop
        

        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    

2.编写BootStartApplication类

package com.myimooc.boot.start;

import org.n3r.idworker.Sid;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import tk.mybatis.spring.annotation.MapperScan;

/**
 * 
* 标题: 启动类
* 描述: 首个SpringBoot项目
* 使用 @EnableScheduling 开启支持定时任务 * 使用 @EnableAsync 开启异步执行程序 * @author zc * @date 2018/04/19 */ @SpringBootApplication @MapperScan("com.myimooc.boot.start.dao.mapper") @EnableScheduling @EnableAsync public class BootStartApplication { public static void main(String[] args) { SpringApplication.run(BootStartApplication.class, args); } @Bean public Sid sid() { return new Sid(); } } 3.编写HelloController类 package com.myimooc.boot.start.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; /** *
* 标题: 基于REST的Controller
* 描述: 直接返回方法的响应内容
* * @author zc * @date 2018/04/19 */ @RestController public class HelloController { @GetMapping("/hello") public Object hello(){ return "Hello SpringBoot!"; } }

然后启动BootStartApplication,访问http://localhost:8080/hello

2-2 使用Spring官方STS搭建SpringBoot工程

spring Initializr方式生成SpringBoot工程

第三章 springboot接口返回json

3-1 SpringBoot 构造并且返回一个json对象

通常一个应用都会有一个统一的响应对象,用于封装响应状态、响应消息、响应数据等,并提供一些常用静态方法

代码编写

1.编写JsonResult类

package com.myimooc.boot.start.domain;

import java.io.Serializable;

/**
 * 
* 标题: 自定义JSON响应数据结构
* 描述: 统一请求响应返回的格式
* 200 成功 * 500 错误,错误信息在msg字段中 * 501 Bean验证错误信息,以map返回 * 502 拦截器拦截到用户token出错 * 555:抛出异常信息 * @author zc * @date 2018/04/19 */ public class JsonResult implements Serializable{ private static final long serialVersionUID = 4997293587553904193L; /** * 响应状态 */ private Integer status; /** * 响应消息 */ private String msg; /** * 响应数据 */ private Object data; public static JsonResult build(Integer status,String msg,Object data){ return new JsonResult(status,msg,data); } public static JsonResult ok(Object data){ return new JsonResult(200,"ok",data); } public static JsonResult ok(){ return JsonResult.ok(null); } public static JsonResult errMsg(String msg){ return new JsonResult(500,msg,null); } public static JsonResult errMap(Object data){ return new JsonResult(501,"error",data); } public static JsonResult errTokenMsg(String msg){ return new JsonResult(502,msg,null); } public static JsonResult errException(String msg){ return new JsonResult(555,msg,null); } public JsonResult() { } public JsonResult(Integer status, String msg, Object data) { this.status = status; this.msg = msg; this.data = data; } @Override public String toString() { return "JsonResult{" + "status=" + status + ", msg='" + msg + '\'' + ", data=" + data + '}'; } public Integer getStatus() { return status; } public void setStatus(Integer status) { this.status = status; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } }

2.编写User类

package com.myimooc.boot.start.domain;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;

import java.io.Serializable;
import java.util.Date;

/**
 * 
* 标题: POJO类
* 描述: 用户信息
* * @author zc * @date 2018/04/19 */ public class User implements Serializable { private static final long serialVersionUID = 7332961063564924222L; /** * 名称 */ private String name; /** * 密码,使用 @JsonIgnore 注解,在序列化为 JSON 时,忽略该字段 */ @JsonIgnore private String password; /** * 年龄 */ private Integer age; /** * 生日,使用 @JsonFormat 注解,在序列化为 JSON 时,使用 pattern 属性指定的值格式化日期时间 */ @JsonFormat(pattern = "yyyy-MM-dd",locale = "zh",timezone = "GMT+8") private Date birthday; /** * 描述,使用 @JsonInclude 注解,在序列化为 JSON 时,当字段为 null 时,则忽略该字段 */ @JsonInclude(JsonInclude.Include.NON_NULL) private String note; @Override public String toString() { return "User{" + "name='" + name + '\'' + ", password='" + password + '\'' + ", age=" + age + ", birthday=" + birthday + ", note='" + note + '\'' + '}'; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getNote() { return note; } public void setNote(String note) { this.note = note; } }

3.编写UserController类

package com.myimooc.boot.start.controller;

import com.myimooc.boot.start.domain.JsonResult;
import com.myimooc.boot.start.domain.User;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;

/**
 * 
* 标题: 使用Controller
* 描述: 返回JSON数据
* * @author zc * @date 2018/04/19 */ @RestController @RequestMapping("/user") public class UserController { @GetMapping("/getUser") public User getUser(){ User user = new User(); user.setName("myImooc2"); user.setPassword("myImooc"); user.setAge(22); user.setBirthday(new Date()); user.setNote("Hello"); return user; } @GetMapping("/getUserJson") public JsonResult getUserJson(){ User user = new User(); user.setName("myImooc2"); user.setPassword("myImooc"); user.setAge(22); user.setBirthday(new Date()); user.setNote("Hello"); return JsonResult.ok(user); } }

3-2 Jackson的基本演绎法

@JsonIgnore
private String password;
@JsonFormat(pattern="yyyy-MM-dd hh:mm:ss a", locale="zh", timezone="GMT+8")
private Date birthday;
@JsonInclude(Include.NON_NULL)
private String desc;

@JsonIgnore:忽略不显示给前端
@JsonFormat(pattern=“yyyy-MM-dd hh:mm:ss a”, locale=“zh”, timezone=“GMT+8”):日期显示格式
@JsonInclude(Include.NON_NULL):当数据为空时不会显示给前端

第四章 springboot热部署

4-1 SpringBoot 使用devtools进行热部署

springboot使用devtools进行热部署









	org.springframework.boot
	spring-boot-devtools
	
	true

application.properties热部署配置

#关闭缓存,即时刷新
#spring.freemarker.cache=false
#spring.thymeleaf.cache=false

#热部署生效
spring.devtools.restart.enabled=true

#设置重启的目录,添加那个目录的文件需要restart
spring.devtools.restart.additional-paths=src/main/java

#为mybatis设置,生产环境可删除
#restart.include.mapper=/mapper-[\\w-\\.]+jar
#restart.include.pagehelper=/pagehelper-[\\w-\\.]+jar

#排除那个目录的文件不需要restart
spring.devtools.restart.exclude=static/**,public/**,WEB-INF/**

第五章 springboot资源属性配置

5-1 SpringBoot 资源文件属性配置

资源文件中的属性配置与映射到实体类



	org.springframework.boot
	spring-boot-configuration-processor
	true

resource.properties配置文件

com.imooc.opensource.name=imooc
com.imooc.opensource.website=www.imooc.com
com.imooc.opensource.language=java

Resource.class

@Configuration //会引用资源文件
@ConfigurationProperties(prefix="com.imooc.opensource") //前缀
@PropertySource(value="classpath:resource.properties") //资源文件路径
public class Resource {
	private String name;
	private String website;
	private String language;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getWebsite() {
		return website;
	}
	public void setWebsite(String website) {
		this.website = website;
	}
	public String getLanguage() {
		return language;
	}
	public void setLanguage(String language) {
		this.language = language;
	}
}

@Configuration //会引用资源文件
@ConfigurationProperties(prefix=“com.imooc.opensource”) //前缀
@PropertySource(value=“classpath:resource.properties”) //资源文件路径

5-2 SpringBoot 资源文件配置server以及tomcat

资源文件中配置tomcat相关属性

application.properties配置

############################################################
#
# Server 服务端相关配置
#
############################################################
#配置api端口号
#server.port=8088
#配置context-path,一般来说这个配置在正式发布的时候不配置
#server.context-path=/IMooc
#错误页,指定发生错误时,跳转的URL --> BasicErrorController
#server.error.path=/error
#session最大超时时间(分钟),默认为30分钟
server.session-timeout=60
#该服务绑定IP地址,启动服务器时如本机不是该IP地址则抛出异常启动失败
#只有特殊需求的情况下才配置,具体根据各自的业务来设置
#server.address=192.168.1.2

Server - tomcat 相关常用配置

############################################################
# Server - tomcat 相关常用配置
############################################################
#tomcat最大线程数,默认为200
#server.tomcat.max-threads=250
#tomcat的URI编码
server.tomcat.uri-encoding=UTF-8
#存放Tomcat的日志、Dump等文件的临时文件夹,默认为系统的tmp文件夹
#(如: C:\Users\Shanhy\AppData\Local\Temp)
#server.tomcat.basedir=H:/springboot-tomcat-tmp
#打开Tomcat的Access日志,并可以设置日志格式的方法:
#server.tomcat.access-log-enabled=true
#server.tomcat.access-log-pattern=
#accesslog目录,默认在basedir/logs
#server.tomcat.accesslog.directory=
#日志文件目录
#logging.path=H:/springboot-tomcat-tmp
#日志文件名称,默认为spring.log
#logging.file=myapp.log

第六章 springboot整合模板引擎

6-1 SpringBoot 整合freemarker



	org.springframework.boot
	spring-boot-starter-freemarker

application.properties配置

############################################################
#
# freemarker 静态资源配置
#
############################################################
#设定ftl文件路径
spring.freemarker.template-loader-path=classpath:/templates
#关闭缓存,及时刷新,上线生产环境需要改为true
spring.freemarker.cache=false
spring.freemarker.charset=UTF-8
spring.freemarker.check-template-location=true
spring.freemarker.content-type=text/html
spring.freemarker.expose-request-attributes=true
spring.freemarker.expose-session-attributes=true
spring.freemarker.request-context-attribute=request
#后缀
spring.freemarker.suffix=.ftl

SpringBoot开发常用技术整合_第1张图片

center.ftl




    
    


FreeMarker模板引擎

center page

index.ftl




    
    


FreeMarker模板引擎

${resource.name}

${resource.website}

${resource.language}

FreemarkerController

@Controller
@RequestMapping("ftl")
public class FreemarkerController {

	@Autowired
	private Resource resource;
	
	@RequestMapping("/index")
    public String index(ModelMap map) {
        map.addAttribute("resource", resource);
        return "freemarker/index";
    }
	
	@RequestMapping("center")
    public String center() {
        return "freemarker/center/center";
    }
}

6-2 SpringBoot 整合thymeleaf

1.修改pom引入依赖



	org.springframework.boot
	spring-boot-starter-thymeleaf

2.修改application.properties

############################################################
#
# Thymeleaf 静态资源配置
#
############################################################
spring.thymeleaf.prefix=classpath:/templates/
# 关闭缓存,即时刷新,生产环境需改为true
spring.thymeleaf.cache=false
spring.thymeleaf.suffix=.html
spring.thymeleaf.mode=HTML5
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.content-type=text/html

SpringBoot开发常用技术整合_第2张图片
index.html




    
    


Thymeleaf模板引擎

hello world~~~~~~~

ThymeleafController.java

@Controller
@RequestMapping("th")
public class ThymeleafController {

	@RequestMapping("/index")
    public String index(ModelMap map) {
        map.addAttribute("name", "thymeleaf-imooc");
        return "thymeleaf/index";
    }
	
	@RequestMapping("center")
    public String center() {
        return "thymeleaf/center/center";
    }
	
	@RequestMapping("test")
    public String test(ModelMap map) {
		
		User u = new User();
		u.setName("superadmin");
		u.setAge(10);
		u.setPassword("123465");
		u.setBirthday(new Date());
		u.setDesc("hello imooc");
		
		map.addAttribute("user", u);
		
		User u1 = new User();
		u1.setAge(19);
		u1.setName("imooc");
		u1.setPassword("123456");
		u1.setBirthday(new Date());
		
		User u2 = new User();
		u2.setAge(17);
		u2.setName("LeeCX");
		u2.setPassword("123456");
		u2.setBirthday(new Date());
		
		List userList = new ArrayList<>();
		userList.add(u);
		userList.add(u1);
		userList.add(u2);
		
		map.addAttribute("userList", userList);
		
        return "thymeleaf/test";
    }
	
	@PostMapping("postform")
    public String postform(User u) {
		
		System.out.println("姓名:" + u.getName());
		System.out.println("年龄:" + u.getAge());
		
        return "redirect:/th/test";
    }
	
	@RequestMapping("showerror")
    public String showerror(User u) {
		
		int a = 1 / 0;
		
        return "redirect:/th/test";
    }
}

6-3 thymeleaf 常用标签的使用方法

application.properties配置

############################################################
#
#配置i18n资源文件,供thymeleaf读取
#
############################################################
#路径
spring.messages.basename=i18n/messages
#缓存时间
spring.messages.cache-seconds=3600
spring.messages.encoding=UTF-8

SpringBoot开发常用技术整合_第3张图片
messages.properties配置

############################################################
#
#用户自定义权限
#
############################################################
roles.manager=manager
roles.superadmin=superadmin
  • 基本使用方式
  • 对象引用方式
  • 时间类型转化
  • text与utext
  • URL
  • 引入静态资源文件js/css
  • 条件判断th:if
  • th:unless与th:if
  • 循环th:each
  • text与utext
  • th:switch与th:case
  • th:object
  • th:field
  • th:href
  • th:selected
  • th:each

第七章 springboot异常处理

7-1 SpringBoot配置全局的异常捕获

  • 页面跳转形式
  • ajax形式
  • 统一返回异常的形式

异常助手类:IMoocExceptionHandler.java

@ControllerAdvice
public class IMoocExceptionHandler {

	public static final String IMOOC_ERROR_VIEW = "error";

//	@ExceptionHandler(value = Exception.class)
//    public Object errorHandler(HttpServletRequest reqest, 
//    		HttpServletResponse response, Exception e) throws Exception {
//    	
//    	e.printStackTrace();
//    	
//		ModelAndView mav = new ModelAndView();
//        mav.addObject("exception", e);
//        mav.addObject("url", reqest.getRequestURL());
//        mav.setViewName(IMOOC_ERROR_VIEW);
//        return mav;
//    }
	
	@ExceptionHandler(value = Exception.class)
    public Object errorHandler(HttpServletRequest reqest, 
    		HttpServletResponse response, Exception e) throws Exception {
    	
    	e.printStackTrace();
    	
    	if (isAjax(reqest)) {
    		return IMoocJSONResult.errorException(e.getMessage());
    	} else {
    		ModelAndView mav = new ModelAndView();
            mav.addObject("exception", e);
            mav.addObject("url", reqest.getRequestURL());
            mav.setViewName(IMOOC_ERROR_VIEW);
            return mav;
    	}
    }
	
	/**
	 * 
	 * @Title: IMoocExceptionHandler.java
	 * @Package com.imooc.exception
	 * @Description: 判断是否是ajax请求
	 * Copyright: Copyright (c) 2017
	 * Company:FURUIBOKE.SCIENCE.AND.TECHNOLOGY
	 * 
	 * @author leechenxiang
	 * @date 2017年12月3日 下午1:40:39
	 * @version V1.0
	 */
	public static boolean isAjax(HttpServletRequest httpRequest){
		return  (httpRequest.getHeader("X-Requested-With") != null  
					&& "XMLHttpRequest"
						.equals( httpRequest.getHeader("X-Requested-With").toString()) );
	}
}

SpringBoot开发常用技术整合_第4张图片
error.html




    
    捕获全局异常


    

发生错误:

第八章 springboot整合MyBatis

  • 使用generatorConfig生成mapper以及pojo
  • 实现基于mybatis的CRUD功能
  • 整合mybatis-pagehelper实现分页
  • 自定义mapper的实现
  • mybatis-spring-boot的一套开源框架
    https://github.com/abel533/MyBatis-Spring-Boot

8-1 整合MyBatis - 使用generatorConfig生成mapper以及pojo

1. pom.xml引入依赖


	com.alibaba
	druid
	1.1.0



	mysql
	mysql-connector-java
	5.1.41




    org.mybatis.spring.boot
    mybatis-spring-boot-starter
    1.3.1



    tk.mybatis
    mapper-spring-boot-starter
    1.2.4



    com.github.pagehelper
    pagehelper-spring-boot-starter
    1.2.3



	com.alibaba
	druid-spring-boot-starter
	1.1.9



	org.mybatis.generator
	mybatis-generator-core
	1.3.2
	compile
	true

2. application.properties配置

############################################################
#
#配置数据源相关 使用阿里巴巴的druid数据源
#
############################################################
spring.datasource.url=jdbc:mysql://localhost:3306/leecx
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.druid.initial-size=1
spring.datasource.druid.min-idle=1
spring.datasource.druid.max-active=20
spring.datasource.druid.test-on-borrow=true
spring.datasource.druid.stat-view-servlet.allow=true
############################################################
#
# mybatis 配置
#
############################################################
# 定义 mybatis 的pojo类
mybatis.type-aliases-package=com.imooc.pojo
#定义mapper
mybatis.mapper-locations=classpath:mapper/*.xml
# 通用Mapper配置
mapper.mappers=com.imooc.utils.MyMapper
mapper.not-empty=false
mapper.identity=MYSQL
# 分页插件配置
pagehelper.helperDialect=mysql
pagehelper.reasonable=true
pagehelper.supportMethodsArguments=true
pagehelper.params=count=countSql

3. generatorConfig.xml





    
        
        

        
            
        

        
        

        
        

		
        

		
        

		
		

4. 反编译方法GeneratorDisplay.java
public class GeneratorDisplay {

public void generator() throws Exception{

	List warnings = new ArrayList();
	boolean overwrite = true;
	//指定 逆向工程配置文件
	File configFile = new File("generatorConfig.xml"); 
	ConfigurationParser cp = new ConfigurationParser(warnings);
	Configuration config = cp.parseConfiguration(configFile);
	DefaultShellCallback callback = new DefaultShellCallback(overwrite);
	MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,
			callback, warnings);
	myBatisGenerator.generate(null);

} 

public static void main(String[] args) throws Exception {
	try {
		GeneratorDisplay generatorSqlmap = new GeneratorDisplay();
		generatorSqlmap.generator();
	} catch (Exception e) {
		e.printStackTrace();
	}
	
}

}
5. 右键执行GeneratorDisplay.java中的main即可生成mapper以及pojo

8-2 整合MyBatis - 实现基于mybatis的CRUD功能

ImoocApplication.java添加

//扫描 mybatis mapper 包路径
@MapperScan(basePackages = "com.imooc.mapper")

sid:保证生成的id是唯一的
SpringBoot开发常用技术整合_第5张图片
ImoocApplication.java中添加包扫描注解

//扫描 所有需要的包, 包含一些自用的工具类包 所在的路径
@ComponentScan(basePackages= {"com.imooc", "org.n3r.idworker"})

8-3 整合MyBatis - 使用pagehelper实现分页

// 开始分页
PageHelper.startPage(page, pageSize);

8-4 整合MyBatis - 自定义mapper的实现

8-5 整合MyBatis - 引入事务执行回滚

//有事务就用已有事务,没事务就新建事务使用。经常用于增删改操作中
@Transactional(propagation = Propagation.REQUIRED)
//有事务就用已有事务,没事务就不用事务,经常用于查操作中
@Transactional(propagation = Propagation.SUPPORTS)

第九章 springboot整合redis

9-1 springboot整合缓存Redis

pom.xml中引入redis依赖



	org.springframework.boot
	spring-boot-starter-data-redis

application.properties配置

############################################################
#
# REDIS 配置
#
############################################################
# Redis数据库索引(默认为0)
spring.redis.database=1
# Redis服务器地址
spring.redis.host=192.168.1.191
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=1000
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
# 连接池中的最大空闲连接
spring.redis.pool.max-idle=10
# 连接值中的最小空闲连接
spring.redis.pool.min-idle=2
# 连接超时时间(毫秒)
spring.redis.timeout=0

编写JsonUtils类

/**
 * 
 * @Title: JsonUtils.java
 * @Package com.lee.utils
 * @Description: 自定义响应结构, 转换类
 * Copyright: Copyright (c) 2016
 * Company:Nathan.Lee.Salvatore
 * 
 * @author leechenxiang
 * @date 2016年4月29日 下午11:05:03
 * @version V1.0
 */
public class JsonUtils {

    // 定义jackson对象
    private static final ObjectMapper MAPPER = new ObjectMapper();

    /**
     * 将对象转换成json字符串。
     * 

Title: pojoToJson

*

Description:

* @param data * @return */ public static String objectToJson(Object data) { try { String string = MAPPER.writeValueAsString(data); return string; } catch (JsonProcessingException e) { e.printStackTrace(); } return null; } /** * 将json结果集转化为对象 * * @param jsonData json数据 * @return */ public static T jsonToPojo(String jsonData, Class beanType) { try { T t = MAPPER.readValue(jsonData, beanType); return t; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 将json数据转换成pojo对象list *

Title: jsonToList

*

Description:

* @param jsonData * @param beanType * @return */ public static List jsonToList(String jsonData, Class beanType) { JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, beanType); try { List list = MAPPER.readValue(jsonData, javaType); return list; } catch (Exception e) { e.printStackTrace(); } return null; } }

编写RedisOperator类

/**
 * 
 * @Title: Redis 常用方法封装
 * @Package com.itzixi.web.component
 * @Description: 使用redisTemplate的操作实现类 
 * 
 * @author leechenxiang
 * @date 2017年9月29日 下午2:25:03
 * @version V1.0
 */
@Component
public class RedisOperator {
	
//	@Autowired
//    private RedisTemplate redisTemplate;
	
	@Autowired
	private StringRedisTemplate redisTemplate;
	
	// Key(键),简单的key-value操作

	/**
	 * 实现命令:TTL key,以秒为单位,返回给定 key的剩余生存时间(TTL, time to live)。
	 * 
	 * @param key
	 * @return
	 */
	public long ttl(String key) {
		return redisTemplate.getExpire(key);
	}
	
	/**
	 * 实现命令:expire 设置过期时间,单位秒
	 * 
	 * @param key
	 * @return
	 */
	public void expire(String key, long timeout) {
		redisTemplate.expire(key, timeout, TimeUnit.SECONDS);
	}
	
	/**
	 * 实现命令:INCR key,增加key一次
	 * 
	 * @param key
	 * @return
	 */
	public long incr(String key, long delta) {
		return redisTemplate.opsForValue().increment(key, delta);
	}

	/**
	 * 实现命令:KEYS pattern,查找所有符合给定模式 pattern的 key
	 */
	public Set keys(String pattern) {
		return redisTemplate.keys(pattern);
	}

	/**
	 * 实现命令:DEL key,删除一个key
	 * 
	 * @param key
	 */
	public void del(String key) {
		redisTemplate.delete(key);
	}

	// String(字符串)

	/**
	 * 实现命令:SET key value,设置一个key-value(将字符串值 value关联到 key)
	 * 
	 * @param key
	 * @param value
	 */
	public void set(String key, String value) {
		redisTemplate.opsForValue().set(key, value);
	}

	/**
	 * 实现命令:SET key value EX seconds,设置key-value和超时时间(秒)
	 * 
	 * @param key
	 * @param value
	 * @param timeout
	 *            (以秒为单位)
	 */
	public void set(String key, String value, long timeout) {
		redisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS);
	}

	/**
	 * 实现命令:GET key,返回 key所关联的字符串值。
	 * 
	 * @param key
	 * @return value
	 */
	public String get(String key) {
		return (String)redisTemplate.opsForValue().get(key);
	}

	// Hash(哈希表)

	/**
	 * 实现命令:HSET key field value,将哈希表 key中的域 field的值设为 value
	 * 
	 * @param key
	 * @param field
	 * @param value
	 */
	public void hset(String key, String field, Object value) {
		redisTemplate.opsForHash().put(key, field, value);
	}

	/**
	 * 实现命令:HGET key field,返回哈希表 key中给定域 field的值
	 * 
	 * @param key
	 * @param field
	 * @return
	 */
	public String hget(String key, String field) {
		return (String) redisTemplate.opsForHash().get(key, field);
	}

	/**
	 * 实现命令:HDEL key field [field ...],删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。
	 * 
	 * @param key
	 * @param fields
	 */
	public void hdel(String key, Object... fields) {
		redisTemplate.opsForHash().delete(key, fields);
	}

	/**
	 * 实现命令:HGETALL key,返回哈希表 key中,所有的域和值。
	 * 
	 * @param key
	 * @return
	 */
	public Map hgetall(String key) {
		return redisTemplate.opsForHash().entries(key);
	}

	// List(列表)

	/**
	 * 实现命令:LPUSH key value,将一个值 value插入到列表 key的表头
	 * 
	 * @param key
	 * @param value
	 * @return 执行 LPUSH命令后,列表的长度。
	 */
	public long lpush(String key, String value) {
		return redisTemplate.opsForList().leftPush(key, value);
	}

	/**
	 * 实现命令:LPOP key,移除并返回列表 key的头元素。
	 * 
	 * @param key
	 * @return 列表key的头元素。
	 */
	public String lpop(String key) {
		return (String)redisTemplate.opsForList().leftPop(key);
	}

	/**
	 * 实现命令:RPUSH key value,将一个值 value插入到列表 key的表尾(最右边)。
	 * 
	 * @param key
	 * @param value
	 * @return 执行 LPUSH命令后,列表的长度。
	 */
	public long rpush(String key, String value) {
		return redisTemplate.opsForList().rightPush(key, value);
	}

}

编写RedisController类

@RestController
@RequestMapping("redis")
public class RedisController {
	
	@Autowired
	private StringRedisTemplate strRedis;
	
	@Autowired
	private RedisOperator redis;
	
	@RequestMapping("/test")
	public IMoocJSONResult test() {
		
		strRedis.opsForValue().set("imooc-cache", "hello 慕课网~~~~~~");
		
		SysUser user = new SysUser();
		user.setId("100111");
		user.setUsername("imooc");
		user.setPassword("abc123");
		user.setIsDelete(0);
		user.setRegistTime(new Date());
		strRedis.opsForValue().set("json:user", JsonUtils.objectToJson(user));
		
		SysUser jsonUser = JsonUtils.jsonToPojo(strRedis.opsForValue().get("json:user"), SysUser.class);
		
		return IMoocJSONResult.ok(jsonUser);
	}
	
	@RequestMapping("/getJsonList")
	public IMoocJSONResult getJsonList() {
		
		User user = new User();
		user.setAge(18);
		user.setName("慕课网");
		user.setPassword("123456");
		user.setBirthday(new Date());
		
		User u1 = new User();
		u1.setAge(19);
		u1.setName("imooc");
		u1.setPassword("123456");
		u1.setBirthday(new Date());
		
		User u2 = new User();
		u2.setAge(17);
		u2.setName("hello imooc");
		u2.setPassword("123456");
		u2.setBirthday(new Date());
		
		List userList = new ArrayList<>();
		userList.add(user);
		userList.add(u1);
		userList.add(u2);
		
		redis.set("json:info:userlist", JsonUtils.objectToJson(userList), 2000);
		
		String userListJson = redis.get("json:info:userlist");
		List userListBorn = JsonUtils.jsonToList(userListJson, User.class);
		
		return IMoocJSONResult.ok(userListBorn);
	}
}

第十章 springboot整合定时任务

10-1 springboot整合定时任务task

1. 修改BootStartApplication启动类,增加注解

//开启定时任务
@EnableScheduling

2. 编写TestTask类

@Component
public class TestTask {

	private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

	// 定义每过3秒执行任务
//    @Scheduled(fixedRate = 3000)
      @Scheduled(cron = "4-40 * * * * ?")
    public void reportCurrentTime() {
        System.out.println("现在时间:" + dateFormat.format(new Date()));
    }
}

cron表达式地址:http://cron.qqe2.com
springboot定时任务支持6位,不支持年

第十一章 springboot整合异步任务以及使用场景

11-1 springboot整合异步任务以及使用场景

异步任务使用场景

  • 发送短信
  • 发送邮件
  • APP消息推送
  • 提高效率

代码编写
1.修改BootStartApplication启动类,增加注解

//开启异步调用方法
@EnableAsync

2.编写AsyncTask类
定义@Component @Async作为组件被容器扫面执行

/**
 * 
* 标题: 自定义异步执行任务
* 描述: 异步方法需使用 @Async 注解
* 判断任务是否完成,必须返回 Future 接口 * @author zc * @date 2018/04/26 */ @Component public class AsyncTask { @Async public Future doTask11() throws Exception { long start = System.currentTimeMillis(); Thread.sleep(1000); long end = System.currentTimeMillis(); System.out.println("任务1耗时:" + (end - start) + "毫秒"); return new AsyncResult<>(true); } @Async public Future doTask22() throws Exception { long start = System.currentTimeMillis(); Thread.sleep(700); long end = System.currentTimeMillis(); System.out.println("任务2耗时:" + (end - start) + "毫秒"); return new AsyncResult<>(true); } @Async public Future doTask33() throws Exception { long start = System.currentTimeMillis(); Thread.sleep(600); long end = System.currentTimeMillis(); System.out.println("任务3耗时:" + (end - start) + "毫秒"); return new AsyncResult<>(true); } }

3.编写DoTaskController类
调用异步任务

@RestController
@RequestMapping("tasks")
public class DoTaskController {
	
	@Autowired
    private AsyncTask asyncTask;
	
    @RequestMapping("test1")
    public String test1() throws Exception {
    	
    	long start = System.currentTimeMillis();
    	
    	Future a = asyncTask.doTask11();
    	Future b = asyncTask.doTask22();
    	Future c = asyncTask.doTask33();
    	
    	while (!a.isDone() || !b.isDone() || !c.isDone()) {
    		if (a.isDone() && b.isDone() && c.isDone()) {
    			break;
    		}
    	}
    	
    	long end = System.currentTimeMillis();
    	
    	String times = "任务全部完成,总耗时:" + (end - start) + "毫秒";
    	System.out.println(times);
    	
    	return times;
    }
}

第十二章 springboot中如何使用拦截器

12-1 springboot中如何使用拦截器

  • 使用注解@Configuration配置拦截器
  • 继承WebMvcConfigurerAdapter
  • 重新addInterceptors增加需要的拦截器地址

代码编写

1.编写OneInterceptor类

/**
 * 
* 标题: 自定义拦截器一
* 描述: 拦截器
* * @author zc * @date 2018/04/26 */ public class OneInterceptor implements HandlerInterceptor { /** * 在请求处理之前进行调用(Controller方法调用之前) */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object) throws Exception { System.out.println("被one拦截,放行..."); return true; /*if (true) { returnErrorResponse(response, IMoocJSONResult.errorMsg("被one拦截...")); } return false;*/ } /** * 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后) */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object object, ModelAndView mv) throws Exception { // TODO Auto-generated method stub } /** * 在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行 * (主要是用于进行资源清理工作) */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object object, Exception ex) throws Exception { // TODO Auto-generated method stub } public void returnErrorResponse(HttpServletResponse response, IMoocJSONResult result) throws IOException, UnsupportedEncodingException { OutputStream out=null; try{ response.setCharacterEncoding("utf-8"); response.setContentType("text/json"); out = response.getOutputStream(); out.write(JsonUtils.objectToJson(result).getBytes("utf-8")); out.flush(); } finally{ if(out!=null){ out.close(); } } } }

2.编写TwoInterceptor类

/**
 * 
* 标题: 自定义拦截器二
* 描述: 拦截器
* * @author zc * @date 2018/04/26 */ public class TwoInterceptor implements HandlerInterceptor { final static Logger log = LoggerFactory.getLogger(TwoInterceptor.class); /** * 在请求处理之前进行调用(Controller方法调用之前) */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object) throws Exception { if (true) { returnErrorResponse(response, IMoocJSONResult.errorMsg("被two拦截...")); } System.out.println("被two拦截..."); return false; } /** * 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后) */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object object, ModelAndView mv) throws Exception { // TODO Auto-generated method stub } /** * 在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作) */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object object, Exception ex) throws Exception { // TODO Auto-generated method stub } public void returnErrorResponse(HttpServletResponse response, IMoocJSONResult result) throws IOException, UnsupportedEncodingException { OutputStream out=null; try{ response.setCharacterEncoding("utf-8"); response.setContentType("text/json"); out = response.getOutputStream(); out.write(JsonUtils.objectToJson(result).getBytes("utf-8")); out.flush(); } finally{ if(out!=null){ out.close(); } } } }

3.编写WebMvcConfig类

/**
 * 
* 标题: 自定义配置类
* 描述: 注册自定义的拦截器
* * @author zc * @date 2018/04/26 */ @Configuration public class WebMvcConfigurer extends WebMvcConfigurerAdapter { @Override public void addInterceptors(InterceptorRegistry registry) { /** * 拦截器按照顺序执行 * /two/**:接口/two里面的方法都可以被拦截 * /*/**:所有接口里面的方法都可以被拦截 */ registry.addInterceptor(new TwoInterceptor()).addPathPatterns("/two/**") .addPathPatterns("/one/**"); registry.addInterceptor(new OneInterceptor()).addPathPatterns("/one/**"); super.addInterceptors(registry); } }

点击查询源码

你可能感兴趣的:(SpringBoot)