Spring Framework Overview :: Spring Framework
整合所需的依赖项:
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.atguigu</groupId>
<artifactId>part04-ssm-integration</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<spring.version>6.0.6</spring.version>
<jakarta.annotation-api.version>2.1.1</jakarta.annotation-api.version>
<jakarta.jakartaee-web-api.version>9.1.0</jakarta.jakartaee-web-api.version>
<jackson-databind.version>2.15.0</jackson-databind.version>
<hibernate-validator.version>8.0.0.Final</hibernate-validator.version>
<mybatis.version>3.5.11</mybatis.version>
<mysql.version>8.0.25</mysql.version>
<pagehelper.version>5.1.11</pagehelper.version>
<druid.version>1.2.8</druid.version>
<mybatis-spring.version>3.0.2</mybatis-spring.version>
<jakarta.servlet.jsp.jstl-api.version>3.0.0</jakarta.servlet.jsp.jstl-api.version>
<logback.version>1.2.3</logback.version>
<lombok.version>1.18.26</lombok.version>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!--
需要依赖清单分析:
spring
ioc/di
spring-context / 6.0.6
jakarta.annotation-api / 2.1.1 jsr250
aop
spring-aspects / 6.0.6
tx
spring-tx / 6.0.6
spring-jdbc / 6.0.6
springmvc
spring-webmvc 6.0.6
jakarta.jakartaee-web-api 9.1.0
jackson-databind 2.15.0
hibernate-validator / hibernate-validator-annotation-processor 8.0.0.Final
mybatis
mybatis / 3.5.11
mysql / 8.0.25
pagehelper / 5.1.11
整合需要
加载spring容器 spring-web / 6.0.6
整合mybatis mybatis-spring x x
数据库连接池 druid / x
lombok lombok / 1.18.26
logback logback/ 1.2.3
-->
<dependencies>
<!--spring pom.xml依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>jakarta.annotation</groupId>
<artifactId>jakarta.annotation-api</artifactId>
<version>${jakarta.annotation-api.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>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!--
springmvc
spring-webmvc 6.0.6
jakarta.jakartaee-web-api 9.1.0
jackson-databind 2.15.0
hibernate-validator / hibernate-validator-annotation-processor 8.0.0.Final
-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>jakarta.platform</groupId>
<artifactId>jakarta.jakartaee-web-api</artifactId>
<version>${jakarta.jakartaee-web-api.version}</version>
<scope>provided</scope>
</dependency>
<!-- jsp需要依赖! jstl-->
<dependency>
<groupId>jakarta.servlet.jsp.jstl</groupId>
<artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
<version>${jakarta.servlet.jsp.jstl-api.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson-databind.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>${hibernate-validator.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator-annotation-processor -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator-annotation-processor</artifactId>
<version>${hibernate-validator.version}</version>
</dependency>
<!--
mybatis
mybatis / 3.5.11
mysql / 8.0.25
pagehelper / 5.1.11
-->
<!-- mybatis依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!-- MySQL驱动 mybatis底层依赖jdbc驱动实现,本次不需要导入连接池,mybatis自带! -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>${pagehelper.version}</version>
</dependency>
<!-- 整合第三方特殊依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis-spring.version}</version>
</dependency>
<!-- 日志 , 会自动传递slf4j门面-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
</dependencies>
</project>
日志功能:
resources/logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
<!-- 指定日志输出的位置,ConsoleAppender表示输出到控制台 -->
<appender name="STDOUT"
class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- 日志输出的格式 -->
<!-- 按照顺序分别是:时间、日志级别、线程名称、打印日志的类、日志主体内容、换行 -->
<pattern>[%d{HH:mm:ss.SSS}] [%-5level] [%thread] [%logger] [%msg]%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 设置全局日志级别。日志级别按顺序分别是:TRACE、DEBUG、INFO、WARN、ERROR -->
<!-- 指定任何一个日志级别都只打印当前级别和后面级别的日志。 -->
<root level="DEBUG">
<!-- 指定打印日志的appender,这里通过“STDOUT”引用了前面配置的appender -->
<appender-ref ref="STDOUT" />
</root>
<!-- 根据特殊需求指定局部日志级别,可也是包名或全类名。 -->
<logger name="com.atguigu.mybatis" level="DEBUG" />
</configuration>
控制层配置(springMVC整合)
主要的功能:
1.实现Springmvc组件声明标准化接口WebMvcConfigurer 提供了各种组件对应的方法
2.添加配置类注解@Configuration
3.添加mvc复合功能开关@EnableWebMvc(handlerMapping,handlerAdapter和json转化器)
4.添加controller层扫描注解
5.开启全局异常处理器,支持静态资源处理
6.拦截器
package com.bubu.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;
@EnableWebMvc
@Configuration
@ComponentScan({"com.bubu.controller"})
public class WebMvcJavaConfig implements WebMvcConfigurer {
//静态资源解析器
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
//视图解析器
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/views/", ".jsp");
}
//拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
//registry.addInterceptor();
}
}
业务层配置(aop,Service,Tx)
功能:
1. 声明@Configuration注解,代表配置类
2. 声明@EnableTransactionManagement注解,开启事务注解支持
3. 声明@EnableAspectJAutoProxy注解,开启aspect aop注解支持
4. 声明@ComponentScan("com.atguigu.service")注解,进行业务组件扫描
5. 声明transactionManager(DataSource dataSource)方法,指定具体的事务管理器
@Configuration
@EnableAspectJAutoProxy
@EnableTransactionManagement
public class ServiceJavaConfig {
public TransactionManager transactionManager(DataSource dataSource){
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
dataSourceTransactionManager.setDataSource();
return dataSourceTransactionManager;
}
}
持久层配置(mybatis)
整合方式一:(保留配置文件)
resource/mybatis-config.xml
不需要再写连接池
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="jdbc.properties"></properties>
<settings>
<!-- 开启驼峰式映射-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- 开启logback日志输出-->
<setting name="logImpl" value="SLF4J"/>
<!--开启resultMap自动映射 -->
<setting name="autoMappingBehavior" value="FULL"/>
</settings>
<typeAliases>
<package name="com.bubu.pojo"/>
</typeAliases>
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!--
helperDialect:分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。
你可以配置helperDialect属性来指定分页插件使用哪种方言。配置时,可以使用下面的缩写值:
oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012,derby
(完整内容看 PageAutoDialect) 特别注意:使用 SqlServer2012 数据库时,
https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md#%E5%A6%82%E4%BD%95%E9%85%8D%E7%BD%AE%E6%95%B0%E6%8D%AE%E5%BA%93%E6%96%B9%E8%A8%80
-->
<property name="helperDialect" value="mysql"/>
</plugin>
</plugins>
</configuration>
连接池的配置类:
@PropertySource("classpath:jdbc.properties")
@Configuration
public class DataSourceJavaConfig {
@Value("${jdbc.user}")
private String user;
@Value("${jdbc.password}")
private String password;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.driver}")
private String driver;
@Bean
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driver);
dataSource.setUrl(url);
dataSource.setUsername(user);
dataSource.setPassword(password);
return dataSource;
}
}
mybatis配置类:
@Configuration
public class MapperJavaConfig {
@Bean
public SqlSessionFactoryBean sessionFactory(DataSource dataSource) {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
//指定数据库连接池对象
sqlSessionFactoryBean.setDataSource(dataSource);
//指定外部的mybatis配置文件(springframework.core包下的)
Resource resource = new ClassPathResource("mybatis-config.xml");
sqlSessionFactoryBean.setConfigLocation(resource);
return sqlSessionFactoryBean;
}
//将mapper代理对象加入到ioc容器中
@Bean
public MapperScannerConfigurer mapperScannerConfigurer() {
MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
mapperScannerConfigurer.setBasePackage("com.bubu.mapper");
return mapperScannerConfigurer;//mapper接口和mapperxml共同所在的包
}
}
整合方式二:(不使用mybatis-config.xml)
直接在创建SqlSessionFactoryBean时配置:
@Bean
public SqlSessionFactoryBean sessionFactory(DataSource dataSource) {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
//使用代码的形式,实现mybatis配置文件的功能
/*
<settings>
<!-- 开启驼峰式映射-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- 开启logback日志输出-->
<setting name="logImpl" value="SLF4J"/>
<!--开启resultMap自动映射 -->
<setting name="autoMappingBehavior" value="FULL"/>
</settings>
* */
org.apache.ibatis.session.Configuration configuration
= new org.apache.ibatis.session.Configuration();
configuration.setMapUnderscoreToCamelCase(true);
configuration.setLogImpl(Slf4jImpl.class);
configuration.setAutoMappingBehavior(AutoMappingBehavior.FULL);
sqlSessionFactoryBean.setConfiguration(configuration);
/*
别名设置
<typeAliases>
<package name="com.bubu.pojo"/>
</typeAliases>
* */
sqlSessionFactoryBean.setTypeAliasesPackage("com.bubu.pojo");
/*
插件
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!--
helperDialect:分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。
你可以配置helperDialect属性来指定分页插件使用哪种方言。配置时,可以使用下面的缩写值:
oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012,derby
(完整内容看 PageAutoDialect) 特别注意:使用 SqlServer2012 数据库时,
https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md#%E5%A6%82%E4%BD%95%E9%85%8D%E7%BD%AE%E6%95%B0%E6%8D%AE%E5%BA%93%E6%96%B9%E8%A8%80
-->
<property name="helperDialect" value="mysql"/>
</plugin>
</plugins>
* */
PageInterceptor pageInterceptor = new PageInterceptor();
Properties properties = new Properties();
properties.setProperty("helperDialect", "mysql");
pageInterceptor.setProperties(properties);
sqlSessionFactoryBean.addPlugins(pageInterceptor);
return sqlSessionFactoryBean;
}
ssm配置类初始化和访问测试
加载配置类:
public class SpringIocInit extends AbstractAnnotationConfigDispatcherServletInitializer {
//rootioc容器的配置类
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{DataSourceJavaConfig.class, MapperJavaConfig.class, ServiceJavaConfig.class};
}
//webioc容器的配置类
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{WebMvcJavaConfig.class};
}
//dispatcherServlet的拦截路径
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
controller
@RestController
@RequestMapping("emp")
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
@GetMapping("find")
public List<Employee> find(){
List<Employee> employees = employeeService.findAll();
System.out.println("employees: ");
return employees;
}
}
使用ssm整合对数据库进行增删改查
后端的实现:
controller:
@RestController
@RequestMapping("schedule")
@Slf4j //这是lombok提供的接口,logback是实现
public class ScheduleController {
@Autowired
private ScheduleService scheduleService;
//接收参数,返回结果。
@GetMapping("/{pageSize}/{currentPage}")
public R page(@PathVariable(value = "pageSize") int pageSize,
@PathVariable(value = "currentPage") int currentPage){
R r = scheduleService.page(pageSize,currentPage);
log.info("查询的数据为:{}",r);
return r;
}
@DeleteMapping("/{id}")
public R delete(@PathVariable(value = "id") int id){
R r = scheduleService.remove(id);
return r;
}
@PostMapping
public R save(@Validated @RequestBody Schedule schedule, BindingResult bindingResult){
if(bindingResult.hasErrors()){
return R.fail("不能保存");
}
R r = scheduleService.save(schedule);
return r;
}
@PutMapping
public R update(@Validated @RequestBody Schedule schedule, BindingResult bindingResult){
if(bindingResult.hasErrors()){
return R.fail("不能修改");
}
R r = scheduleService.update(schedule);
return r;
}
}
service:
@Service
public class ScheduleServiceImpl implements ScheduleService {
@Autowired
private ScheduleMapper scheduleMapper;
@Override
public R page(int pageSize, int currentPage) {
//分页
PageHelper.startPage(currentPage, pageSize);//sql limit x,y
//查询
List<Schedule> scheduleList = scheduleMapper.queryList();
//分页数据装配
PageInfo<Schedule> pageInfo = new PageInfo<>(scheduleList);
//装配PageBean
PageBean<Schedule> pageBean = new PageBean<>(currentPage,pageSize,pageInfo.getTotal(),pageInfo.getList());
R ok = R.ok(pageBean);
return ok;
}
@Override
public R remove(int id) {
int rows = scheduleMapper.deleteById(id);
if(rows > 0){
return R.ok(null);
}
return R.fail(null);
}
@Override
public R save(Schedule schedule) {
int row = scheduleMapper.insert(schedule);
if(row > 0){
return R.ok(null);
}
return R.fail(null);
}
@Override
public R update(Schedule schedule) {
if(schedule.getId() == null){
return R.fail("核心参数为空");
}
int row = scheduleMapper.update(schedule);
if(row > 0){
return R.ok(null);
}
return R.fail(null);
}
}
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.atguigu.mapper.ScheduleMapper">
<!-- List<Schedule> queryList();-->
<select id="queryList" resultType="schedule">
select * from schedule
</select>
<!--int deleteById(int id);-->
<delete id="deleteById">
delete from schedule where id = #{id}
</delete>
<!-- int insert(Schedule schedule);-->
<insert id="insert">
insert into schedule (title,completed) value (#{title},#{completed});
</insert>
<!--int update(Schedule schedule);-->
<update id="update">
update schedule set title = #{title} , completed = #{completed}
where id = #{id}
</update>
</mapper>
解决非同源访问问题(跨域访问注解)
在相应controller上添加注解:
@CrossOrigin
作用:允许其他源访问我们的controller,浏览器就不会拦截.