ssm整合全篇学习笔记

ssm整合思路

包含Spring,SpringMvc,Mybatis

我们要达到什么目的

  1. 我们要让Mybatis作为持久层的调用者(为Service层提供必要的持久化支持,帮助Service更好的编写业务逻辑),

  2. 让SpringMvc成为Controller层的调用者,向前端提供调用服务

  3. Spring作为容器和注入技术的提供者,为MVC三层都提供底层支持。


最终效果演示

less 复制代码
@RestController
@RequestMapping("emp")
public class empController {
    @Autowired
    EmpService empService;

    @GetMapping()
    public Emp selectEmpById(){
         return empService.selectEmpMyId(1);
    }
}

上面是一段Controller层代码,Spring为我们自动注入了Service层的实例,我们可以直接使用Service层的代码

typescript 复制代码
@Service
public class EmpServiceImpl implements EmpService{

    @Autowired
    EmpMapper empMapper;
    public Emp selectEmpMyId(Integer id){
        return empMapper.getEmpById(id);
    }
}

这是上面所调用的Service层的代码,我们在Service层调用了Mybatis提供的Mapper服务,操作数据库,辅助我们完成我们的代码逻辑,向Controller提供服务

csharp 复制代码
public interface EmpMapper {
    Emp getEmpById(Integer id);
}

Mapper就并没有什么不同了,跟Mybatis的常规使用方法并无不同。


分析与思路以及误区

分析

大家应该会有下面的想法。

  1. 让SpingMvc正常运转相信并不难实现(SpringMvc本来就是Spring的产物)。

  2. 对于Mybatis,我们肯定会想把该死的SQLSession获取过程放进Spring中 ,它实在太过繁琐;SQLSession需要的Mybatis的配置也要放进Spring ,因为配置文件只有一套,也只需要配一次就行了;对了,好像还有数据库的账号密码,还有连接池相关的

  3. 大家的困惑点应该在于如何让Spring能完成Mapper的注入就是如何完成Spring与Mybatis的结合


思路

Mybatis提供了一个专门跟Spring连接的Jar包,我们之前没有使用过。 关于这个jar包需要提2点:

  1. 这个Jar包提供了SQLSession的构建方法,我们直接调用就行了(无需写构建过程与会话关闭)

  2. 关于非Spring相关工具的Spring实现 ,其实思路我们早就学过了,他就是FactoryBean ,这是Spring基础。它允许我们自己设置对象获取,我们只需要继承接口并定义相关的Set方法,那么Set获取的对象就会变成IOC中获取的对象。


误区

  1. 关于如何将Mapper接口以及相关的xml文件扫进IOC,该步骤由Mybatis提供的jar包完成。当然他也代替了Mybatis配置文件中的Mapper扫描配置,所以当我们配置Mybatis配置时大家无需困惑。

  2. Spring本身似乎无需主动参与工作,其实并不是。我们不再使用Mybatis的事务管理机制,转而使用Spring的事务管理。所以我们需要配置Spring的事务管理机制,但无需配置Mybatis的事务管理。

  3. 其实我们使用了2个容器 来完成整合,一个当然是我们的SpringMvc容器 ,另一个容器我们用来配置Mybatis相关内容Spring的事务管理他们之间会使用Spring的父子容器技术,来达到2个容器的信息互通

实操与代码分析

相信大家看了上面的理论已经很懵了,所以我们选择将依赖分析放到最后再做 ,我们先搞清楚代码做了什么,再来分析我们使用了哪些东西


前置工作

java版本为17, tomcat版本为10及以上, Maven版本(3.6及以上)

注意下面步骤不要搞混

  1. 创建项目(删除src目录)

  2. 配置自己的Maven版本(3.6及以上)

  3. 将项目改为pom打包格式

  4. 引入下文中的依赖

  5. 创建子项目

  6. 将子项目更改为Web项目

相关依赖

xml 复制代码
  <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spring.version>6.0.8</spring.version>
        <aop.annotation>6.0.2</aop.annotation>
        <java.di.annotation>2.1.1</java.di.annotation>
        <mvc.json>2.15.0</mvc.json>
        <jsr303>9.1.0</jsr303>
        <jsr303.hibernate.impl>8.0.0.Final</jsr303.hibernate.impl>
        <jsr303.hibernate.impl.annotation>8.0.0.Final</jsr303.hibernate.impl.annotation>
        <mybatis>3.5.11</mybatis>
        <druid>1.2.8</druid>
        <java.mysql>8.0.30</java.mysql>
        <pagehelper>5.1.11</pagehelper>
        <mybatis.spring>3.0.2</mybatis.spring>
        <lombok.version>1.18.28</lombok.version>
        <log4j-core.version>2.20.0</log4j-core.version>
        <log4j-slf4j2-impl.version>2.20.0</log4j-slf4j2-impl.version>
        <junit-jupiter-api.version>5.9.2</junit-jupiter-api.version>
        <junit.version>4.12</junit.version>
    </properties>

        <dependencies>

            <!--     sping相关       -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aop</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aspects</artifactId>
                <version>${aop.annotation}</version>
            </dependency>
            <dependency>
                <groupId>jakarta.annotation</groupId>
                <artifactId>jakarta.annotation-api</artifactId>
                <version>${java.di.annotation}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jdbc</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-tx</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <!--       mvc相关     -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
                <version>${mvc.json}</version>
            </dependency>
            <!--    jsr303规则        -->
            <dependency>
                <groupId>jakarta.platform</groupId>
                <artifactId>jakarta.jakartaee-web-api</artifactId>
                <version>${jsr303}</version>
            </dependency>
            <!-- 校验注解jsr303实现-->
            <dependency>
                <groupId>org.hibernate.validator</groupId>
                <artifactId>hibernate-validator</artifactId>
                <version>${jsr303.hibernate.impl}</version>
            </dependency>
            <dependency>
                <groupId>org.hibernate.validator</groupId>
                <artifactId>hibernate-validator-annotation-processor</artifactId>
                <version>${jsr303.hibernate.impl.annotation}</version>
            </dependency>



            <!--  mybatis相关          -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${java.mysql}</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>${druid}</version>
            </dependency>
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>${mybatis}</version>
            </dependency>
            <dependency>
                <groupId>com.github.pagehelper</groupId>
                <artifactId>pagehelper</artifactId>
                <version>${pagehelper}</version>
            </dependency>

            <!--     特殊依赖       -->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis-spring</artifactId>
                <version>${mybatis.spring}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
                <version>${spring.version}</version>
            </dependency>

            <!-- 杂项           -->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-core</artifactId>
                <version>${log4j-core.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-slf4j2-impl</artifactId>
                <version>${log4j-slf4j2-impl.version}</version>
            </dependency>
            <dependency>
                <groupId>org.junit.jupiter</groupId>
                <artifactId>junit-jupiter-api</artifactId>
                <version>${junit-jupiter-api.version}</version>
<!--                <scope>test</scope>-->
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
            </dependency>
        </dependencies>

实操之配置SpringMvc

1. 创建com.atguigu.config文件夹,并在里面定义一个类,名为MySpringMvcConfig

less 复制代码
@Configuration
@EnableWebMvc
@ComponentScan({"com.atguigu.controller", "com.atguigu.MyGlobalExceptionHandler"})
public class MyMvcConfig implements WebMvcConfigurer {

}

这是一个很正常的SpringMvc的配置类,不寻常的一点是我们的包扫描位置一个是Controller层的包 ,一个是我们自定义异常处理存放的包

也就是说,我们的SpringMvc只对Controller层以及我们的异常处理负责,其他地方的容器化以及注入我们都不管!

大家不想看爆红的话可以去创建这2个包

2. 创建MyMvcInit作为SpringMvc的初始化包,继承接口。

scala 复制代码
package com.atguigu.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class MyMvcInit extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[0];
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{MyMvcConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}

这一步目前来讲没有任何改动,是SpringMvc的正常配置过程。

实操之配置Mybatis

我们先回顾一下Mybatis的原生配置方法

ini 复制代码
//1.读取外部配置文件
InputStream ips = Resources.getResourceAsStream("mybatis-config.xml");

//2.创建sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(ips);

//3.创建sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//4.获取mapper代理对象
EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
//5.数据库方法调用
int rows = empMapper.deleteEmpById(1);
System.out.println("rows = " + rows);
//6.提交和回滚
sqlSession.commit();
sqlSession.close();

这一步相对比较复杂,我们先从配置数据库开始,由简到难

新建MySQL.properties

ini 复制代码
mysql.username=root
mysql.password=密码
mysql.url=数据库连接
mysql.drive=com.mysql.cj.jdbc.Driver

SQLSessionFactoryBean

这个类名很有意思,前面的SQLSession一听就是Mybatis的产物 ,而FactoryBean则是Spring为其他厂商准备的接口。这就是Mybatis为了整合到Spring所提供的的类。

我们只需要像配置SQLSessionFactory一样将配置文件放入其中 ,然后将其放入IOC容器 ,它就会完成SqlSession的创建

java 复制代码
@Configuration
public class MySpringMybatisConfig {
    @Bean
    public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        //TODO 设置数据源 Spring会自动装配
        sqlSessionFactoryBean.setDataSource(dataSource);

        return sqlSessionFactoryBean;
    }

}

上面的代码是配置Mybatis的一部分代码 (为了使思路变得清晰),在上面的代码中,我为Mybatis设置了数据源 (在原生配置中我们一般将数据库的配置放在配置文件中)。因为我们将会完全使用代码,在舍弃掉Mybatis的配置文件的情况下完成配置 。总之,我们先来搞定这个数据源,我们需要声名它,并放入IOC,让Spring自动注入它

完成数据源配置

kotlin 复制代码
package com.atguigu.config;

import com.alibaba.druid.pool.DruidDataSource;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

import javax.sql.DataSource;


@Configuration
@Data
@PropertySource(value = "classpath:mysql.properties")
public class MyDatabase {

    @Value("${mysql.username}")
    private String userName;

    @Value("${mysql.password}")
    private String password;

    @Value("${mysql.url}")
    private String url;

    @Value("${mysql.driver}")
    private String driver;

    //配置数据源
    @Bean
    public DataSource dataSource(){
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setUsername(userName);
        druidDataSource.setPassword(password);
        druidDataSource.setDriverClassName(driver);
        druidDataSource.setUrl(url);
        return druidDataSource;
    }
}

在上面的代码中,我们声明了这是一个配置类,并使用@PropertyResource注解将数据库配置引入,使用@Value注解完成字段注入。通过@Bean向IOC注入一个数据源,这个数据源的返回类型是正常的数据源,但内部我们使用了Druid来数据源。


使用代码代替Mybatis的配置文件

此时我们已经无需担心这个sqlSessionFactoryBean.setDataSource()方法内部的数据源了。下面我会贴出完整代码,展示Mybatis的配置过程

java 复制代码
package com.atguigu.config;

import com.github.pagehelper.PageInterceptor;
import org.apache.ibatis.logging.log4j2.Log4j2Impl;
import org.apache.ibatis.logging.slf4j.Slf4jImpl;
import org.apache.ibatis.session.AutoMappingBehavior;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;
import java.util.Properties;


@Configuration
public class MySpringMybatisConfig {
    @Bean
    public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        //TODO 设置数据源 Spring会自动装配
        sqlSessionFactoryBean.setDataSource(dataSource);

        //TODO 代替xml配置mybatis
        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
        //开启驼峰映射
        configuration.setMapUnderscoreToCamelCase(true);
        //设置日志实现为Log4j2
        configuration.setLogImpl(Log4j2Impl.class);
       //开启驼峰自动代理
       configuration.setAutoMappingBehavior(AutoMappingBehavior.FULL);

        // TODO 放入配置
        sqlSessionFactoryBean.setConfiguration(configuration);

        // TODO 设置别名@Alias注解所在的包(等于开启别名注解扫描)
        sqlSessionFactoryBean.setTypeAliasesPackage("com.atguigu.pojo");

        // TODO 设置分页插件
        PageInterceptor pageInterceptor = new PageInterceptor();
        Properties properties = new Properties();
        properties.setProperty("helperDialect", "mysql");
        pageInterceptor.setProperties(properties);

        return sqlSessionFactoryBean;
    }

}

org.apache.ibatis.session.Configuration() 是什么?

这个类就是Mybatis为我们提供的用来代替Mybatis配置文件的类 ,我们将配置内容写在内部即可,上面每一步做了什么已经很清楚了。


开启Mapper扫描

在上面的步骤中,我们完成了Mybatis配置中的

  1. 数据库的相关配置
  2. 数据库字段与Pojo的自动映射
  3. 分页插件
  4. 日志的实现

我们还缺少最后一个步骤,完成类这个步骤,我们才能让xxxMapper.xml文件成为Mapper接口的实现类 ,才能让把所有的Mapper接口全部放入IOC中 ,使xxxMapper可以加上@AutoWired注解就自动注入

MapperScannerConfigurer(Mapper扫描器配置)

这个类依旧是由Mybatis对Sping整合jar包所提供 的,我们只需要在内部指定Mapper的地址 即可。它会自动把Mapper接口实例化并放入IOC

下面我会贴出完整的代码,完成了这个,我们对Mybatis的配置就算大功告成了。

java 复制代码
package com.atguigu.config;

import com.github.pagehelper.PageInterceptor;
import org.apache.ibatis.logging.log4j2.Log4j2Impl;
import org.apache.ibatis.session.AutoMappingBehavior;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;
import java.util.Properties;


@Configuration
public class MySpringMybatisConfig {
    @Bean
    public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        //TODO 设置数据源 Spring会自动装配
        sqlSessionFactoryBean.setDataSource(dataSource);

        //TODO 代替xml配置mybatis
        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
        configuration.setMapUnderscoreToCamelCase(true);
        configuration.setLogImpl(Log4j2Impl.class);
        configuration.setAutoMappingBehavior(AutoMappingBehavior.FULL);

        // TODO 放入配置
        sqlSessionFactoryBean.setConfiguration(configuration);

        // TODO 设置pojo包
        sqlSessionFactoryBean.setTypeAliasesPackage("com.atguigu.pojo");

        // TODO 设置分页插件
        PageInterceptor pageInterceptor = new PageInterceptor();
        Properties properties = new Properties();
        properties.setProperty("helperDialect", "mysql");
        pageInterceptor.setProperties(properties);

        return sqlSessionFactoryBean;
    }

    // TODO 设置mapper接口跟存放sql的mapper文件的位置
    // TODO 这意味着他俩必须放在一起,或者classpath下的同目录内
    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer(){
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        mapperScannerConfigurer.setBasePackage("com.atguigu.mapper");
        return mapperScannerConfigurer;
    }
}

实操之对Spring的配置

对Spring的配置其实就一件事,事务

less 复制代码
@EnableTransactionManagement
@EnableAspectJAutoProxy
@Configuration
@ComponentScan("com.atguigu.service")
public class MySpringTransactionInit {
    @Bean
    public DataSourceTransactionManager dataSourceTransactionManager(DataSource dataSource){
        return new DataSourceTransactionManager(dataSource);
    }
}

事务操作需要配数据源,这里会在IOC中自动匹配Druid的数据源,不再赘述了。重点讲一下这几个注解

为什么要在这加这几个注解?

还记得我们最初说的2个容器吗?我们写的这么多配置文件,其实会被用来创建一个新的容器(作为SpringMvc容器的父容器),所以需要

  1. @EnableAspectJAutoProxy 开启AOP,可以面向切面编程

  2. @EnableTransactionManagement 开启事务,可以回滚

  3. @ComponentScan("com.atguigu.service") 只对Service的内容生效!


Mybatis与Spring容器的生成,以及父子容器

如何生成让这些配置文件变成容器?让我们回到最初的起点

scala 复制代码
package com.atguigu.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class MyMvcInit extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{MyDatabase.class, MySpringMybatisConfig.class, MySpringTransactionInit.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{MyMvcConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}

还记得SpringMvc初始化接口的3个方法 吗?第一个我们从来没使用过的方法,没错,就是它,放入3个的配置文件

关于父子容器

所谓父子容器就是Spring内部的一个容器间数据互通 的机制,名为SetPrent方法,为容器设置父容器后子容器就能调用父容器的内容了。幸运的是,我们不需要去配置它,Spring内部会完成他们,我们到这里就算完成了


杂项之日志

我们的项目需要配置日志,新建log4j2的配置文件:log4j2.xml

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <loggers>
        <!--
            level指定日志级别,从低到高的优先级:
                TRACE < DEBUG < INFO < WARN < ERROR < FATAL
                trace:追踪,是最低的日志级别,相当于追踪程序的执行
                debug:调试,一般在开发中,都将其设置为最低的日志级别
                info:信息,输出重要的信息,使用较多
                warn:警告,输出警告的信息
                error:错误,输出错误信息
                fatal:严重错误
        -->
        <logger name="org.springframework" level="DEBUG"/>
        <logger name="org.mybatis" level="DEBUG"/>
        <root level="DEBUG">
            <appender-ref ref="spring6log"/>
            <appender-ref ref="RollingFile"/>
            <appender-ref ref="log"/>
        </root>
    </loggers>

    <appenders>
        <!--输出日志信息到控制台-->
        <console name="spring6log" target="SYSTEM_OUT">
            <!--控制日志输出的格式-->
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss SSS} [%t] %-3level %logger{1024} - %msg%n"/>
        </console>

        <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,适合临时测试用-->
        <File name="log" fileName="d:/spring6_log/test.log" append="false">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
        </File>

        <!-- 这个会打印出所有的信息,
            每次大小超过size,
            则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,
            作为存档-->
        <RollingFile name="RollingFile" fileName="d:/spring6_log/app.log"
                     filePattern="log/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
            <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
            <SizeBasedTriggeringPolicy size="50MB"/>
            <!-- DefaultRolloverStrategy属性如不设置,
            则默认为最多同一文件夹下7个文件,这里设置了20 -->
            <DefaultRolloverStrategy max="20"/>
        </RollingFile>
    </appenders>
</configuration>

杂项之Mapper.xml的位置

在Recourse文件夹下面创建与Mapper接口同级的目录,放在里面,防止扫不到 贴一下项目结构

搞个tomcat跑一下

数据库表

sql 复制代码
CREATE TABLE `t_emp`(
  emp_id INT AUTO_INCREMENT,
  emp_name CHAR(100),
  emp_salary DOUBLE(10,5),
  PRIMARY KEY(emp_id)
);

Pojo

kotlin 复制代码
@Data
public class Emp {
    private Integer empId;
    private String empName;
    private Double empSalary;
}

Mapper接口

csharp 复制代码
public interface EmpMapper {
    Emp getEmpById(Integer id);
}

Mapper xml实现

xml 复制代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!--        我们使用#{}来拼接参数,防止sql漏洞。-->
<!--    Emp getEmpById();-->
<mapper namespace="com.atguigu.mapper.EmpMapper">
    <select id="getEmpById" resultType="com.atguigu.pojo.Emp">
        select emp_name empName,emp_salary empSalary
        from t_emp where emp_id=#{id}
    </select>
</mapper>

Controller与Service层的代码最上面有,不再贴了。


依赖分析

Spring相关的依赖分析

无需多言的依赖

xml 复制代码
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>${spring.version}</version>
</dependency>

AOP会用到的依赖注入相关的注解包

xml 复制代码
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
    <version>${aop.annotation}</version>
</dependency>

Spring事务管理会用到的依赖注入相关的依赖

xml 复制代码
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>${spring.version}</version>
</dependency>

引入数据库文件内容到代码时要用到的tx命名空间的内容

xml 复制代码
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>${spring.version}</version>
</dependency>

SpringMvc相关的依赖

无需多言的依赖

xml 复制代码
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${spring.version}</version>
</dependency>

JSON请求体解析@EnableWebMvc注解所在的依赖依赖

xml 复制代码
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>${mvc.json}</version>
</dependency>

字段校验所需的依赖与他们的实现

xml 复制代码
<!--    jsr303规则        -->
<dependency>
    <groupId>jakarta.platform</groupId>
    <artifactId>jakarta.jakartaee-web-api</artifactId>
    <version>${jsr303}</version>
</dependency>
<!-- 校验注解jsr303实现-->
<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>${jsr303.hibernate.impl}</version>
</dependency>
<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator-annotation-processor</artifactId>
    <version>${jsr303.hibernate.impl.annotation}</version>
</dependency>

Mybatis相关的依赖

无需多言的依赖

xml 复制代码
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>${java.mysql}</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>${druid}</version>
</dependency>
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>${mybatis}</version>
</dependency>

分页插件的依赖

xml 复制代码
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>${pagehelper}</version>
</dependency>

特殊的依赖

这就是我们非常关键的Mybatis对Spring支持的依赖包

xml 复制代码
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>${mybatis.spring}</version>
</dependency>

与SpringMvc不同,支持的范围更大,需要引入,具体文章最后会将

xml 复制代码
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>${spring.version}</version>
</dependency>

其他的一些杂项依赖

lomback @Data注解的依赖

xml 复制代码
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
            </dependency>

日志与日志的实现

xml 复制代码
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-core</artifactId>
                <version>${log4j-core.version}</version>
            </dependency>

            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-slf4j2-impl</artifactId>
                <version>${log4j-slf4j2-impl.version}</version>
            </dependency>

测试 @Test相关依赖

xml 复制代码
            <dependency>
                <groupId>org.junit.jupiter</groupId>
                <artifactId>junit-jupiter-api</artifactId>
                <version>${junit-jupiter-api.version}</version>
<!--                <scope>test</scope>-->
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
            </dependency>

跨域问题

什么是同源跨域问题在这里不再赘述,这是javaWeb基础,不会的自己去查,这里说解决方法

在Controller上面加新的注解@CrossOrigin

less 复制代码
@CrossOrigin
@RestController
@RequestMapping("emp")
public class empController {
    @Autowired
    EmpService empService;

    @GetMapping()
    public Emp selectEmpById(){
         return empService.selectEmpMyId(1);
    }
}

后话

看一下这个注解所在的依赖(上面没解释清的依赖解释清了)

相关推荐
AI人H哥会Java3 小时前
【Spring】控制反转(IoC)与依赖注入(DI)—IoC容器在系统中的位置
java·开发语言·spring boot·后端·spring
凡人的AI工具箱3 小时前
每天40分玩转Django:Django表单集
开发语言·数据库·后端·python·缓存·django
奔跑草-3 小时前
【数据库】SQL应该如何针对数据倾斜问题进行优化
数据库·后端·sql·ubuntu
中國移动丶移不动3 小时前
Java 并发编程:原子类(Atomic Classes)核心技术的深度解析
java·后端
小马爱打代码3 小时前
Tomcat整体架构分析
java·架构·tomcat
time_silence4 小时前
微服务——不熟与运维
运维·微服务·架构
-指短琴长-4 小时前
Docker之技术架构【八大架构演进之路】
docker·容器·架构
Q_19284999064 小时前
基于Spring Boot的旅游推荐系统
spring boot·后端·旅游
愤怒的代码4 小时前
Spring Boot对访问密钥加密解密——RSA
java·spring boot·后端