9. springboot集成mybatis
9.1 引入依赖
<!--整合mybatis--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.2</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.12</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> </dependency> >说明:由于springboot整合mybatis版本中默认依赖mybatis 因此不需要额外引入mybati版本,否则会出现冲突
9.2 配置配置文件
spring: mvc: view: prefix: / suffix: .jsp datasource: type: org.apache.commons.dbcp.BasicDataSource #指定连接池类型 driver-class-name: com.mysql.jdbc.Driver #指定驱动 url: jdbc:mysql://localhost:3306/cmfz #指定url username: root #指定用户名 password: root #指定密码
9.3 加入mybatis配置
#配置文件中加入如下配置: mybatis: mapper-locations: classpath:com/libin/mapper/*.xml #指定mapper配置文件位置 type-aliases-package: com.libin.entity #指定起别名来的类
//入口类中加入如下配置: @SpringBootApplication @MapperScan("com.libin.dao") //必须在入口类中加入这个配置 public class Application { public static void main(String[] args) { SpringApplication.run(Application.class,args); } }
9.4 建表
CREATE TABLE `t_clazz` ( `id` varchar(40) NOT NULL, `name` varchar(80) DEFAULT NULL, `no` varchar(90) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
9.5 开发实体类
public class Clazz { private String id; private String name; private String no; //get set 方法省略.... }
9.6 开发DAO接口以及Mapper
public interface ClazzDAO { List<Clazz> findAll(); }
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.libin.dao.ClazzDAO"> <select id="findAll" resultType="Clazz"> select * from t_clazz </select> </mapper>
9.7 开发Service以及实现
//接口 public interface ClazzService { List<Clazz> findAll(); } //实现 @Service @Transactional public class ClazzServiceImpl implements ClazzService { @Autowired private ClazzDAO clazzDAO; @Transactional(propagation = Propagation.SUPPORTS) @Override public List<Clazz> findAll() { return clazzDAO.findAll(); } }
9.8 引入测试依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
9.9 编写测试类
@RunWith(SpringRunner.class) @SpringBootTest(classes = Application.class) public class TestClazzService { @Autowired private ClazzService clazzService; @Test public void test(){ List<Clazz> all = clazzService.findAll(); for (Clazz clazz : all) { System.out.println(clazz); } } }
10.开启jsp页面热部署
10.1 引言
在springboot中默认对jsp运行为生产模式,不允许修改内容保存后立即生效,因此在开发过程需要调试jsp页面每次需要重新启动服务器这样极大影响了我们的效率,为此springboot中提供了可以将默认的生产模式修改为调试模式,改为调试模式后就可以保存立即生效,如何配置为测试模式需要在配置文件中加入如下配置即可修改为开发模式。
10.2 配置开启测试模式
server: port: 8989 jsp-servlet: init-parameters: development: true #开启jsp页面的调试模式
11.springboot中devtools热部署
11.1 引言
为了进一步提高开发效率,springboot为我们提供了全局项目热部署,日后在开发过程中修改了部分代码以及相关配置文件后,不需要每次重启使修改生效,在项目中开启了springboot全局热部署之后只需要在修改之后等待几秒即可使修改生效。
11.2 开启热部署
11.2.1 项目中引入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency>
11.2.2 设置idea中支持自动编译
# 1.开启自动编译 Preferences | Build, Execution, Deployment | Compiler -> 勾选上 Build project automatically 这个选项 # 2.开启允许在运行过程中修改文件 ctrl + alt + shift + / ---->选择1.Registry ---> 勾选 compiler.automake.allow.when.app.running 这个选项
11.2.3 启动项目检测热部署是否生效
# 1.启动出现如下日志代表生效
2019-07-17 21:23:17.566 INFO 4496 --- [ restartedMain] com.libin.InitApplication : Starting InitApplication on chenyannandeMacBook-Pro.local with PID 4496 (/Users/chenyannan/IdeaProjects/ideacode/springboot_day1/target/classes started by chenyannan in /Users/chenyannan/IdeaProjects/ideacode/springboot_day1) 2019-07-17 21:23:17.567 INFO 4496 --- [ restartedMain] com.libin.InitApplication : The following profiles are active: dev 2019-07-17 21:23:17.612 INFO 4496 --- [ restartedMain] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@66d799c5: startup date [Wed Jul 17 21:23:17 CST 2019]; root of context hierarchy 2019-07-17 21:23:18.782 INFO 4496 --- [ restartedMain] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8989 (http) 2019-07-17 21:23:18.796 INFO 4496 --- [ restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2019-07-17 21:23:18.797 INFO 4496 --- [ restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.5.20
注意:日志出现restartedMain代表已经生效,在使用热部署时如果遇到修改之后不能生效,请重试重启项目在试
12. logback日志的集成
12.1 logback简介
Logback是由log4j创始人设计的又一个开源日志组件。目前,logback分为三个模块:logback-core,logback-classic和logback-access。是对log4j日志展示进一步改进
12.2 日志的级别
> DEBUG < INFO < WARN < ERROR > > 日志级别由低到高: 日志级别越高输出的日志信息越少
12.2 日志的级别
> DEBUG < INFO < WARN < ERROR > > 日志级别由低到高: 日志级别越高输出的日志信息越少
12.3 项目中日志分类
> 日志分为两类 > > 一种是rootLogger : 用来监听项目中所有的运行日志 包括引入依赖jar中的日志 > > 一种是logger : 用来监听项目中指定包中的日志信息
12.4 java项目中使用
12.4.1 logback配置文件
> logback的配置文件必须放在项目根目录中 且名字必须为logback.xml
<?xml version="1.0" encoding="UTF-8" ?> <configuration> <!--定义项目中日志输出位置--> <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"> <!--定义项目的日志输出格式--> <!--定义项目的日志输出格式--> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern> [%p] %d{yyyy-MM-dd HH:mm:ss} %m %n</pattern> </layout> </appender> <!--项目中跟日志控制--> <root level="INFO"> <appender-ref ref="stdout"/> </root> <!--项目中指定包日志控制--> <logger name="com.libin.dao" level="DEBUG"/> </configuration>
12.4.2 具体类中使用日志
@Controller @RequestMapping("user") public class UserController { private Logger logger = org.slf4j.LoggerFactory.getLogger(this.getClass()); @RequestMapping("findAll") public String findAll(String name) { logger.debug("debug接收的姓名是: "+name); logger.info("info接收的姓名是: "+name); logger.warn("warn接收的姓名是: "+name); logger.error("error接收的姓名是: "+name); return "index"; } }
12.4.3 使用默认日志配置
logging: level: root: debug com.libin.dao: debug path: /Users/chenyannan/aa.log file: bbb.log
13. 切面编程
13.1 引言
springboot是对原有项目中spring框架和springmvc的进一步封装,因此在springboot中同样支持spring框架中AOP切面编程,不过在springboot中为了快速开发仅仅提供了注解方式的切面编程.
13.2 使用
13.2.1 引入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
13.2.2 相关注解
/** @Aspect 用来类上,代表这个类是一个切面 @Before 用在方法上代表这个方法是一个前置通知方法 @After 用在方法上代表这个方法是一个后置通知方法 @Around 用在方法上代表这个方法是一个环绕的方法 @Around 用在方法上代表这个方法是一个环绕的方法 **/
13.2.3 前置切面
@Aspect @Component public class MyAspect { @Before("execution(* com.libin.service.*.*(..))") public void before(JoinPoint joinPoint){ System.out.println("前置通知"); joinPoint.getTarget();//目标对象 joinPoint.getSignature();//方法签名 joinPoint.getArgs();//方法参数 } }
13.2.4 后置切面
@Aspect @Component public class MyAspect { @After("execution(* com.libin.service.*.*(..))") public void before(JoinPoint joinPoint){ System.out.println("后置通知"); joinPoint.getTarget();//目标对象 joinPoint.getSignature();//方法签名 joinPoint.getArgs();//方法参数 } }
> **注意: 前置通知和后置通知都没有返回值,方法参数都为joinpoint**
13.2.5 环绕切面
@Aspect @Component public class MyAspect { @Around("execution(* com.libin.service.*.*(..))") public Object before(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { System.out.println("进入环绕通知"); proceedingJoinPoint.getTarget();//目标对象 proceedingJoinPoint.getSignature();//方法签名 proceedingJoinPoint.getArgs();//方法参数 Object proceed = proceedingJoinPoint.proceed();//放行执行目标方法 System.out.println("目标方法执行之后回到环绕通知"); return proceed;//返回目标方法返回值 } }
注意: 环绕通知存在返回值,参数为ProceedingJoinPoint,如果执行放行,不会执行目标方法,一旦放行必须将目标方法的返回值返回,否则调用者无法接受返回数据
14. 文件上传下载
14.1 文件上传
13.1.1 准备上传页面
<form action="路径...." method="post" enctype="multipart/form-data"> <input type="file" name="aa"> <input type="submit" value="上传"> </form> <!-- 1. 表单提交方式必须是post 2. 表单的enctype属性必须为multipart/form-data 3. 后台接受变量名字要与文件选择name属性一致 -->
14.1.2 编写控制器
@Controller @RequestMapping("/file") public class FileController { @RequestMapping("/upload") public String upload(MultipartFile aa, HttpServletRequest request) throws IOException { String realPath = request.getRealPath("/upload"); aa.transferTo(new File(realPath,aa.getOriginalFilename()));//文件上传 return "index"; } }
14.1.3 修改文件上传大小
#上传时出现如下异常: 上传文件的大小超出默认配置 默认10M nested exception is java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (38443713) exceeds the configured maximum (10485760) #修改上传文件大小: spring: http: multipart: max-request-size: 209715200 #用来控制文件上传大小的限制 max-file-size: 209715200 #用来指定服务端最大文件大小
14.2 文件下载
14.2.1 提供下载文件链接
<a href="../file/download?fileName=corejava.txt">corejava.txt</a>
14.2.2 开发控制器
@RequestMapping("/download") public void download(String fileName, HttpServletRequest request, HttpServletResponse response) throws Exception { String realPath = request.getRealPath("/upload"); FileInputStream is = new FileInputStream(new File(realPath, fileName)); ServletOutputStream os = response.getOutputStream(); response.setHeader("content-disposition","attachment;fileName="+ URLEncoder.encode(fileName,"UTF-8")); IOUtils.copy(is,os); IOUtils.closeQuietly(is); IOUtils.closeQuietly(os); }
15. 拦截器
15.1 开发拦截器
public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception { System.out.println("======1====="); return true;//返回true 放行 返回false阻止 } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object o, ModelAndView modelAndView) throws Exception { System.out.println("=====2====="); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) throws Exception { System.out.println("=====3====="); } }
15.2 配置拦截器
@Component public class InterceptorConfig implements WebMvcConfigurer { //用来加入拦截器相关配置 参数1:InterceptorRegistry 拦截器注册对象 @Override public void addInterceptors(InterceptorRegistry registry) { //添加那个拦截器 registry.addInterceptor(new MyInterceptor1()) .addPathPatterns("/**")//拦截所有控制器请求 .excludePathPatterns("/user/findAll");//排除指定的请求; registry.addInterceptor(new MyInterceptor2()) .addPathPatterns("/**")//拦截所有控制器请求 .excludePathPatterns("/user/findAll");//排除指定的请求; } }
16. war包部署
16.1 设置打包方式为war
war
16.2 在插件中指定入口类
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <!--使用热部署出现中文乱码解决方案--> <configuration> <fork>true</fork> <!--增加jvm参数--> <jvmArguments>-Dfile.encoding=UTF-8</jvmArguments> <!--指定入口类--> <mainClass>com.libin.Application</mainClass> </configuration> </plugin> </plugins> </build>
16.3 排除内嵌的tomcat
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> <!--去掉内嵌tomcat--> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <scope>provided</scope> <!--去掉使用内嵌tomcat解析jsp--> </dependency>
16.4 配置入口类
//1.继承SpringBootServletInitializer //2.覆盖configure方法 public class Application extends SpringBootServletInitializer{ public static void main(String[] args) { SpringApplication.run(Application.class,args); } @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(Application.class); } }
16.5 打包测试
/* 一旦使用war包部署注意: 1. application.yml 中配置port context-path 失效 2. 访问时使用打成war包的名字和外部tomcat端口号进行访问项目 */
感谢阅读~恭喜你String boot 基础到此学习完毕 ! ! !