从零开始学习springboot,记录点

入行java也有大半年了,最近有时间,开始慢慢自己学习springboot,也算为将来打下基础

这里是记录springboot用到的基础技术点,可能不全,欢迎指正!

 

1.首先肯定是直接先创建一个最简单的springboot项目,我是用的idea开发的,其他ide应该也差不多

springboot2.0以上必须要用jdk1.8以上,不然会出很多奇怪的错误!

Next,这里Group和Artifact跟普通maven项目一样填写就行了。主要是Packaging选项,如果选择了jar,将使用springboot内置tomcat,如果选择了war其实变化不大,会多出一个文件和tomcat的maven依赖

区别:

jar包:直接通过内置tomcat运行,不需要额外安装tomcat。如需修改内置tomcat的配置,只需要在spring boot的配置文件中配置。内置tomcat没有自己的日志输出,全靠jar包应用输出日志。但是比较方便,快速,比较简单。

war包:传统的应用交付方式,需要安装tomcat,然后放到waeapps目录下运行war包,可以灵活选择tomcat版本,可以直接修改tomcat的配置,有自己的tomcat日志输出,可以灵活配置安全策略。相对打成jar包来说没那么快速方便。
 

接着选择web组件,这个基本必须选!然后其他的组件你可以根据需求选择,还可以选择Mysql和Mybatis(注意:如果选择了这两个,生成的springboot项目你没有配置好数据源的话,启动是会报错的,也可以选择他们生成项目后,去pom.xml文件暂时注释掉Mysql和Mybatis两个依赖)

再Next,Finish,就创建成功啦!

直接运行下面的方法,就可以启动项目了(虽然项目什么都没有,连个index页面都没有)

看到这个,并且没有报错,就是启动成功了

当然,这只是最简单的第一步,后面慢慢一点一点学习

 

2.刚生成的springboot项目的resources目录下有static和templates文件夹

(1)static:默认是放静态资源的

我们将图片1.jpg放到static文件夹里面,启动项目,在浏览器输入localhost:8080/1.jpg  (不用加项目名),可以访问到图片

(2)templates:放视图模板,就是springBoot的动态页面,springboot已经不推荐使用jsp了,springboot可以集成freemarker或者thymeleaf,他们都可以完全替代jsp,这里两个都介绍。

1) 集成freemarker ,很多公司都使用freemarker模板引擎,具体的好处请自行百度

在pom.xml加入依赖freemarker

<!--freearker依赖-->
<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>

在 templates 文件夹新建文件 ftlIndex.ftl

这是一个freemarker的模板文件,要是freemarker的基础语法不懂的同学建议去看下

第一个ftl项目
姓名:${name}
年龄:${age}
性别:
<#if sex="1">
    男生
    <#elseif sex="2">
    女生
    <#else>
    其他
</#if>

然后新建一个controller,因为整合了freemarker,这里返回值直接访问templates目录下的ftlIndex.ftl,springboot的配置文件默认已经帮我们配置好了前后缀,当然我们也可以去application.properties修改,不建议修改。

可以在方法传入map参数,会传到前端显示,还可以像传统的做法一样,传入一个model或者modelAndView,效果一样

package com.liqiye.springbootdemo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.Map;

/**
 * @author liqiye
 * @description   返回freemarker  .ftl文件
 * @date 2019/4/5
 */
@Controller
public class FtlController {

    /**
     * 访问在templates目录里面的ftl文件,这里自动在返回值后面加上.ftl后缀
     * @param map  可以在方法的参数上面加上map,替换模板文件里面的值。注意:必须加在方法的参数
     * @return
     */
    @RequestMapping("/ftlIndex")
    public String tets(Map<String,Object> map){
        map.put("name","李启业");
        map.put("age","23");
        map.put("sex","0");
        return "ftlIndex";
    }

}

效果图:

2)集成thymeleaf,这是springboot官方推荐我们使用的模板引擎

引入maven

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

然后在application.properties配置文件里加上 thymeleaf的配置参数

 

#thymeleaf 模板解析器属性
spring.thymeleaf.mode=HTML5
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.servlet.content-type=text/html
# 默认的前后缀,不写默认就是这个
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
#开发时关闭缓存,不然没法看到实时页面
spring.thymeleaf.cache=false

在 templates 文件夹新建文件 thymeleafView.html

(其实thymeleaf就是一个html页面嵌入特定的语法标签,然后作用跟jsp基本一样,这里测试了下常用简单的thymeleaf语法,详细语法建议百度下)

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/html">
<html  xmlns:th="http://www.thymeleaf.org" >
<head>
    <meta charset="UTF-8">
    <title>测试thymeleaf</title>
</head>
<body>
<div th:object="${user}">
    <p>姓名:<span th:text="*{name}">xx</span></p>   <!--可以用*{}来省略前文引用的对象-->
    <p>年龄:<span th:text="${user.age}">xx</span></p>
    <p>性别:<span th:text="${user.sex}">xx</span></p>
</div>
<table border="1">
    <tr>
        <th>姓名</th>
        <th>年龄</th>
    </tr>
    <tr th:each="us:${list}">
        <td th:text="${us.name}"></td>
        <td th:text="${us.age}"></td>
    </tr>
</table>
<div>
    <p th:if="${testif}">th:if标签测试:  true显示</p>
    <p th:unless="${testif}">th:unless标签测试:  false显示</p>
</div>
<div th:switch="${testswitch}">
    <div th:case="'1'">
        <p>执行th:switch标签的值为 1 的case的代码块</p>
    </div>
    <div th:case="'2'">
        <p>执行th:switch标签的值为 2 的case的代码块</p>
    </div>
    <div th:case="'3'">
        <p>执行th:switch标签的值为 3 的case的代码块</p>
    </div>
</div>
<div>
    <a href="http://www.baidu.com" th:href="@{testthhref}">超连接</a> <!--注意如果在@{/}里加了/ ,它是相对路径,前面会加上当前访问路径-->
</div>
</body>
</html>

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

controller

package com.liqiye.springbootdemo.controller;

import com.liqiye.springbootdemo.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import java.util.ArrayList;

/**
 * @author liqiye
 * @description 测试thymeleaf模板的controller
 * @date 2019/5/6
 */
@Controller
public class ThymeleafController {

    @GetMapping("/thymeleaf")
    public ModelAndView thymeleaf(){
        ModelAndView modelAndView = new ModelAndView();
        User user = new User();
        user.setName("李启业");
        user.setAge(23);
        user.setSex("男");
        User user1 = new User("小红", 1);
        User user2 = new User("小黄", 2);
        User user3 = new User("小绿", 3);
        ArrayList<User> list = new ArrayList<>();
        list.add(user1);
        list.add(user2);
        list.add(user3);
        modelAndView.addObject("user",user);
        modelAndView.addObject("list",list);
        modelAndView.addObject("testif",true);
        modelAndView.addObject("testswitch","2");
        modelAndView.setViewName("thymeleafView");
        return modelAndView;
    }

    @ResponseBody
    @GetMapping("/testthhref")
    public String test_thhref(){
        return "测试 th:href";
    }

}

测试 浏览器输入: http://localhost:8080/thymeleaf  页面可以像jsp一样动态填充数据

3.开启springboot的热部署

(1)用devtools的热部署

引入maven 

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-devtools</artifactId>
     <optional>true</optional>
</dependency>

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

引入maven依赖后其实热部署就已经可以了,默认是开启的,不过如果你想指定热部署哪些目录,又有某些目录不想热部署,可以在application.properties配置文件里加上以下配置(当然,不加以下配置全部文件都会热部署)

#热部署生效
spring.devtools.restart.enabled: true
#设置重启的目录
spring.devtools.restart.additional-paths: src/main/java
#classpath目录下的WEB-INF文件夹内容修改不重启
#spring.devtools.restart.exclude: WEB-INF/**

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

注意:还有一点,我用的idea开发,要想springboot的热部署起作用,要先开启idea的自动热加载

1)setting -> Compile -> Build project automatically --> 选中

2)按组合键 Shift+Ctrl+Alt+/,选择Registry,进去勾选上compiler.automake.allow.when.app.running

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

接下来,自己去在controller里修改代码,然后Ctrl+S下,发现在控制台又打印了springboot的标志和一大串东西,证明热部署成功。(其实我觉得这个devtools热部署超级辣鸡,但是学习下也没损失)

(2)用jrebel热部署(强烈建议)

这个插件是收费的,破解教程这里就不放了,自己百度吧,很简单的

装好jrebel插件,创建好springboot项目后,在idea界面的左下方,点击下图位置,选中你项目勾上

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

这时候还没行喔,在idea界面右上方,配置开启热部署,点击Edit Configurations...

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

下图红色框都要选中Update classes and resources

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

当然不要忘了,jrebel也要先开启idea的自动热加载:

1)setting -> Compile -> Build project automatically --> 选中

2)按组合键 Shift+Ctrl+Alt+/,选择Registry,进去勾选上compiler.automake.allow.when.app.running

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

还有最后一步,启动springboot项目不要再去那个启动app那里运行那个方法了,用原来的启动类启动是不会启用jrebel插件热部署的,在下图位置,先选中启动类,然后点击那个虫子按钮,debug启动就可以了!

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

还有上面两种热部署最好不要同时用,只用一种就好了。

 

4.springboot项目启动的vm参数设置(设置合理可以提高性能)

因为我用的idea开发,我就直接在idea那里设置了,十分方便

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

参数,我这里是设置初始化1G,最大1G,可以根据实际情况自行修改

-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms1024m -Xmx1024m -Xmn256m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

怎么查看设置的vm内存是否成功?

去到本地安装jdk的bin目录,里面有个文件jconsole.exe,它可以查看本地运行的虚拟机占用内存等情况

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

先启动你的springboot项目(用修改了参数的方式启动),然后双击这个图标!选择你刚启动的项目,直接点连接,不用账号密码,点击不安全的链接

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

这时候就可以看到(第一个),最大内存,与初始化内存就是1个G,设置成功!

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 

5.springboot整合jsp

   springboot官方不推荐使用jsp进行前端开发,所以默认不集成的,但是之前做项目都是用的jsp,这里肯定要集成下

   注意:要集成jsp,springboot项目只能是war包形式

(1)引入maven

<dependency>
     <groupId>org.apache.tomcat.embed</groupId>
     <artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<dependency>
     <groupId>javax.servlet</groupId>
     <artifactId>jstl</artifactId>
</dependency>

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

(2)创建目录 webapp、WEB-INF(这个应该不用说了吧)

(3)在webapp-WEB-INF 下 来个最简单的jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
    <title>Title</title>
</head>
<body>
springboot整合jsp
</body>
</html>

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

(4)controller

package com.liqiye.springbootdemo.controller;


import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;


/**
 * @author liqiye
 * @description jsp整合controller,项目必须是war包
 * @date 2019/4/5
 */
@Controller
public class JspController {

    @RequestMapping("/jsp")
    public String jspIndex(){
        return "index";
    }

}

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

(5)配置前后缀(类似springmvc)

在application.properties配置文件里面加上

spring.mvc.view.prefix=/WEB-INF/
spring.mvc.view.suffix=.jsp

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

(6)测试

  注意:访问路径不需要加上项目名

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

注意:如果你在整合jsp的同时,也整合了其他模板引擎(freemarker或者thymeleaf),即在pom.xml文件引入了整合的模板引擎包,并且在springboot配置文件指定了该引擎读取的前后缀,这时,jsp整合是不生效的!会被覆盖,读取的是你指定的模板引擎的位置,此时freemarker和thymeleaf都可以正常使用,但是jsp不生效。所以jsp跟模板引擎不要一起整合。

 

6.集成lombok(ide安装lombok我就不放了)

  相信lombok的好处不用我再说了,特别是用springboot开发,当然是要将快速开发进行到底!

  (1)引入maven

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

(2)log4j的配置文件  log4j.properties

  直接放到resources目录下

# LOG4J配置
log4j.rootCategory=INFO, stdout, file

# 控制台输出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n

# root日志输出到文件
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.file=/data/logs/springboot-log4j-all.log
log4j.appender.file.DatePattern='.'yyyy-MM-dd
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n

# 按不同package进行输出
# com.micai包下的日志配置
log4j.category.com.micai=DEBUG, didifile

# com.micai下的日志输出
log4j.appender.didifile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.didifile.file=/data/logs/springboot-log4j-my.log
log4j.appender.didifile.DatePattern='.'yyyy-MM-dd
log4j.appender.didifile.layout=org.apache.log4j.PatternLayout
log4j.appender.didifile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L ---- %m%n

# ERROR级别输出到特定的日志文件中
log4j.logger.error=errorfile
# error日志输出
log4j.appender.errorfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.errorfile.file=/data/logs/springboot-log4j-error.log
log4j.appender.errorfile.DatePattern='.'yyyy-MM-dd
log4j.appender.errorfile.Threshold = ERROR
log4j.appender.errorfile.layout=org.apache.log4j.PatternLayout
log4j.appender.errorfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

(3)测试。

新建一个实体类user

这里简单使用了下 @Data 和 @Slf4j ,运行了下main方法,控制台打印出user的信息,成功。

(注意:lombok提供的@Slf4j注解,只能调用log对象打印日志,名字固定在源码了,当然你也可以修改源码)

package com.liqiye.springbootdemo.entity;

import com.liqiye.springbootdemo.utils.SetName;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;

/**
 * @author liqiye
 * @description
 * @date 2019/4/6
 */
@Data
@Slf4j
public class User {

    public Integer id;
    public String name;
    public Integer age;

    public static void main(String[] args) {
        User user = new User();
        user.setName("张三");
        user.setAge(23);
        log.info(user.toString());
    }

}

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

(4)当然如果你不想安装lombok,这里也提供整合log4j的方法

   直接引入maven 

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-log4j</artifactId>
</dependency>

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

   上面的 log4j.properties 配置文件不要忘了!

private final Logger log = LoggerFactory.getLogger(this.getClass());

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 

7.集成 PageHelper 分页插件

引入maven 

<dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper-spring-boot-starter</artifactId>
      <version>1.2.5</version>
</dependency>

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

下面集成mybatis一起测试

 

8.集成mybatis

(1)引入mybatis和mysql的连接驱动

<dependency>
     <groupId>org.mybatis.spring.boot</groupId>
     <artifactId>mybatis-spring-boot-starter</artifactId>
     <version>2.0.0</version>
</dependency>
<dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <scope>runtime</scope>
</dependency>

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

(2)在application.properties 配置文件里面加上数据源

#datasource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

(3)创建数据库springboot(名字跟上面对上就行)

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

(4)创建实体类 User

package com.liqiye.springbootdemo.entity;

import lombok.Data;

/**
 * @author liqiye
 * @description
 * @date 2019/4/6
 */
@Data
public class User {

    public Integer id;
    public String name;
    public Integer age;

}

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

(5)创建 Usermapper 接口 ,这里直接用注解注入sql语句,不加xml那个文件了

注意:你可以在每一个mapper接口上面加上@Mapper注解(作用是被springboot扫描解析成mapper),也可以在springboot的启动类上面加上注解 @MapperScan(basePackages = {"com.liqiye.springbootdemo.mapper"}),实现,指定包扫描,用其中一种即可。

package com.liqiye.springbootdemo.mapper;

import com.liqiye.springbootdemo.entity.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.List;

// @Mapper
public interface UserMapper {

    @Select("select * from user")
    List<User> findList();

    @Select("select * from user where name = #{name}")
    User findByName(@Param("name")String name);

    @Insert("insert into user(name,age) values(#{name},#{age})")
    int insert(@Param("name")String name,@Param("age")Integer age);

}

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

(6)创建UserService 

package com.liqiye.springbootdemo.service;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.liqiye.springbootdemo.entity.User;
import com.liqiye.springbootdemo.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author liqiye
 * @description
 * @date 2019/4/6
 */
@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    public int insert(String name,Integer age){
        int i = userMapper.insert(name, age);
        return i;
    }

    // 分页查询
    public PageInfo<User> findList(int page, int pageSize){
        PageHelper.startPage(page,pageSize);
        List<User> list = userMapper.findList();
        PageInfo<User> pageInfo = new PageInfo<User>(list);
        return pageInfo;
    }

}

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

(7)创建 Usercontroller

package com.liqiye.springbootdemo.controller;

import com.github.pagehelper.PageInfo;
import com.liqiye.springbootdemo.entity.User;
import com.liqiye.springbootdemo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author liqiye
 * @description 测试整合springboot和mybatis
 * @date 2019/4/6
 */
@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping("/insertuser")
    public String insertuser(String name,Integer age){
        int i = userService.insert(name, age);
        return "操作:"+i;
    }

    @RequestMapping("/findList")
    public PageInfo<User> findList(int page, int pageSize){
        return userService.findList(page,pageSize);
    }

}

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

(8)测试

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

  返回1,并且到数据库查看新增了一条数据,插入成功!

---------------------------------------------------------------------------------------------

  给数据库多插几条数据,然后测试分页

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

页面成功显示分页的json数据!

(9)上面是实现了启动类扫包的方式注入,那是sql语句用注解的方式写在mapper上面,若我们用传统的方式mapper和接口分开写,然后在resources目录下建mapper目录,里面放封装sql语句的xml文件,这样的方式是没办法读取封装sql的xml文件的,这时,我们只需要在application.properties文件加上下面的代码,就可以访问到了

路径是你存放封装sql语句的xml文件,这样两种方式的mapper就都能用了(注解方式和xml方式)

#加载Mybatis封装sql语句的xml文件
mybatis.mapper-locations = classpath:mapper/*Mapper.xml

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

或者说如果你的接口,和封装sql语句的xml文件在同一目录下,就不用加上面的配置文件,因为springboot默认读接口时就是同一个目录读取xml文件,但是如果你用的idea开发,idea默认不会编译java目录下的xml文件,需要手动开启,则需要在pom.xml文件加上

<build>
    <!-- idea默认在java目录下不编译xml文件,这里开启编译java目录下的xml文件 -->
    <resources>
      <resource>
        <directory>src/main/java</directory>
        <includes>
          <include>**/*.xml</include>
        </includes>
      </resource>
    </resources>
</build>

(10)在控制台开启打印sql语句

默认执行完sql语句后,不会在控制台打印出sql语句,这样很不方便我们开发,在application.properties配置文件加上

#开启打印执行的sql语句,logging.level.后面跟接口所在的包名
logging.level.com.liqiye.springbootdemo.mapper=debug

9.开启事务(就是在对数据库操作时,如果出现异常,对数据库的新增改都将回滚)

  引入spring的事务支持

<!-- 本地事务 -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>5.0.8.RELEASE</version>
</dependency>

  使用十分简单,只需要在要使用事务的方法,或者类上面,加上 @Transactional 注解 即可!

  直接在上面的 UserController 的新增方法上面修改,使它内部报错:

    // 事务起遇到异常 前面的增删改都将回滚的作用,不加@Transactional注解,即使报错,对数据库的操作也不会回滚,会造成数据异常
    @RequestMapping("/insertuser")
    @Transactional    // 开启事务,采用的是AOP的环绕通知,可以作用在类、接口、public方法上
    public String insertuser(String name,Integer age){
        int i = userService.insert(name, age);
        int j = 1/0;
        return "操作:"+i;
    }

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

   访问url地址

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

   然后报错,去到数据库查看,发现数据并没有插入成功,事务起作用了!

 

10.开启异步 (所谓异步,就是A方法调用B方法,然后A和B方法会同时运行,A方法不会因为B方法还没返回而阻塞)

  首先在springboot 的启动类上面加上 @EnableAsync 注解 开启异步

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

然后在要开启异步的方法上面加上 @Async 注解

package com.liqiye.springbootdemo.service;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

/**
 * @author liqiye
 * @description  测试Async异步
 * @date 2019/4/6
 */
@Service
@Slf4j
public class TestAsyncService {

    @Async
    public String menthod(){
        log.info("2");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        log.info("3");
        return "返回";
    }

}

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

调用上面的service 的controller代码:

    // 测试异步
    @ResponseBody
    @RequestMapping("/test2")
    public String test2(){
        log.info("1");
        String s = testAsyncService.menthod();
        log.info("4");
        return "result:"+s;
    }

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

测试:

在浏览器输入url : http://localhost:8080/test2

控制台打印:

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

浏览器显示:

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

因为开启了异步,controller的方法和service的方法同时运行,controller的方法不会因为service的方法在休眠而暂停,所以日志打印顺序为1、4、2、3 ;而controller的方法运行到结束时,service的方法还没返回,没有返回值,所以显示null。

11.Banner

springboot项目启动的时候是不是总能看到下面这个图标

1)这个可以去掉不显示的,在application.properies 配置文件里加上 spring.main.banner-mode=off 即可

#关掉springboot启动图标
spring.main.banner-mode=off

2)也可以替换掉这个图标(不要同时去掉 与 替换 ,这样就是没有显示)

在resources目录下新建文件 banner.txt (springboot启动默认就是读取这个文件名,不能随意命名,不然没法读取)

                   _ooOoo_
                  o8888888o
                  88" . "88
                  (| -_- |)
                  O\  =  /O
               ____/`---'\____
             .'  \\|     |//  `.
            /  \\|||  :  |||//  \
           /  _||||| -:- |||||-  \
           |   | \\\  -  /// |   |
           | \_|  ''\---/''  |   |
           \  .-\__  `-`  ___/-. /
         ___`. .'  /--.--\  `. . __
      ."" '<  `.___\_<|>_/___.'  >'"".
     | | :  `- \`.;`\ _ /`;.`/ - ` : | |
     \  \ `-.   \_ __\ /__ _/   .-` /  /
======`-.____`-.___\_____/___.-`____.-'======
                   `=---='
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
         佛祖保佑       永无BUG

该txt文件,除了名字和目录不能改外,里面的内容逆向怎么改都行,这里放几个根据文字生成图标的网站

http://patorjk.com/software/taag

http://www.network-science.de/ascii/

https://www.degraeve.com/img2txt.php

12.springboot默认的错误页面显示

如果你请求了一个不存在的url,或者服务器里代码运行时发生了异常,默认是出现下面两个不友好的页面404和5xx

我们项目一般肯定会有一个全局的异常捕获的显示页面,给用户友好的显示出错

而springboot里我们可以十分简单的实现不同错误,显示不同的页面,不需要写什么拦截器什么的

1)在resources目录下新建一个public 目录,在public 目录里新建一个error目录(目录名字不能错

2)在resources/public/error 里新建文件 404.html  ,文件名不能随便(当然你们应该做一个很帅的页面放进去)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>出错</title>
</head>
<body>
404错误
</body>
</html>

这样如果发生了404错误,显示的就是这个html页面

还可以新建 5xx.html 这样的名字,他会自动匹配发生 5xx 的所有错误,然后都是显示这个html页面

3)测试:我们发起一个不存在的请求  http://localhost:8080/bucunzaideurl

显示如下:

4)还可以使用freemarker的模板页面显示,不过文件放置的位置不一样,应该在resources目录下的templates目录下的error目录里,新建类似404.ftl、 5xx.ftl 的模板文件

13. springboot整合redis 加上 封装StringRedisTemplate 的redis工具类的运用

 

14. Springboot 整合 hibernate 和 jpa

 

15. springboot2.0 整合 activiti 6.0

16. springboot 整合 RabbitMQ

 

 

当然,这只是记录我学习springboot的过程,很多技术点我都写的十分简单,十分片面,不过对于springboot的入门是十分有帮助的!有空继续完善

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值