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);
    }
}

后话

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

相关推荐
coderSong25685 小时前
Java高级 |【实验八】springboot 使用Websocket
java·spring boot·后端·websocket
Mr_Air_Boy6 小时前
SpringBoot使用dynamic配置多数据源时使用@Transactional事务在非primary的数据源上遇到的问题
java·spring boot·后端
打码人的日常分享7 小时前
物联网智慧医院建设方案(PPT)
大数据·物联网·架构·流程图·智慧城市·制造
咖啡啡不加糖7 小时前
Redis大key产生、排查与优化实践
java·数据库·redis·后端·缓存
白水baishui7 小时前
搭建强化推荐的决策服务架构
架构·推荐系统·强化学习·决策服务·服务架构
何双新7 小时前
第23讲、Odoo18 邮件系统整体架构
ai·架构
雪碧聊技术7 小时前
将单体架构项目拆分成微服务时的两种工程结构
微服务·架构·module·project·工程结构
大鸡腿同学8 小时前
纳瓦尔宝典
后端
从零开始学习人工智能8 小时前
Doris 数据库深度解析:架构、原理与实战应用
数据库·架构