springboot(二)

视频链接:https://www.bilibili.com/video/BV1XQ4y1m7ex/?vd_source=9545770e4a2968c05878ffac8589ec6c
视频选集:P30— P57

1.Web组件

1.1 复习springMVC拦截器

拦截器是SpringMVC中一种对象,能拦截对Controller的请求。
拦截器框架中有系统的拦截器,还可以自定义拦截器。实现对请求预先处理。

实现自定义拦截器:

  1. 创建类实现SpringMVC框架的Handlerlnterceptor接口
    在这里插入图片描述
  2. 需在SpringMVC的配置文件中,声明拦截器
    在这里插入图片描述

1.2 springboot中拦截器

在这里插入图片描述
自定义拦截器:

package com.bjpowernode.web;

import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//自定义的拦截器
public class LoginInterceptor implements HandlerInterceptor {


    /**
     *
     * @param request
     * @param response
     * @param handler  被拦截的的控制器对象
     * @return  boolean
     *          true:请求能被Controller处理
     *          false:请求被截断
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response,
                             Object handler) throws Exception {
        System.out.println("执行了LoginInterceptor的preHandle");
        return true;
    }
}

将拦截器注入到容器中:

package com.bjpowernode.config;

import com.bjpowernode.web.LoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;


@Configuration
public class MyAppConfig implements WebMvcConfigurer {


    //添加拦截器对象,注入到容器中
    @Override
    public void addInterceptors(InterceptorRegistry registry) {

        //创建拦截器对象
        HandlerInterceptor interceptor = new LoginInterceptor();

        //指定拦截的请求url地址
        String path []= {"/user/**"};
        //指定不拦截的地址
        String excludePath []= {"/user/login"};
        registry.addInterceptor(interceptor)
                .addPathPatterns(path)
                .excludePathPatterns(excludePath);
    }
}

controller:

package com.bjpowernode.controller;

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

@Controller
public class BootController {

    @RequestMapping("/user/account")
    @ResponseBody
    public String userAccount(){
        return "访问user/account地址";
    }

    @RequestMapping("/user/login")
    @ResponseBody
    public String userLogin(){
        return "访问user/login地址";
    }
}

测试效果:

在这里插入图片描述
在这里插入图片描述

1.3 springboot中使用servlet

在SpringBoot框架中使用Servlet对象。
使用步骤∶

  1. 创建Servlet类。创建类继承HttpServlet
  2. 注册Servlet ,让框架能找到Servlet

在这里插入图片描述

创建自定义的servlet:

package com.bjpowernode.web;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

//创建servlet类
public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //使用HttpServletResponse输出数据,应答结果
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter out = resp.getWriter();
        out.println("执行的是Servlet");
        out.flush();
        out.close();
    }
}

注册servlet:

package com.bjpowernode.config;

import com.bjpowernode.web.MyServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class WebApplictionConfig {

    //定义方法,注册Servlet对象
    @Bean
    public ServletRegistrationBean servletRegistrationBean(){

        //public ServletRegistrationBean(T servlet, String... urlMappings)
        //第一个参数是Servlet对象,第二个是url地址
        ServletRegistrationBean bean = new ServletRegistrationBean(new MyServlet(),"/myservlet");

        return bean;
    }
}

测试:

在这里插入图片描述

注意:

在这里插入图片描述

1.4 springboot中使用过滤器Filter

Filter是Servlet规范中的过滤器,可以处理请求,对请求的参数,属性进行调整。常常在过滤器中处理字符编码

在框架中使用过滤器︰

  1. 创建自定义过滤器类
  2. 注册Filter过滤器对象

创建自定义过滤器:

package com.bjpowernode.web;

import javax.servlet.*;
import java.io.IOException;

//自定义过滤器
public class MyFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) 
    					throws IOException, ServletException {
        System.out.println("执行了MyFilter,doFilter");
        filterChain.doFilter(servletRequest,servletResponse);
    }
}

注册Filter过滤器对象:

package com.bjpowernode.config;


import com.bjpowernode.web.MyFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class WebApplicationConfig {

    @Bean
    public FilterRegistrationBean filterRegistrationBean(){
        FilterRegistrationBean bean = new FilterRegistrationBean();
        bean.setFilter(new MyFilter());
        bean.addUrlPatterns("/user/*");
        return bean;
    }
}

创建controller:

package com.bjpowernode.controller;

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

@Controller
public class CustomFilterController {

    @RequestMapping("/user/account")
    @ResponseBody
    public String userAccount(){
        return "user/account";
    }

    @RequestMapping("/query")
    @ResponseBody
    public String queryAccount(){
        return "/query";
    }
}

测试:

在这里插入图片描述
在这里插入图片描述

1.5 字符集过滤器的应用

CharacterEncodingFilter :解决post请求中乱码的问题
在SpringMVC框架,在web.xml注册过滤器。配置他的属性。

1.5.1 展现问题

在这里插入图片描述

定义servlet:

package com.bjpowernode.web;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html");
        PrintWriter out = resp.getWriter();
        out.println("在Servlet输出中文");
        out.flush();
        out.close();
    }
}

注册Servlet:

package com.bjpowernode.config;

import com.bjpowernode.web.MyServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class WebSystemConfig {

    @Bean
    //注册Servlet
    public ServletRegistrationBean servletRegistrationBean(){

        MyServlet myServlet = new MyServlet();
        ServletRegistrationBean reg = new ServletRegistrationBean(myServlet,"/myservlet");
        return reg;
    }
}

测试:

在这里插入图片描述
在这里插入图片描述

1.5.2 解决问题

配置字符集过滤器:

package com.bjpowernode.config;

import com.bjpowernode.web.MyServlet;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.CharacterEncodingFilter;


@Configuration
public class WebSystemConfig {

    @Bean
    //注册Servlet
    public ServletRegistrationBean servletRegistrationBean(){

        MyServlet myServlet = new MyServlet();
        ServletRegistrationBean reg = new ServletRegistrationBean(myServlet,"/myservlet");
        return reg;
    }
	
	//字符集过滤器
    @Bean
    public FilterRegistrationBean filterRegistrationBean(){
        FilterRegistrationBean reg = new FilterRegistrationBean();

        //使用框架中的过滤器类
        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        //指定使用的编码方式
        filter.setEncoding("utf-8");
        //指定request,response都使用encoding的值
        filter.setForceEncoding(true);

        reg.setFilter(filter);
        //指定 过滤的url地址
        reg.addUrlPatterns("/*");

        return reg;
    }
}

修改application.properties文件,让自定义的过滤器起作用:

#SpringBoot中默认已经配置了CharacterEncodingFilter。编码默认ISO-8859-1
#设置enabled=false作用是关闭系统中配置好的过滤器,使用自定义的
server.servlet.encoding.enabled=false

测试:

在这里插入图片描述

1.5.3 在application配置设置编码方式

在这里插入图片描述
注:server.servlet.encoding.enabled默认就是true,所以可以不用设置

2.ORM操作MySQL

讲解MyBatis框架,读写MySQL 数据。通过SpringBoot +MyBatis实现对数据库学生表的查询操作。
使用MyBatis框架操作数据,在SpringBoot框架集成MyBatis

使用步骤:

  1. mybatis起步依赖︰完成mybatis对象自动配置,对象放在容器中
  2. pom.xml指定把src/main/java目录中的xml文件包含到classpath中
  3. 创建实体类Student
  4. 创建Dao接口StudentDao,创建一个查询学生的方法
  5. 创建Dao接口对应的Mapper文件,xml文件,写sql语句
  6. 创建Service层对象,创建StudentService接口和他的实现类。去调用dao对象的方法。完成数据库的操作
  7. 创建Controller对象,访问Service
  8. 写application.properties文件【配置数据库的连接信息】

2.1 创建student表

视频中在navicat中设计表,我在这用IDEA连接MySQL 后,直接操作增加表和添加数据:

在这里插入图片描述

2.2 MyBatis起步依赖

在这里插入图片描述

<dependencies>
        <!--ctrl+shift+/-->
        <!--web起步依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--mybatis起步依赖-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.2</version>
        </dependency>

        <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

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

2.3 创建Dao接口和Mapper文件

在这里插入图片描述

定义实体类:

package com.bjpowrnode.model;

public class Student {
    private Integer id;
    private String name;
    private Integer age;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

创建Dao接口:

package com.bjpowrnode.dao;

import com.bjpowrnode.model.Student;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

@Mapper //告诉MyBatis这是dao接口,创建此接口的代理对象【位置:在类的上面】
public interface StudentDao {

    Student selectById(@Param("stuId") Integer id);
}

创建Dao的Mapper文件:

<?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.bjpowrnode.dao.StudentDao">
    <!--定义sql语句-->
    <select id="selectById" resultType="com.bjpowrnode.model.Student">
        select id,name,age from student where id = #{stuId}
    </select>
</mapper>

2.4 创建业务层对象

在这里插入图片描述
创建Service接口:

package com.bjpowrnode.service;

import com.bjpowrnode.model.Student;

public interface StudentService {

    Student queryStudent(Integer id);

}

接口实现类:

package com.bjpowrnode.service.impl;

import com.bjpowrnode.dao.StudentDao;
import com.bjpowrnode.model.Student;
import com.bjpowrnode.service.StudentService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;


@Service
public class StudentServiceImpl implements StudentService {

    @Resource //自动注入
    private StudentDao studentDao;

    @Override
    public Student queryStudent(Integer id) {
        Student student = studentDao.selectById(id);
        return student;
    }
}

2.5 创建Controller

在这里插入图片描述

package com.bjpowrnode.controller;

import com.bjpowrnode.model.Student;
import com.bjpowrnode.service.StudentService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.Resource;

@Controller
public class StudentController {

    @Resource
    private StudentService studentService;


    @RequestMapping("/student/query")
    @ResponseBody
    public String queryStudent(Integer id){
        Student student = studentService.queryStudent(id);
        return student.toString();
    }
}

2.6 配置文件

配置resources插件:

<build>
        <!--resources插件-->
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </resources>

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

properties文件:


server.port=8083
server.servlet.context-path=/orm

#连接数据库  mysql驱动新版的驱动类
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456

2.7 测试MyBatis访问数据

测试:

在这里插入图片描述
在这里插入图片描述

2.8 第一种方法:@Mapper

@Mapper:放在dao接口的上面,每个接口都需要使用这个注解。

package com.bjpowrnode.dao;

import com.bjpowrnode.model.Student;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

@Mapper //告诉MyBatis这是dao接口,创建此接口的代理对象【位置:在类的上面】
public interface StudentDao {

    Student selectById(@Param("stuId") Integer id);
}

2.9 第二种方法:@MapperScan

在这里插入图片描述

2.10 第三种方法:Dao接口和Mapper文件分开

现在把Mapper文件放在resources目录下
1 )在resources目录中创建子目录(自定义的),例如mapper
2)把mapper文件放到 mapper目录中
3 )在application.properties文件中,指定mapper文件的目录
在这里插入图片描述
4)在pom.xml中指定把resources目录中的文件,编译到目标目录中
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
添加日志信息:

#指定mybatis的日志
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

在这里插入图片描述

2.11 spring中的事务控制

Spring框架中的事务∶

  1. 管理事务的对象︰事务管理器(接口,接口有很多的实现类)
    例如︰使用Jdbc或mybatis访问数据库,使用的事务管理器:DataSourceTransactionManager
  2. 声明式事务︰在xml配置文件或者使用注解说明事务控制的内容
    控制事务︰隔离级别,传播行为,超时时间
  3. 事务处理方式︰
    1 ) Spring框架中的@Transactional
    2) aspectj框架可以在xml配置文件中,声明事务控制的内容

SpringBoot中使用事务︰上面的两种方式都可以。

  1. 在业务方法的上面加入@Transactional,加入注解后,方法有事务功能了。
  2. 明确的在主启动类的上面,加入@EnableTransactionManager

2.11.1 修改pom.xml

其中GeneratorMapper.xml为视频中的一个插件,放在目标下的【这木有】

<build>

        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.*</include>
                </includes>
            </resource>
        </resources>


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

            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.6</version>
                <configuration>
                    <!--配置文件的位置-->
                    <configurationFile>GeneratorMapper.xml</configurationFile>
                    <verbose>true</verbose>
                    <overwrite>true</overwrite>
                </configuration>
            </plugin>
        </plugins>
    </build>

2.11.2 使用MyBatis生成器

在这里插入图片描述
运行效果:

在这里插入图片描述

2.11.3 application配置文件

在这里插入图片描述

2.11.4 public方法加入@Tranactional

创建service
在这里插入图片描述

2.11.5 完成事务设置

创建controller:

在这里插入图片描述
在启动类中:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值