ssm整合思路
包含Spring,SpringMvc,Mybatis
我们要达到什么目的
-
我们要让Mybatis作为持久层的调用者(为Service层提供必要的持久化支持,帮助Service更好的编写业务逻辑),
-
让SpringMvc成为Controller层的调用者,向前端提供调用服务。
-
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的常规使用方法并无不同。
分析与思路以及误区
分析
大家应该会有下面的想法。
-
让SpingMvc正常运转相信并不难实现(SpringMvc本来就是Spring的产物)。
-
对于Mybatis,我们肯定会想把该死的SQLSession获取过程放进Spring中 ,它实在太过繁琐;SQLSession需要的Mybatis的配置也要放进Spring ,因为配置文件只有一套,也只需要配一次就行了;对了,好像还有数据库的账号密码,还有连接池相关的。
-
大家的困惑点应该在于如何让Spring能完成Mapper的注入 ,就是如何完成Spring与Mybatis的结合。
思路
Mybatis提供了一个专门跟Spring连接的Jar包,我们之前没有使用过。 关于这个jar包需要提2点:
-
这个Jar包提供了SQLSession的构建方法,我们直接调用就行了(无需写构建过程与会话关闭)
-
关于非Spring相关工具的Spring实现 ,其实思路我们早就学过了,他就是FactoryBean ,这是Spring基础。它允许我们自己设置对象获取,我们只需要继承接口并定义相关的Set方法,那么Set获取的对象就会变成IOC中获取的对象。
误区
-
关于如何将Mapper接口以及相关的xml文件扫进IOC,该步骤由Mybatis提供的jar包完成。当然他也代替了Mybatis配置文件中的Mapper扫描配置,所以当我们配置Mybatis配置时大家无需困惑。
-
Spring本身似乎无需主动参与工作,其实并不是。我们不再使用Mybatis的事务管理机制,转而使用Spring的事务管理。所以我们需要配置Spring的事务管理机制,但无需配置Mybatis的事务管理。
-
其实我们使用了2个容器 来完成整合,一个当然是我们的SpringMvc容器 ,另一个容器我们用来配置Mybatis相关内容 与Spring的事务管理 。他们之间会使用Spring的父子容器技术,来达到2个容器的信息互通。
实操与代码分析
相信大家看了上面的理论已经很懵了,所以我们选择将依赖分析放到最后再做 ,我们先搞清楚代码做了什么,再来分析我们使用了哪些东西。
前置工作
java版本为17, tomcat版本为10及以上, Maven版本(3.6及以上)
注意下面步骤不要搞混
-
创建项目(删除src目录)
-
配置自己的Maven版本(3.6及以上)
-
将项目改为pom打包格式
-
引入下文中的依赖
-
创建子项目
-
将子项目更改为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配置中的
- 数据库的相关配置
- 数据库字段与Pojo的自动映射
- 分页插件
- 日志的实现
我们还缺少最后一个步骤,完成类这个步骤,我们才能让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容器的父容器),所以需要
-
@EnableAspectJAutoProxy 开启AOP,可以面向切面编程
-
@EnableTransactionManagement 开启事务,可以回滚
-
@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);
}
}
后话
看一下这个注解所在的依赖(上面没解释清的依赖解释清了)