springboot基础(总集)

一、介绍

1、概念

​ 约定大于配置,简单来说就是你所期待的配置与约定的配置一致,那么就可以不做任何配置,约定不符合期待时才需要对约定进行替换配置。

2、特征

  • SpringBoot Starter:他将常用的依赖分组进行了整合,将其合并到一个依赖中,这样就可以一次性添加到项目的Maven或Gradle构建中。
  • 使编码变得简单,SpringBoot采用 JavaConfig的方式对Spring进行配置,并且提供了大量的注解,极大的提高了工作效率,比如@Configuration和@bean注解结合,基于@Configuration完成类扫描,基于@bean注解把返回值注入IOC容器。
  • 自动配置:SpringBoot的自动配置特性利用了Spring对条件化配置的支持,合理地推测应用所需的bean并自动化配置他们。
  • 使部署变得简单,SpringBoot内置了三种Servlet容器,Tomcat,Jetty,undertow.我们只需要一个Java的运行环境就可以跑SpringBoot的项目了,SpringBoot的项目可以打成一个jar包。

3、优点

  • 可以快速独立的创建Spring及主流框架集成的项目。
  • 使用了嵌入式的Servlet容器,无需生成WAR包
  • 我们在使用SpringBoot进行开发时可以使用Starts启动依赖,而SpringBoot会自动地把所需要的其他相关技术jar包导入.
  • 大量的自动配置,极大地简化了我们的开发。
  • 无需XML文件的大量编写,也不会生成代码,底层是利用SpringBoot写好的API来调用实现,开箱即用
  • SpringBoot也有运维监控项目的功能
  • SpringBoot与云计算的集成

二、创建springboot项目

1、选择项目类型

​ idea通过spring官方网站Spring Initializr 创建springboot项目

2、选择需要的启动器

​ 后期通过手动maven添加也行,不过一般web启动器还是必选的,可以选择springboot版本不过都是比较新的版本。

3、pom.xml

​ 第八行确定了spingboot版本,如有需要可以手动降低版本。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.zhangxin.springboot</groupId>
    <artifactId>SpringBoot</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>SpringBoot</name>
    <description>SpringBoot</description>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
<!--thymleaf-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

4、springboot启动类

​ @SpringBootApplication是springboot核心注解,SpringApplication.run(Application.class, args)启动springboot项目,一般这个类都很干净。

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

三、springboot目录

  • src/main/java:主程序入口application,可以通过直接运行该类来启动 Spring Boot 应用
  • src/main/resources:配置目录,该目录用来存放应用的一些配置信息,比如应用名、服务端口、数据库配置等。由于我们应用了 Web 模块,因此产生了 static 目录与 templates 目录,前者用于存放静态资源,如图片、CSS、JavaScript 等;后者用于存放 Web 页面的模板文件。
  • src/test:单元测试目录,生成的 ApplicationTests 通过 JUnit4 实现,可以直接用运行 Spring Boot应用的测试。
  • application.properties/application.yml 用于存放程序的各种依赖模块的配置信息,比如服务端口,数据库连接配置等

1、常见代码层结构

(1)java根目录

在根目录下:

  • 实体类(domain/pojo)在根目录的domain或pojo下
  • 数据访问层(dao)在根目录的repository或dao下
  • 数据服务层(Service)在根目录的service下,数据服务的实现接口(serviceImpl)在根目录的service.impl下
  • 前端控制器(controller)在根目录的controller下
  • 工具类(utils)在根目录的utils下
  • 常量接口类(constant)在根目录的constan下
  • 配置信息类(config)在根目录的config下
  • 数据传输类(vo)在根目录的vo下。

(2)资源文件的结构

  • 根目录:src/main/resources
  • 项目配置文件:resources/application.yml
  • 静态资源目录:resources/static/ ——用于存放html、css、js、图片等资源
  • 视图模板目录:resources/templates/ ——用于存放jsp、thymeleaf等模板文件(不可直接用url访问,需要使用controller)
  • mybatis映射文件:resources/mapper/(mybatis项目)
  • mybatis配置文件:resources/mapper/config/(mybatis项目)
  • 国际化(i18n))置于i18n文件夹下
  • 页面以及js/css/image等置于static文件夹下的各自文件下

四、springboot配置文件

1、 SpringBoot默认配置文件

  • SpringBoot使用默认的全局的配置文件:application.properties/application.yml
  • 配置文件名固定是是application
`application.properties`
	语法结构: key=value
`application.yml`
	语法结构: key:空格 value

2、yaml

​ yaml是官方推荐的配置文件格式。

(1)基本语法

​ 对空格要求高

  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进不允许使用tab,只允许空格
  • 缩进的空格数不重要,只要相同层级的元素左对齐即可
  • #表示注释

(2)注入实体类

dog.java

@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
public class Dog {
    @Value("狗")
    private String name;
    @Value("12")
    private  Integer age;
}

person.java

​ @ConfigurationProperties作用:将配置文件中配置的每一个属性的值,映射到这个组件中;告诉SpringBoot将本类中的所有属性配置文件中相关的配置进行绑定参数 prefix = “person” : 将配置文件中的person下面的所有属性一一对应

@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
@ConfigurationProperties(prefix="person")
public class Person {
    private String name;
    private Integer age;
    private Boolean happy;
    private Date date;
    private HashMap<String,Object> mp;
    private List<Object> list;
    private Dog dog;
}

application.yaml

person:
  name: 张三
  age: 10
  happy: true
  date: 2000/1/1
  mp: {k1: v1,k2: v2}
  list: [哈哈,abc,123]
  dog:
    name:age: 3

test

@SpringBootTest
class ApplicationTests {
    @Autowired
    private Person person;
    @Test
    void contextLoads() {
        System.out.println(person);
    }
}

3、多环境部署yaml

​ 在实际开发中我们不止一个yaml,有开发环境(dev)、生产环境(prod)和测试环境(test),不同环境对应不同不同的yaml配置文件,可以使用多个yaml文件来灵活切换环境。

​ 使用application.yaml来选择不同的环境,使用后缀切换环境,这里使用的是application-dev.yml。

spring:
  profiles:
    active: dev

五、静态资源

1、自定义banner

​ 只需要创建一个resources/banner.txt,内容就是新的springboot banner

                               __....__
                           .gd$$$$$$$$$$bp.
                        .-"^^^T$$$$$$$$$$$$$p.
                      .'       "^T$$$$$$$$$$$$b.
                    .'            `T$$$$$$$$$$$$b.
                   /     .d$$b.     T$$$$$$$$$$$$$b
                  /     d$$$$$$b     $$$$$$$$$$$$$$b
                 :     :$$$$$$$$;    :$$$$$$$$$$$$$$;
                 ;      T$$$$$$P     :$$$$$$$$$$$$$$$
                :        "^$$^"      $$$$$$$$$$$$$$$$;
                ;                   d$$$$$$$$$$$$$$$$$
                |                 .d$$$$$$$$$$$$$$$$$$
                ;                d$$$$$$$$$$$$$$$$$$$$
                :               :$$$$$$P^""^T$$$$$$$$;
                 ;              $$$$$$P      T$$$$$$$
                 :              $$$$$$        $$$$$$;
                  \             :$$$$$b      d$$$$$P
                   \             T$$$$$bp..gd$$$$$P
                    `.            `T$$$$$$$$$$$$P'
                      `.            "^$$$$$$$$P'
                        "-.            "^^T$P'
                   bug     "--...____...--"

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

2、自定义网站favicon.ico

​ 创建resources/static/favicon.ico即可

3、默认静态资源目录

​ 默认情况下,以下目录为默认的静态资源目录。其中的静态资源可以被直接访问,优先级从上往下,当多个静态资源目录中出现同名文件时,越靠上的目录权重越高。classpath一般对应springboot项目的src/main/resources

  • classpath:/META-INF/resources/
  • classpath:/resources/
  • classpath:/static/
  • classpath:/public/

另外/src/main/resource/templates/也是默认访问目录一般存放页面但是需要引入thymeleaf相关依赖

六、Thymeleaf模板引擎

1、简介

​ Thymeleaf是适用于Web和独立环境的现代服务器端Java模板引擎 (之前用的jsp也是模版引擎但是比较弱),是springboot官方推荐使用的模板引擎。

2、配置

(1)Maven依赖

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

(2)yaml关闭缓存

​ Thymeleaf默认会开启页面缓存,提高页面并发能力。但会导致我们修改页面不会立即被展现,因此我们关闭缓存。

# 关闭Thymeleaf的缓存
spring:
  thymeleaf:
    cache:
      false

3、基本用法

​ 在html标签内的属性前加th:,大部分属性都支持的。

(1)基本表达式

​ 这里着重介绍变量表达式URL表达式

变量表达式${name}:如果session或model中有名为name的key,就可以取出name的value。

<span th:text="${name}">  

URL表达式@{/…/…},在/templates目录下会把静态资源(css,js,img)过滤,但是如果url由Thymeleaf管理就可以成功访问资源。'/'指的是resources/static目录

<link th:href="@{/css/bootstrap.min.css}"/>

(2)常用标签

  • 文本替换

    <p th:text="${user.name}">name</p>
    
  • 属性赋值

    <input th:value="${user.name}" >
    
  • 替换资源/超链接

    <script type="text/javascript" th:src="@{/index.js}"></script>
    
  • 点击事件

    <p th:onclick="'getCollect()'"></p>
    
  • for-each

    <tbody th:each="it:${list}">
        <tr>
           <th th:text="${it.getId()}" ></th>
           <td th:text="${it.getUsername()}"></td>
       </tr>
     </tbody>
    
  • if

    <a th:if="${userId == collect.userId}" >
    
  • switch-case

    <!-- th:switch / th:case -->
    <div th:switch="${user.name}">
      <p th:case="'admin'">User is an administrator</p>
      <!-- *: case的默认的选项 -->
      <p th:case="*">User is some other thing</p>
    </div>
    
  • 公共页面
    前端其实许多页面组成是重复的,比如侧边栏、头部导航栏、底部导航栏等,为了提高代码复用性可以使用公共页面。

    th:fragment标记此标签为模板,根据名字可以引用模板

    <div class="navMenu" th:fragment="header">
      <div class="navMenuContain">
        导航菜单
      </div>
    </div>
    

    th:replace引用
    表示引用cmment目录下的comment.html的header模板

    <div th:replace="~{comment/comment::headbar}"></div>
    

    th:include引用

    <div th:insert="~{comment/comment::headbar}"></div>
    

    include和replace区别

    th:include:引入子模块的children,依然保留父模块的tag。
    th:replace:引入子模块的所有,不保留父模块的tag。

(3)传参

​ 在连接地址的后面加上(key=‘value’),下面表示点击这个超链接会向/index.html传入名为l的参数,参数值是’参数’。

<a class="btn btn-sm" th:href="@{/index.html(l='参数')}">11111</a>

4、常用函数

​ 这篇博客大佬列举的很全Thymeleaf 常用函数_thymeleaf 函数-CSDN博客

七、员工管理demo

1、数据库表

(1)employee表

(2)department表

2、目录结构

(1)java根目录

(2)资源文件目录

3、maven依赖

​ 需要导入thymeleaf启动器 、web启动器、mybatis启动器、jdbc启动器、mysql启动器已经Lombok依赖,这里之前springboot版本是3.2.2但是出现了应该是mybatis版本不兼容问题,所以降为3.1.2。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.1.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.zhangxin</groupId>
    <artifactId>springboot-web</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-web</name>
    <description>springboot-web</description>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
<!--   thymeleaf启动器     -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
<!--   web启动器     -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
<!--    测试-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
<!--        mybatis-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>3.0.0</version>
        </dependency>
<!--        jdbc-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
<!--        mysql-->
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
<!--        lombok-->
        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.30</version>
            <scope>provided</scope>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

4、pojo

(1)Department类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Department {
    private Integer dId;
    private String dName;
}

(2)Employee类

@NoArgsConstructor
@Data
public class Employee {
    private Integer eId;
    private String eName;
    private String email;
    private Integer gender;//0女 1男
    private Integer dId;
    private Date birth;
//这里选择让birth获取当前时间赋值
    public Employee(Integer eId, String eName, String email, Integer gender, Integer dId) {
        this.eId = eId;
        this.eName = eName;
        this.email = email;
        this.gender = gender;
        this.dId = dId;
        birth=new Date();
    }
}

5、mapper(dao)

​ 作为持久层(model)负责和数据库交互,直接和数据库进行数据交换。

​ @mapper注解可以自动为接口生成对应实现类并注入容器,所以@Repository注解的作用主要还是标识作用,如果觉得一个个添加@mapper注解麻烦可以使用@MapperScan(“”)注解扫描mapper接口所在的包。
​ 其实使用了@Mapper就可以不用写mpaaer.xml文件了,但是这样就需要sql写在java代码中,使用用@Select、@insert注解,具体怎么写sql还是看个人习惯。

(1)DepartmentMapper

@Repository
@Mapper
public interface DepartmentMapper {
    //    获取所有的部门信息
    Collection<Department> getDepartments();
}

(2)EmployeeMapper

@Repository
@Mapper
public interface EmployeeMapper {
//    添加
    void addEmployee(Employee employee);
//    更新
    void updateEmployee(Employee employee);
    //    查询全部
    Collection<Employee> getAllEmployee();
    //    通过id
    Employee getEmployeeById(Integer id);
    //    删除员工
    void deleteEmployeeById(Integer id);
}

6、service

​ 作为业务层调用dao层,里面可以添加一些具体的业务,一般是规定一个service接口serviceImp继承并调用对应的dao层,使用@service注解把serviceImp注入容器并且表示这是service层。

(1)DepartmentService

public interface DepartmentService {
    //    获取所有的部门信息
    Collection<Department> getDepartments();

     //    获取id和name的mapper
    public HashMap<Integer,String> getIdNameMap();
}

(2)DepartmentServiceImp

​ 这里因为直接用sql语句很难查询出一个id和name的HashMap所以我选择在业务层处理这个HashMap,这个HashMap的作用主要是在页面上可以根据dId查询出dName。

@Service
public class DepartmentServiceImp implements DepartmentService{
    @Autowired
    private DepartmentMapper departmentMapper;
    @Override
    public Collection<Department> getDepartments() {
        return departmentMapper.getDepartments();
    }
    @Override
    public HashMap<Integer, String> getIdNameMap() {
        Collection<Department> departments = departmentMapper.getDepartments();
        HashMap<Integer, String> map=new HashMap<>();
        departments.forEach(department -> {
            map.put(department.getDId(),department.getDName());
        });
        return map;
    }

(3)EmployeeService

public interface EmployeeService {
    //    添加
    void addEmployee(Employee employee);
    //    更新
    void updateEmployee(Employee employee);
    Collection<Employee> getAllEmployee();
    //    通过id
    Employee getEmployeeById(Integer id);
    //    删除员工
    void deleteEmployeeById(Integer id);
}

(4)EmployeeServiceImp

@Service
public class EmployeeServiceImp implements EmployeeService{
    @Autowired
    private EmployeeMapper employeeMapper;
    @Override
    public void addEmployee(Employee employee) {
        employeeMapper.addEmployee(employee);
    }

    @Override
    public void updateEmployee(Employee employee) {
        employeeMapper.updateEmployee(employee);
    }

    @Override
    public Collection<Employee> getAllEmployee() {
        return employeeMapper.getAllEmployee();
    }

    @Override
    public Employee getEmployeeById(Integer id) {
        return employeeMapper.getEmployeeById(id);
    }

    @Override
    public void deleteEmployeeById(Integer id) {
        employeeMapper.deleteEmployeeById(id);
    }
}

7、controller

​ Controller 在 spring 中代表的是控制层,是将访问者请求进行分发调用不同函数,来控制获取请求参数以及返回service层处理完的数据给访问者的层面。它在 spring 中必须在 Controller 类前添加 @Controller 注解,以注入容器中,并发挥作用。

(1)LoginController

​ 负责登录验证和注销,我这里就是密码判断一下是否是“123”即可,session.invalidate()就是销毁session下次登录需要重新创建。

@Controller
public class LoginController {
    @RequestMapping(value = "/user/login")
    public String login(@RequestParam("username") String username, @RequestParam("password")String password,
                        Model model, HttpSession session){
        if(!StringUtils.isEmpty(username)&&password.equals("123")){
            session.setAttribute("loginUser",username);
            /**
             * 通过就重定向到主页(后面重写了WebMvcConfigurer的addViewControllers方法,
             * 绑定了主页和main.html,实际上是不存在main.html的)
             */
            return "redirect:/main.html";
        }else{
             /**
             * 不通过就返回登录页,返回错误信息
             */
            model.addAttribute("err","信息错误!");
            return "index";
        }

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

(2)MyController

​ 自定义404界面,@RequestMapping固定为"/test",在输入一些不存在的页面的时候就可以跳到你自定义的404.html了

@Controller
public class MyController {
    @RequestMapping("/test")
    public String test(){
        return "error/404";
    }
}

(3)EmployeeController

​ 视图跳转的主要controller。

@Controller
public class EmployeeController {

    @Resource
    private EmployeeService employeeService;
    @Resource
    private DepartmentService departmentService;

    @RequestMapping("/emp")
    public String list(Model model){
        model.addAttribute("emps",employeeService.getAllEmployee());
        model.addAttribute("dmap",departmentService.getIdNameMap());
        return "emp/list";
    }
    @GetMapping("/addEmp")
    public String toAddPage(Model model){
        model.addAttribute("deps",departmentService.getDepartments());
        return "emp/addEmp";
    }
    @PostMapping("/addEmp")
    public String addEmp(Employee employee){
        employeeService.addEmployee(employee);
        return "redirect:emp";
    }
    @GetMapping("/updateEmp")
    public String toUpdatePage(Model model,Integer id ){
        model.addAttribute("deps",departmentService.getDepartments());
        model.addAttribute("emp",employeeService.getEmployeeById(id));

        return "emp/updateEmp";
    }
    @PostMapping("/updateEmp")
    public String updateEmp(Employee employee){
        employeeService.updateEmployee(employee);
        return "redirect:emp";
    }
    @RequestMapping("/deleteEmp")
    public String deleteEmp(Integer id){
        employeeService.deleteEmployeeById(id);
        return "redirect:emp";
    }
}

8、Mapper.xml

​ 编写mapper接口类对应的sql语句,注意resultType表示返回值类型,parameterType表示参数类型。

(1)DepartmentMapper.xml

<?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">
<!--namespace要和一个接口的全类名一致-->
<mapper namespace="com.zhangxin.springbootweb.mapper.DepartmentMapper">
<!--Collection<Department> getDepartments();-->
    <select id="getDepartments" resultType="Department" >
        select * from department;
    </select>

</mapper>

(2)EmployeeMapper.xml

<?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">
<!--namespace要和一个接口的全类名一致-->

<mapper namespace="com.zhangxin.springbootweb.mapper.EmployeeMapper">

<!--    void addEmployee(Employee employee);-->
    <insert id="addEmployee" parameterType="Employee">
        insert into employee
        values(null,#{eName},#{email},#{gender},#{dId},#{birth});
    </insert>
<!--    void updateEmployee(Employee employee);-->
    <update id="updateEmployee" parameterType="Employee">
        update employee
        set e_name=#{eName},email=#{email},gender=#{gender},d_id=#{dId},birth=#{birth}
        where e_id=#{eId};
    </update>
<!--    Collection<Employee> getAllEmployee();-->
    <select id="getAllEmployee" resultType="Employee">
            select * from employee;
    </select>
<!--    Employee getEmployeeById(Integer id);-->
    <select id="getEmployeeById" resultType="Employee" parameterType="int">
        select * from employee where e_id=#{id};
    </select>
<!--    void deleteEmployeeById(Integer id);-->
    <delete id="deleteEmployeeById" parameterType="int">
        delete from employee where e_id=#{id};
    </delete>
</mapper>

9、config

​ 关系项目的整体配置类。

(1)登录拦截器(HandlerInterceptor)

​ 对应没有登录但访问页面行为进行拦截,通过是否有loginUser判断是否完成登录,没有完成登录就返回登录页并且添加错误信息。

public class LoginHandlerInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//      检查session,后面有登录页面的放行
        Object loginUser = request.getSession().getAttribute("loginUser");
        if(loginUser==null){
            request.setAttribute("err","无权限,请先登录");
            request.getRequestDispatcher("/index.html").forward(request,response);
            return false;
        }else return true;
    }
}

(2)WebMvcConfigurer

​ 可以自定义拦截器、消息转换器、视图跳转控制器等配置,它的拦截器和HandlerInterceptor配置的拦截器一个效果。

@Configuration
public class MyConfig implements WebMvcConfigurer {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("index");
        registry.addViewController("/index.html").setViewName("index");
        registry.addViewController("/main.html").setViewName("dashboard");
    }
    @Bean
    public LocaleResolver localeResolver(){
        return new MyLocalResolver();
    }
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**")
          .excludePathPatterns("/index.html","/user/login" ,"/css/**","/js/**","/img/**","/");
    }
}
  • addViewControllers是视图跳转控制器可以减少controller的代码量,比如上面的 addViewControllers执行效果分别是
    跳转到"/“等效于"index”、跳转到"/index.html"等效于"index"、跳转到"/main.html"等效于"dashboard"。
    注意:setViewName对应的是@RequestMapping中的地址。
  • localeResolver是注入一个关于国际化的Bean,其实写在任意@Configuration标识的类都行与WebMvcConfigurer本身无太大关系
  • addInterceptors是拦截器其中registry.addInterceptor()添加一个拦截器
    addPathPatterns(“/**”)这里指的是拦截所有请求
    excludePathPatterns()表示放行的请求地址,就像之前的登录拦截器实际上登录页面session也没有登录者所以应该被拦截,但是这里对登录的页面进行了放行。

(3)国际化

​ 在项目开发过程中,可能会针对不同的国家的用户提供不同的视图,如针对美国用户提供一个视图,针对中国用户提供一个视图,这时候就需提供在同个页面上,能切换不同的语言,而LocaleResolver能够帮我们实现这种切换。

​ resolveLocale()方法获取前端传过来的参数,根据参数判断国际地区,上面的MyConfig类已经实现了MyLocalResolver的注入。

//地址解析
public class MyLocalResolver implements LocaleResolver {
    @Override
    public Locale resolveLocale(HttpServletRequest request) {
//        获取参数
        String l = request.getParameter("l");
        Locale locale = Locale.getDefault();//获取默认
        if(!StringUtils.isEmpty(l)){//非空
            String[] s = l.split("_");
            locale=new Locale(s[0],s[1]);
        }
        return locale;
    }
    @Override
    public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {

    }
}

前端对应的国际化的标签

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

i18n国际化资源文件

默认:login.properties

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

中文:login_zh.properties

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

英文:login_en_us.properties

login.btn=sign in
login.password=Password
login.remember=Remember me
login.tip=Please sign in
login.username=username

需要国际化的页面

​ Thymeleaf动态展示国际化页面,使用 th:placeholder="#{ }"绑定国际化的资源文件里的元素。

<input name="username" type="text"  th:placeholder="#{login.username}">

10、application.yaml

​ springboot的核心配置文件。

#规定端口
server:
  port: 8080

spring:
  thymeleaf:
    #关闭thymeleaf缓存
    cache: false
  messages:
    #自定义的国际化配置引入
    basename: i18n.login
  mvc:
    format:
      #设置日期格式
      date: yyyy-MM-dd
  #数据库信息
  datasource:
    username: root
    password: 1234567
    url: jdbc:mysql://localhost:3306/spring_boot_blog?autoReconnect=true&useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis:
  configuration:
    #下划线命名转化为驼峰命名
    map-underscore-to-camel-case: true
  #导入需要识别的类的包,即数据库表对应的实体类pojo
  type-aliases-package: com.zhangxin.springbootweb.pojo
  #导入mapper所在的包(写sql的xml)
  mapper-locations: classpath:mapper/*.xml

八、openAPI(swagger3)

1、介绍

​ Swagger 是一个 RESTful API 的开源框架,它的主要目的是帮助开发者设计、构建、文档化和测试 Web API。

​ OpenAPI规范最初由开发Swagger的团队在2010年推出,从Swagger 2.0开始,Swagger规范被正式更名为OpenAPI规范,并得到了许多社区的支持和贡献

2、依赖

<dependency>
  <groupId>org.springdoc</groupId>
  <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
  <version>2.0.2</version>
  <exclusions>
    <exclusion>
      <artifactId>slf4j-api</artifactId>
      <groupId>org.slf4j</groupId>
    </exclusion>
  </exclusions>
</dependency>

3、swagger页面

​ 本地页面:http://localhost:8080/swagger-ui.html

4、SwaggerConfig

@Configuration
public class SwaggerConfig {
    @Bean
    public OpenAPI springShopOpenAPI() {
        return new OpenAPI()
                .info(new Info().title("标题")
                        .description("这是描述")
                        .version("这是版本")
                        .license(new License().name("Apache 2.0").url("#")))
                .externalDocs(new ExternalDocumentation()
                        .description("外部文档")
                        .url("#"));//外部文档链接
    }
}

访问swagger

测试controller

@RestController
@Tag(name = "测试Controller(test)", description = "这是描述")
public class HelloController {

    @GetMapping("test")
    @Operation(summary = "测试接口hello1")
    public String hello1(@Parameter(name = "name", description = "hello1的参数名称")String name){
        return "Hello"+name;
    }
}

可以直接在前端输入参数进行测试

5、注解解释

引用博客:Swagger3 注解使用(Open API 3)_swagger3注解-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值