SpringBoot笔记


阿里的配置网站

http://start.aliyun.com

配置文件


SpringBoot使用一个固定名称application的全局配置文件,但是它提供了两种文件类型以供选择。除了我们原本用的properties,还有yml类型。

配置文件的作用

修改SpringBoot自动配置的默认值,因为SpringBoot在底层已经给我们配置好了。

什么是yaml

YAML是"YAML Ain't a Markup Language"(YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。

yaml配置:

server:
    port: 8080

xml配置:

<server>
    <port>8081</port>
</server>
yaml基础语法

样例1
#key=value
name : QinLian

#对象
student:
    name:Feather
    age:21
    
#对象行内写法
student:{name: Sunny,age: 15}

#数组
pets:
  - cat
  - dog
  - pig
  
#数组行内写法
pets: [cat,dog,pig]

注意:yaml对空格和缩进要求极其严格!!!

样例2
master:
  name: QinLian
  age: 18
  sex: female
  dog:
    name: feather
    age: 21
    idot: true
    birth: 1999/10/24
    map: {k1: v1,k2: v2}
    lists:
      - stupid
      - foolish
      - Qinlian

再次强调空格

在对应类上方加上上面提到的注解即可将这个yaml配置文件的数据注入

yaml的占位符

yaml中的值可以添加占位符

${random.int} int类型随机数

${person.hello:hello} 取person.hello的值,如果没有值则默认为hello

yaml注解
组件注解

@Component

将类标记为可被springboot的main类扫描到的组件

yaml注入注解

@configurationProperties(prefix = "dog")

向类中注入yaml配置文件中的对象和变量

在使用这个注解时有可能爆红,这时idea会自动弹出一个框,可以去网站上引用springboot提供的dependency

加载指定配置文件注解

@PropertySource(value = "classpath:moesy.properties")

拓展内容
properties的补充

引用properties需要用到SPEL表达式${name}来取出配置文件的值

松散绑定

yml中写last-name,和lastName是一样的,-后面跟着的字母默认是大写的,这个特性只能应用于名字,在值上是无效的

JSR303数据校验

在类外用@Validated注解开启支持,之后使用JSR303的注解可以用来对元素成分进行检测(类似一个简化正则)

还有很多注解:(前提必须在实体类上写上了@Validated)

Constraint详细信息
@Null被注释的元素必须为 null
@NotNull被注释的元素必须不为 null
@AssertTrue被注释的元素必须为 true
@AssertFalse被注释的元素必须为 false
@Min(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max, min)被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction)被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past被注释的元素必须是一个过去的日期
@Future被注释的元素必须是一个将来的日期
@Pattern(value)被注释的元素必须符合指定的正则表达式
@Email被注释的元素必须是电子邮箱地址
@Length被注释的字符串的大小必须在指定的范围内
@NotEmpty被注释的字符串的必须非空
@Range被注释的元素必须在合适的范围内
自动装配

SpringBoot帮我们配置了什么?

  • xxxxAutoConfiguration 向容器中自动配置组件
  • xxxProperties 自动配置类,装配配置文件中自定义的一些内容

SpringBoot Web开发

静态资源

在SpringBoot中,我们可以使用以下方式处理静态资源

  • webjars localhost:8080/webjars/
  • public , static , /** , resources localhost:8080/

优先级:resource>static(默认)>public

首页

在源码文件WebMvcAutoConfiguration.class下,存在一个表达首页路径的方法

private Resource getIndexHtml(String location) {
    return this.resourceLoader.getResource(location + "index.html");
}

按照默认代码,首页应该位于resources文件夹下的static里

thymeleaf模板引擎

在pom中导入以下依赖

<dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf-spring5</artifactId>
</dependency>
<dependency>
    <groupId>org.thymeleaf.extras</groupId>
    <artifactId>thymeleaf-extras-java8time</artifactId>
</dependency>

依赖导入后,在controller使用@Controller标签可以实现网页跳转

templates目录下的所有目录,只能通过controller来跳转

示例:

package top.moesy.demo4.controller;

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

//templates目录下的所有目录,只能通过controller来跳转
//需要模板引擎的支持,thymeleaf
@Controller
public class HelloController {

    @RequestMapping("/test")
    public String test(){
        return "test";
    }
}

以上源码可以实现跳转到templates下的test.html的功能

如果要传递数据的话,需要在标签中的text属性前加上th:,样例如下

@Controller
public class HelloController {

    @RequestMapping("/test")
    public String test(Model model){
        model.addAttribute("msg","hello,world");
        return "test";
    }
}
<body>
<div th:text="${msg}"></div>
</body>

th会爆红,但是不影响运行

Thymeleaf语法

所有的html元素都可以被thymeleaf替换接管,th:元素名,如

<div th:text="${msg}"></div>   // 这样就可以取出后台传过来的msg数据了
  • 简单表达式:

    • 变量表达式: ${...}
    • 选择变量表达式: *{...}
    • 消息表达: #{...}
    • 链接URL表达式: @{...}
    • 片段表达式: ~{...}

image-20200511114501424

image-20200511114501424

th:text th:utext

th:text 不转义

th:utext 转义

如果使用th:text,后台如果传"<h1>xxx</h1>",那么在页面上就会原样输出

如果使用th:utext,就会对后台传入的数据进行转义,如传入<h1>xxx</h1>,那么就会在页面上显示出<h1>的格式

<div th:utext="${msg}"></div>

还有另外一种写法

<div>[[${msg}]]</div>

通过这种写法也可以取出msg的值

th:each 遍历

<h3 th:each="user:${users}" th:text="${user}"></h3>
装配SpringMVC

要拓展SpringMVC,实现一些拦截器,格式化,视图解析器等,我们要自己定义一个类,然后添加注解@Configuration,实现接口WebMvcCongigurar,不能添加注解@EnableWebMvc,重写里面的方法来实现想要的功能,如

// 全面扩展SpringMVC
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        ...
    }
    ...
}

如果想diy一些定制化的功能,只要写这个组件,然后将他交给springboot,springboot就会帮我们自动装配,如

@Configuration
public class MyMvcConfig implements WebMvcConfigurer {

    @Bean
    public ViewResolver myViewResolver(){
        return new MyViewResolver();
    }


    public static class MyViewResolver implements ViewResolver{
        @Override
        public View resolveViewName(String s, Locale locale) throws Exception {
            return null;
        }
    }
}

在springboot中,有很多的xxxConfiguration,会帮助我们进行扩展配置,只要看见了这个东西,我们就要注意了!

员工管理系统

模拟数据的配置

EmployeeDao

//员工Dao
@Repository
public class EmployeeDao {

    //模拟数据库中的数据
    @Autowired
    private static Map<Integer, Employee> employees = null;
    //员工所属的部门
    private DepartmentDao departmentDao;
    static {
        employees = new HashMap<Integer, Employee>();

        employees.put(1001,new Employee(1001,"AA","114514@1919.com",1,new Department(101,"教学部"),new Date()));
        employees.put(1002,new Employee(1002,"BB","114514@1919.com",0,new Department(102,"市场部"),new Date()));
        employees.put(1003,new Employee(1003,"CC","114514@1919.com",1,new Department(103,"校验部"),new Date()));
        employees.put(1004,new Employee(1004,"DD","114514@1919.com",0,new Department(104,"运营部"),new Date()));
        employees.put(1005,new Employee(1005,"EE","114514@1919.com",1,new Department(105,"后勤部"),new Date()));
    }

    private static Integer initId = 1006;

    public void save(Employee employee){
        if(employee.getId()==null){
            employee.setId(initId++);
        }

        employees.put(employee.getId(),employee);
    }
    //查询全部
    public Collection<Employee> getAll(){
        return employees.values();
    }
    //通过id查询员工
    public Employee getEmployeeById(Integer id){
        return employees.get(id);
    }
    //删除员工
    public void delete(Integer id){
        employees.remove(id);
    }
}

DepartmentDao

//部门Dao
@Repository
public class DepartmentDao {

    //模拟数据库中的数据
    private static Map<Integer, Department> department = null;

    static {
        department = new HashMap<Integer, Department>();//创建

        department.put(101,new Department(101,"教学部"));
        department.put(102,new Department(102,"市场部"));
        department.put(103,new Department(103,"校验部"));
        department.put(104,new Department(104,"运营部"));
        department.put(105,new Department(105,"后勤部"));
    }

    //获得所有部门信息
    public Collection<Department> getDepartments(){
        return department.values();
    }

    //通过id得到部门
    public Department getDepartmentById(Integer id){
        return department.get(id);
    }
}
首页配置

所有页面静态资源都应该由thymeleaf接管,在静态资源的属性名前加上“th”,在双引号中用@{}包含内容

样例

<span th:text="#{login.tips}"></span>
<form action="http://blogyin.top">
    <input th:value="#{login.username}">
    <input th:value="#{login.password}">
    <input type="checkbox" th:text="#{login.remember}">
    <button type="submit" th:text="#{login.btn}"></button>
</form>
<a  th:href="@{/index.html(l='zh_CN')}">中文</a>
<a  th:href="@{/index.html(l='en_UK')}">English</a>

我们将首页置于templates目录下,这个目录下的页面不能直接被访问,我们可以在Config中配置,直接进行访问

样例

@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("index");
        registry.addViewController("/index.html").setViewName("index");
    }
}
国际化

首先将IDEA中setting-fileencoding全部改为utf-8

在resources目录下建一个i18n(国际化单词缩写)目录

在目录下新建配置文件login.properties

再新建一个login_zh_CN.properties,会发现两个配置文件自动合并到了一个目录下,同理,配置其他语言的同名配置文件也会这样。

右键自动生成的目录,new-Add Locales to Resource Bundle login,点击右侧加号即可增加语言

编写配置文件时,点击工作区下面的Resource Bundle进行可视化配置,在一个窗口中即可配置三个文件

原名文件是默认内容,带有语言代码的文件是对应语言内容

login.tips 请登录
login.password 密码
login.remember 记住我
login.username 用户名
login.btn 摁

然后在application配置文件中进行配置,指定国际化包,如

spring:
    messages:
        basename: i18n.login

thymeleaf中,在前端文件中用#{...}即可调用国际化

对于国际化切换的问题,建议当程序员为耗子的时候,直接复制以下代码存进Config文件夹下的MyLocaleResolver类中

实现了LocaleResolver接口,这个类就是一个国际化解析类

public class MyLocaleResolver implements LocaleResolver {
    @Override
    public Locale resolveLocale(HttpServletRequest request) {
        // 获取请求中的语言参数
        String language = request.getParameter("l");
        Locale locale = Locale.getDefault(); // 如果没有就使用默认的
        // 如果请求的连接携带了国际化的参数
        if (!StringUtils.isEmpty(language)){
            // zh_CN  国家,地区
            String[] s = language.split("_");
            locale = new Locale(s[0], s[1]);
        }
        return locale;
    }

    @Override
    public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {

    }
}

之后,将其放入IOC中,即在之前的MyMvcConfig中加入以下内容

@Bean
public LocaleResolver localeResolver(){
    return new MyLocaleResolver();
}

由前端进行参数传递

<a class="btn btn-sm" th:href="@{/index.html(l='zh_CN')}">中文</a>
<a class="btn btn-sm" th:href="@{/index.html(l='en_UK')}">English</a>

配置顺序总结:

  1. 配置i18n文件
  2. 如果要实现点击按钮自动切换,我们就需要自定义一个国际化组件LocaleResolver
  3. 将自己写的国际化组件放入IOC中
  4. 前端传递参数 th:href="@{/index.html(xx='xxxx')}"
登录功能实现

我们首先为表单添加action属性,同时为input标签添加name属性以便提交

  <form th:action="@{/user/login}">

    <input name="username" th:value="#{login.username}">
    <input name="password" th:value="#{login.password}">

    <input type="checkbox" th:text="#{login.remember}">
      <button type="submit" th:text="#{login.btn}"></button>
  </form>

新建一个LoginController类

在类中定义一个方法,将请求映射到/user/login

在方法的参数中定义和表单中传入数据同名的变量

为变量添加@RequestParam标签以表示这个变量是传入参数

在参数中加入Model

示例:

@Controller
public class LoginController {
    @RequestMapping("/user/login")
    public String login(
        @RequestParam String username,
        @RequestParam String password,
        Model model){
    }
}

在方法中加入业务,在用户名和密码符合条件时,返回一个templates中的页面(记得把@ResponseBody标签去掉)

//具体的业务:
if(!StringUtils.isEmpty(username)&&"123456".equals(password))
{
    return "list"
}else {
    //告知用户登录失败
    model.addAttribute("msg","小来,你真刺毛");
    return "index";
}

要解决接收到的登录失败提示消息的显示问题,可以用以下代码:

<!--  msg值为空则不显示该消息  -->
<p style="color: red" th:text="#{login.son}" th:if="${not #strings.isEmpty(msg)}"></p>

跳转时会在地址栏暴露用户名和密码,可以加入以下路径映射:

registry.addViewController("/main.html").setViewName("list");

然后在Controller中返回映射地址

//返回一个重定向的网址(映射在MyMvcConfig中)
return "redirect:/main.html";
拦截器

首先,我们在LoginController中的登录成功中加入如下语句

//如果登录了,向session传递一个username
session.setAttribute("loginUser",username);

在config下新建一个LoginHandler类,继承HandlerInterceptor接口

配置preHandle拦截器

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

    //登陆成功之后,应该有用户的session;
    HttpSession session = request.getSession();
    String loginUser = (String) session.getAttribute("loginUser");
    
    if (StringUtils.isEmpty(loginUser) || "feather".equals(loginUser)){
        //没有登录
        request.setAttribute("msg","某人与无名氏不得入内");
        //将msg返回到index.html
        request.getRequestDispatcher("/index.html").forward(request,response);
        return false;
    }else{
        return true;
    }
}

在MyMvcConfig中

配置路由

registry.addViewController("/main.html").setViewName("list");

配置拦截器

@Override
public void addInterceptors(InterceptorRegistry registry) {
    //addPathPatterns 拦截对象
    //excludePahtPatterns 排除对象
    registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**").excludePathPatterns("/index.html","/","/user/login","css/**","image/**","js/**");
}

现在没有登录就不能直接访问main.html了

如果需要引用session中的元素,只需如下操作

[[${session.loginUser}]]

展示员工列表

首先新建一个LoginController传参

public String list(Model model){
    Collection<Employee> employees = employeeDao.getAll();
    model.addAttribute("employee",employees);
    return "emp/lists";
}

前端列表接收参数

<tr th:each="emp:${employee}">
    <td th:text="${emp.getId()}"></td>
    <td th:text="${emp.getLastName()}"></td>
    <td th:text="${emp.getEmail()}"></td>
    <td th:text="${emp.getGender()==0?'女':'男'}"></td>
    <td th:text="${emp.getDepartment()}"></td>
    <td th:text="${#dates.format(emp.getBirth(),'yyyy/MM/dd HH:mm:SS')}"></td>
</tr>

抽取页面的公共部分

我们一般会抽取出公共组件放入commons.html,然后在需要的地方引用

抽取:

<div th:fragment="topbar">
    
</div>

引用:

<div th:insert="~{commons::topber}"</div>

th:insertth:replace基本相同

<div th:replace="~{commons::topber}"></div>

为了实现点击时高亮的切换

在调用组件的时候传递一些参数

<div th:replace="~{commons::topbar(active='mian.html')}"></div>

在commons.html中在需要参数的地方进行接收参数

<a th:class=${acive='main.html'?'样式一','样式二'}

运用了三元表达式,如果参数等于main.html,则显示样式一,否则显示样式二

实现增加员工

流程

  • [ ] 按钮提交
  • [ ] 跳转到添加页面
  • [ ] 添加员工成功
  • [ ] 返回首页

在EmployeeController中写入一个跳转方法和一个表单接收方法

@GetMapping("/doAdd")
public String doAddpage(Model model){

    //查出所有部门信息以供选择框使用
    Collection<Department> departments = departmentDao.getDepartments();
    model.addAttribute("departments",departments);

    return "emp/add";
}

@PostMapping("/doAdd")
public String AddEmp(Employee employee){
    //不知道为啥拿到controller里面就对了,记录一下      
    employee.setDepartment(departmentDao.getDepartmentById(employee.getDepartment().getId()));

    employeeDao.save(employee);//调用底层业务方法保存员工信息
    System.out.println(employee);

    return "redirect:/emps";
}

这里特别提到,虽然跳转和表单处理两个方法用了同样的跳转路径,但是因为传输方式不同,Get和Post方法的映射虽然重名但是不冲突

为了强调thymleaf的用法这里展示一下表单提交页面以及列表

<form th:action="@{/doAdd}" method="post">
    <div>
        <label>LastName</label>
        <input name="lastName" type="text" placeholder="姓">
    </div>
    <div>
        <label>Email</label>
        <input type="text" name="email" placeholder="用户名">
    </div>
    <div>
        <label>Gender</label>
        <div>
            <input type="radio" name="Gender" value="1">
            <label>公</label>
        </div>
        <div>
            <input type="radio" name="Gender" value="0">
            <label>母</label>
        </div>
    </div>
    <div>
        <label>department</label>
        <select name="department.id">
            <option th:each="dept:${departments}" th:text="${dept.getDepartmentName()}" th:value="${dept.getId()}">1</option>

        </select>
    </div>
    <div>
        <label>Birth</label>
        <input name="birth" type="text" placeholder="生日">
    </div>
    <button type="submit">添加</button>
</form>
<tr th:each="emp:${employee}">
    <td th:text="${emp.getId()}"></td>
    <td th:text="${emp.getLastName()}"></td>
    <td th:text="${emp.getEmail()}"></td>
    <td th:text="${emp.getGender()==0?'女':'男'}"></td>
    <td th:text="${emp.getDepartment()}"></td>
    <td th:text="${#dates.format(emp.getBirth(),'yyyy/MM/dd HH:mm:SS')}"></td>
    <td><a href="">编辑</a></td>
    <td><a href="">删除</a></td>
</tr>
实现员工数据修改

跳转时id的数据传入可以用以下代码实现

<td><a th:href="@{/emp/}+${emp.getId()}">编辑</a></td>

定义方法时,在GetMapping的路径中加入/{id},方法参数类型前加上@PathVariable("id")即可接收页面请求传入的参数。

如果需要从表单传入id,可以用隐藏的input标签

<input name="id" type="hidden" th:value="${employee.getId()}" >

在表单页面预置Controller传入的数据作为原数据显示

这之后调用Dao中的save方法传回数据即可

404处理与注销功能

在templates文件夹下新建一个error文件夹,新建一个404.html,在产生404错误时会自动跳转到这个页面

使注销按钮发送请求到以下方法即可

@RequestMapping("user/logout")
public String logout(HttpSession session){
    session.invalidate();
    return "redirect:/index.html";
}

整合JDBC

首先在pom中引入jdbc和mysql driver

在配置文件中配置jdbc

spring:
datasource:
username: root
password: komeijikoishi
#8以上的sql需要加时区
url: jdbc:mysql://localhost:3306/user?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver

在测试类中可以输出数据源信息

@Autowired
DataSource dataSource;

@Test
void contextLoads() throws SQLException {
    //查看默认数据源 : com.zaxxer.hikari.HikariDataSource
    System.out.println(dataSource.getClass());

    //获取数据库连接
    Connection connection = dataSource.getConnection();
    System.out.println(connection);

    // xxxx Template : SpringBoot预置的模板bean,拿来即用
    // jdbc Template
    // redis Template

    //关闭
    connection.close();
}

springboot预置了很多模板Bean,以xxx Template格式命名,可以拿来即用,这里引用的就是jdbc Template模板Bean

JdbcTemplate jdbcTemplate;

返回一个List<Map<>>的查询指令

List<Map<String,Object>> list_maps = jdbcTemplate.queryForList(sql);

传入sql语句

jdbcTemplate.update(sql);

传入sql语句的同时传入占位符的值

@GetMapping("/delete/{id}")
public String delete(@PathVariable("id")Integer id){
    String sql = "DELETE from t_user where ID = ?";
    jdbcTemplate.update(sql,id);
    return "delete-ok";
}

@GetMapping("/update/{id}")
public String update(@PathVariable("id")Integer id){
    String sql = "update t_user set username = ? where id ="+id;

    Object object = new Object();
    object = "路德维那的父亲";
    jdbcTemplate.update(sql,object);
    return "update-ok";
}

整合Druid数据源

Druid是阿里巴巴开源平台上一个数据库连接池实现,结合了C3P0、DBCP、PROXOOL等DB池的优点,同时加入了日志监控,可以很清晰地监控数据传输

而之前我们整合JDBC时所用的Hikari数据源则是号称Java WEB速度最快的数据源

pom依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.23</version>
    </dependency>

在yaml配置文件中引入

spring:
    datasource:
        type: com.alibaba.druid.pool.DruidDataSource

另外在application.yaml中我们可以配置一些最大连接数,最大等待数,日志记录等

以下是一个示例

        #Spirng Boot 默认不注入这些属性,需要自己绑定
        #druid 数据源专有配置
        initialSize: 5
        minIdle: 5
        maxActive: 5
        timeBetweenEvictionRunsMillis: 60000
        minEvictableTimeMillis: 300000
        validationQuery: SELECT 1 FROM DUAL
        testWhileIdle: true
        testOnBorrow: false
        testOnReturn: false
        poolPreparedStatements: true

        #配置监控统计拦截的filters,stot;监控统计、log4j;日志记录、wall;防御sql注入
        #如果允许时报错  java.lang.ClassNotFoundException: org.apache.log4j.Priority
        #则导入 log4j 依赖即可,Maven 地址:https://mvnrepository.com/artifact/log4j/log4j
        filters: stat,wall,log4j
        maxPoolPreparedStatementPerConnectionSize: 20
        useGlobalDataSourceStat: true
        connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

记得导入log4j

配置Druid的后台监控功能,使用localhost:8080/druid即可访问后台页面

@Configuration
public class DruidConfig {

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource druidDataSource(){
        return new DruidDataSource();
    }

    // 后台监控功能
    @Bean
    public ServletRegistrationBean servletRegistrationBean(){
        ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");

        // 后台需要有人登录,账号密码配置
        HashMap<String, String> initParameters = new HashMap<>();
        // 增加配置
        initParameters.put("loginUsername","admin");  // 登录key是固定的 loginUsername loginPassword
        initParameters.put("loginPassword","123456");

        // 允许谁能访问
        // 值为空,代表所有人可以访问
        initParameters.put("allow","");

        // 禁止谁能访问
        // initParameters.put("codewei","192.168.1.1");  // 指定名字和ip
        bean.setInitParameters(initParameters);  // 设置初始化参数
        return bean;
    }
}

filter的配置

//filter
@Bean
public FilterRegistrationBean webStatFilter(){
    FilterRegistrationBean bean = new FilterRegistrationBean();
    bean.setFilter(new WebStatFilter());

    //可以过滤哪些请求
    Map<String,String > initParameters = new HashMap<>();

    //哪些不进行统计
    initParameters.put("exclusions","*.js,*.css,/druid/*");

    bean.setFilter(new WebStatFilter());


    return bean;
}

整合Mybatis

依赖

mybatis-Spring-Boot-Starter

在Mapper接口上添加注解@Mapper,表示类是一个mybatis接口

或者在启动类上添加注解@MapperScan

然后在接口上添加注解@Repository,注入到IOC中

在yaml中配置mybatis的实体类和配置文件路径

mybatis:
  type-aliases-package: top.moesy.demo9.pojo
  mapper-locations: classpath:mybatis/mapper/*.xml

在resources下新建一个mybatis/mapper文件夹,在这里实现接口即可

其他的就是mybatis的内容了

Last modification:November 25th, 2020 at 01:57 pm