# springmvc-learn
**Repository Path**: hrbu-2022/springmvc-learn
## Basic Information
- **Project Name**: springmvc-learn
- **Description**: 学习spirngmvc 知识点, 以及ssm整合
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-03-14
- **Last Updated**: 2025-03-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# SpringMVC的入门项目
## 创建项目
- 创建web项目 使用IDEA提供的maven插件中 的 骨架 org.apache.maven.archetypes:maven-archetype-webapp
- 
- 
1. 添加 src/main/java
2. src/main/resource
3. src/test/main

- 添加spirngmvc的依赖
```xml
4.0.0
com.neuedu.spirngmvc
springmvc-01-web-helloworld
1.0-SNAPSHOT
war
springmvc-01-web-helloworld Maven Webapp
http://www.example.com
UTF-8
8
8
5.3.39
5.11.4
org.junit.jupiter
junit-jupiter-api
${junit.version}
test
org.springframework
spring-webmvc
${spring.version}
```
- 在web.xml中添 注册 DispatcherServlet

```xml
Archetype Created Web Application
springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:springmvc-servlet.xml
springmvc
/
```
- 添加启动 配置文件
- 注册Bean(@Controller )
- 让@Controller是特殊的Bean, 能相应 HandlerMapping 被 HandlerAdapter 执行
```xml
```
- 编写一个Controller (IndexController)
- public String index(){
- return "success"
- }
- 设置 url 和 该方法的关系
- @RequestMapping
```java
package com.neuedu.springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* @author 金山
* 项目:springmvc-learn
* site: https://blog.fulfill.com.cn
* 描述
* @data 2025/3/149:44
*/
@Controller
public class IndexController {
@ResponseBody
@RequestMapping("/index")
public String index(){
return "success";
}
}
```
- 将项目添加到Tomcat中 并发布





- 使用URL 请求 Hanlder(Controller)
- http://localhost:8080/web/index

# APIFox
常用与开发调试(http、rcp)

# 常用注解
- @RequestMapping: 映射 路径和 方法的关系
1. @RequestMapping 应用在处理器类上: 设置请求URL的第一级访问目录。此处不写的话,就相当于应用的根目录。写的话需要以 / 开头。 它出现的目的是为了使我们的URL可以按照模块化管理。
2. @RequestMapping 应用在处理器类的某个方法上:请求URL的第二级访问目录。
3. @RequestMapping注解中常用属性有:
value:用于指定请求的URL。 method:用于指定请求的方式。
可以使用 是@RequestMapping(= RequestMethod.GET)的缩写。
- method
- ```
GET,
HEAD,
POST,
PUT,
PATCH,
DELETE,
OPTIONS,
TRACE;
```

当方法不支持的时候 spirngmvc响应 http405

- ResponseBody 将方法的返回值,直接响应给浏览器(客户端)
> ResponseBody注解的作用是将controller的方法返回的数据写入到response对象的body区,也就是直接将数据写入到输出流中,效果等同于使用 response.getWriter() 输出流对象向前端返回数据。需要注意的是,在使用此注解之后,响应不会再走视图处理器。
# 跨域
```
```
# 参数绑定 日期的问题处理
```java
package com.neuedu.springmvc.controller;
import com.neuedu.springmvc.po.User;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author 金山
* 项目:springmvc-learn
* site: https://blog.fulfill.com.cn
* 描述
* @data 2025/3/188:56
*/
@RestController
@RequestMapping("/date")
public class DateController {
/***
// * http://localhost:8080/web/date/getDate?username=admin&birthday=2025-03-18 08:59:05
// * http://localhost:8080/web/date/getDate?username=admin&birthday=2025/03/18 08:59:05
// * http://localhost:8080/web/date/getDate?username=admin&birthday=08:59:05 2025/03/18
* @param user
* @return
*/
@RequestMapping("/getDate")
public String getDate(User user){
return user.toString();
}
}
```
传递 日期格式的时候 页面报 400错误
Spirngmvc内置了一些 能够将String类型的参数 转换成 (int、float、String),当转换Date类型时 无法处理 需要自定义一个 StringToDateConvert

处理方式
- 编写一个 Convert (String---Date)
- 配置Convert 到 WebMvc的流程中
转换器
````java
package com.neuedu.springmvc.convert;
import org.springframework.core.convert.converter.Converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @author 金山
* 项目:springmvc-learn
* site: https://blog.fulfill.com.cn
* 描述
* @data 2025/3/189:05
*/
public class MyStringToDateConvert implements Converter {
@Override
public Date convert(String source) {
SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-DD HH:mm:ss");
Date date = null;
try {
date = sdf.parse(source);
} catch (ParseException e) {
throw new RuntimeException(e);
}
return date;
}
}
````
在xml(spirng-servlet.xml)文件中配置转换器
```xml
```
# 序列化日期
从数据库中查询出来的信息以内存对象的形式存在 使用的是 Date 类型, 需要序列化出一个格式(默认是时间戳),如果需要转换成 时分秒 年月日等格式,
可以使用ObjectMapper 进行配置(全局)或者在日期类型上添加@JsonFromat
```
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date birthday;
```
```
package com.neuedu.springmvc.po;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;
/**
* @author 金山
* 项目:springmvc-learn
* site: https://blog.fulfill.com.cn
* 描述
* @data 2025/3/1715:33
*/
public class User {
private String username;
private String password;
private int age;
private String expireDate;
// @JsonFormat(pattern="yyyy-MM-dd")
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date birthday;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getExpireDate() {
return expireDate;
}
public void setExpireDate(String expireDate) {
this.expireDate = expireDate;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", age=" + age +
", expireDate='" + expireDate + '\'' +
", birthday=" + birthday +
'}';
}
}
```

# 上传
- 添加依赖
- common-fileupload
- common-io
- 在Spring容器中添加一个 MultipartResolver
- CommonsMultipartResolver 使用common-fileupload 解析上传的内容(**为了兼容性使用第三方的**)
- StandardServletMultipartResolver 使用原生Servlet 的 getPart() 需要的 Servlet版本是 3.x
- 自定义一个Controller 用于接受上传文件的 信息
- MultipartFile myFile
- 提供一个上传文件的表单
## 添加依赖
```xml
4.0.0
com.neuedu.springmvc
springmvc-03-upload
1.0-SNAPSHOT
war
springmvc-03-upload Maven Webapp
http://www.example.com
UTF-8
8
8
5.3.39
5.11.4
4.0.1
org.junit.jupiter
junit-jupiter-api
${junit.version}
test
org.springframework
spring-webmvc
${spring.version}
com.fasterxml.jackson.core
jackson-databind
2.9.0
javax.servlet
javax.servlet-api
${servlet.version}
provided
commons-fileupload
commons-fileupload
1.2.2
commons-io
commons-io
2.4
```
## 配置解析器
```xml
```
## controller
编写一个用于接受 上传的信息、
```java
package com.neuedu.springmvc.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.util.UUID;
/**
* @author 金山
* 项目:springmvc-learn
* site: https://blog.fulfill.com.cn
* 描述
* @data 2025/3/1810:40
*/
@RestController
public class UploadController {
@RequestMapping("/upload")
public String upload(MultipartFile file) throws IOException {
System.out.println(file.getOriginalFilename());
System.out.println(file.getSize());
System.out.println(file.getName());
String ext = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
String newFileName = UUID.randomUUID().toString()+ext;
file.transferTo(new File("D:\\upload",newFileName));
return "success";
}
}
```
## 表单
用于提交 上传文件的请求
为了测试方便 将代码写在 index.jsp中
```html
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
```
测试
访问 upload.html



## 拦截器
- 搭建一个springmvc的项目
- 添加依赖
- 配置DispathcerServlet
- spring-servlet.xml
- 包扫描、注解驱动 @RequestMapping
- Controller
- 发布到Tomcat
- 测试
- http://localhost:8080/web/user/getuser
## 使用拦截器
- 自定义一个拦截器 需要实现 HandlerInterceptor
```java
package com.neuedu.springmvc.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author 金山
* 项目:springmvc-learn
* site: https://blog.fulfill.com.cn
* 描述
* @data 2025/3/1811:31
*/
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("LoginInterceptor.preHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("LoginInterceptor.postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("LoginInterceptor.afterCompletion");
}
}
```
- 添加spirngmvc的配置中
-
```xml
```
- 测试

- preHandle : 优先于Controller 之前执行
- 返回 true,能够正常执行后续的代码(Controller)
- 返回false 请求不会发送给Controller
- postHandle : 执行完 Controller方法之后 执行此方法 ,一旦出现错误异常,不会执行

- afterCompletion : Controller方法之后执行,无论是否出现异常
没有报错
- LoginInterceptor.preHandle
- UserController.getUser
- LoginInterceptor.postHandle
- LoginInterceptor.afterCompletion
# RESTful
http://127.0.0.1:8080/web/get?id=10
http://localhost:8080/web/user/get/1
http://localhost:8080/web/user/get/2
http://localhost:8080/web/user/get/3
http://localhost:8080/web/user/get/4
http://localhost:8080/web/user/post/1/admin/12456
http://localhost:8080/web/user/post/2/root/123456
# ssm整合(配置文件)
- webapp项目
- 添加依赖
- springmvc
- spirng +mybatis
- aop
- spring -jdbc
- mybatis......
- 单元测试
- 搭建SpringMVC、
- web.xml-- DispatcherServlet
- spring-ssm-xml
- 包扫描
- 注解驱动
- Controller
- Mybaits整合
- 配置文件中配置
- 数据源
- SqlSessionFactory
- Mapper 包扫描(IOC容器中注册 Mapper.java )
- Service
- 根据ID获取部门 controller-service-mapper
## 创建项目
webapp骨架\
com.neuedu.ssm
## 添加依赖
```xml
4.0.0
com.neuedu.ssm
springmvc-05-ssm-xml
1.0-SNAPSHOT
war
springmvc-05-ssm-xml Maven Webapp
http://www.example.com
UTF-8
8
8
5.3.39
5.11.4
4.0.1
8.0.33
3.5.19
2.0.0
1.2.24
2.9.0
org.junit.jupiter
junit-jupiter-api
${junit.version}
test
org.springframework
spring-test
${spring.version}
test
org.springframework
spring-webmvc
${spring.version}
com.fasterxml.jackson.core
jackson-databind
${jackson.version}
javax.servlet
javax.servlet-api
${servlet.version}
provided
org.springframework
spring-jdbc
${spring.version}
mysql
mysql-connector-java
${mysql.version}
org.mybatis
mybatis
${mybatis.version}
org.mybatis
mybatis-spring
${mybatis.spring.version}
com.alibaba
druid
${druid.version}
```
## 搭建spirngmvc
### 配置 web.xml
- 配置DispatcherServlet
```xml
Archetype Created Web Application
DispatcherServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:springmvc-ssm.xml
1
DispatcherServlet
/
```
### 配置spirng-ssm.xml
```xml
```
### 编写Controller(DeptController)
```java
package com.neuedu.ssm.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author 金山
* 项目:springmvc-learn
* site: https://blog.fulfill.com.cn
* 描述
* @data 2025/3/1814:33
*/
@RestController
@RequestMapping("/dept")
public class DeptController {
@GetMapping("/{id}")
public String getByid(@PathVariable int id){
return "invoke get method id:"+id;
}
}
```
### 部署
将项目添加到Tomcat 部署并测试
http://localhost:8080/ssm/dept/10

## 整合Mybatis
- 依赖已经完成了
- 在IOC容器中注册 数据源、SqlSessionFactory、Mapper代理对象
### 配置mybatis(在SpirngIOC容器中)
```xml
```
### 生成Mybatis代码




生成完之后的代码

### 编写 Controller、Service
Controller、Service、Mapper(DAO) 三层架构
```jvaa
package com.neuedu.ssm.controller;
import com.neuedu.ssm.po.Dept;
import com.neuedu.ssm.service.IDeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author 金山
* 项目:springmvc-learn
* site: https://blog.fulfill.com.cn
* 描述
* @data 2025/3/1814:33
*/
@RestController
@RequestMapping("/dept")
public class DeptController {
@Autowired
private IDeptService deptService;
@GetMapping("/{id}")
public Dept getByid(@PathVariable long id){
return deptService.getById(id);
}
}
```
```
package com.neuedu.ssm.service;
import com.neuedu.ssm.po.Dept;
/**
* @author 金山
* 项目:springmvc-learn
* site: https://blog.fulfill.com.cn
* 描述
* @data 2025/3/1814:46
*/
public interface IDeptService {
public Dept getById(long id);
}
```
```
package com.neuedu.ssm.service.impl;
import com.neuedu.ssm.mapper.DeptMapper;
import com.neuedu.ssm.po.Dept;
import com.neuedu.ssm.service.IDeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @author 金山
* 项目:springmvc-learn
* site: https://blog.fulfill.com.cn
* 描述
* @data 2025/3/1814:47
*/
@Service
public class DeptServiceImpl implements IDeptService {
@Autowired
private DeptMapper deptMapper;
@Override
public Dept getById(long id) {
return deptMapper.selectByPrimaryKey(id);
}
}
```
### 部署测试
http://localhost:8080/ssm/dept/1


# ssm整合(配置类-纯注解)
- webapp项目
- 添加依赖
- springmvc
- spirng +mybatis
- aop
- spring -jdbc
- mybatis......
- 单元测试
- 搭建SpringMVC、
- web.xml-- DispatcherServlet
- spring-ssm-xml
- 包扫描
- 注解驱动
- Controller
- Mybaits整合
- 配置文件中配置
- 数据源
- SqlSessionFactory
- Mapper 包扫描(IOC容器中注册 Mapper.java )
- Service
- 根据ID获取部门 controller-service-mapper
## 创建项目
webapp骨架
com.neuedu.ssm
## 添加依赖
```xml
4.0.0
com.neuedu.ssm
springmvc-05-ssm-xml
1.0-SNAPSHOT
war
springmvc-05-ssm-xml Maven Webapp
http://www.example.com
UTF-8
8
8
5.3.39
5.11.4
4.0.1
8.0.33
3.5.19
2.0.0
1.2.24
2.9.0
org.junit.jupiter
junit-jupiter-api
${junit.version}
test
org.springframework
spring-test
${spring.version}
test
org.springframework
spring-webmvc
${spring.version}
com.fasterxml.jackson.core
jackson-databind
${jackson.version}
javax.servlet
javax.servlet-api
${servlet.version}
provided
org.springframework
spring-jdbc
${spring.version}
mysql
mysql-connector-java
${mysql.version}
org.mybatis
mybatis
${mybatis.version}
org.mybatis
mybatis-spring
${mybatis.spring.version}
com.alibaba
druid
${druid.version}
```
## 搭建spirngmvc
### 配置 web.xml
- 配置DispatcherServlet
### 配置类
```java
package com.neuedu;
import com.neuedu.ssm.SSMConfigAPP;
import com.neuedu.ssm.WebConfig;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
/**
* @author 金山
* 项目:springmvc-learn
* site: https://blog.fulfill.com.cn
* 描述
* @data 2025/3/198:57
*/
public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
/**
* 返回一个带有@Configuration注解的类。
* 用来创建整个应用程序的全局Spring容器。
* 也就是等同于创建applicationContext.xml容器
*/
@Override
protected Class>[] getRootConfigClasses() {
return new Class[] {SSMConfigAPP.class};
}
/**
* 返回一个带有@Configuration注解的类。
* 用来创建SpringMVC(即Web相关)的Spring容器。
* 也就是等同于创建springmvc-servlet.xml容器
*/
@Override
protected Class>[] getServletConfigClasses() {
return new Class[] {WebConfig.class};
}
//配置SpringMVC前端控制器映射路径
@Override
protected String[] getServletMappings() {
return new String[] {"/"};
}
}
```
- 加载getServletConfigClasses 用于声明 Servlet 相关的操作(@EnableWebMvc 让Controller 生效)
- 加载getRootConfigClasses : 加载的是 非Controller(service)
```java
package com.neuedu.ssm;
import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.logging.stdout.StdOutImpl;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.TransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import javax.sql.DataSource;
/**
* @author 金山
* 项目:springmvc-learn
* site: https://blog.fulfill.com.cn
* 描述
* @data 2025/3/198:44
*/
@Configuration
@ComponentScan(basePackages = "com.neuedu.ssm")
@EnableTransactionManagement
public class SSMConfigAPP {
/**
* 声明数据源
* @return
*/
@Bean
public DataSource dataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl("jdbc:mysql://localhost:3306/his?useSSL=false");
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUsername("root");
dataSource.setPassword("root");
return dataSource;
}
/**
* 事务管理器( spring-tx包 已经写好的 通知)
* @param dataSource
* @return
*/
@Bean
public TransactionManager transactionManager(DataSource dataSource){
TransactionManager transactionManager = new DataSourceTransactionManager(dataSource);
return transactionManager;
}
/**
* SqlSessionFactory
* @param dataSource
* @return
* @throws Exception
*/
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource ) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
//设置 mybaits的 settingxxxxxx
org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
configuration.setLogImpl(StdOutImpl.class);
sqlSessionFactoryBean.setConfiguration(configuration);
sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));
return sqlSessionFactoryBean.getObject();
}
/**
* 扫描 MyBatis中 Mapper的 包,并注册在 IOC容器中
* @param sqlSessionFactory
* @return
*/
@Bean
public MapperScannerConfigurer mapperSanccer(SqlSessionFactory sqlSessionFactory){
MapperScannerConfigurer scannerConfigurer = new MapperScannerConfigurer();
//创建一堆 Mapper的扫描
scannerConfigurer.setBasePackage("com.neuedu.ssm.mapper");
scannerConfigurer.setSqlSessionFactory(sqlSessionFactory);
return scannerConfigurer;
}
}
```
```java
package com.neuedu.ssm;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
/**
* @author 金山
* 项目:springmvc-learn
* site: https://blog.fulfill.com.cn
* 描述
* @data 2025/3/198:59
*/
@Configuration
@EnableWebMvc // Controller
@ComponentScan(basePackages = "com.neuedu.ssm")
public class WebConfig {
}
```
### 从springmvc-05-ssm-xml中将所有java代码粘贴过来

### 部署测试
http://localhost:8080/ssm/dept/1


## MapperScan注解
在配置类中声明下面的注解 代替 @Bean注册Mapper
@MapperScan("com.neuedu.ssm.mapper")

## 注解方式读取 jdbc.properties
使用@PropertiSourced读取 属性文件 到 当前类的属性中
```java
package com.neuedu.ssm;
import com.alibaba.druid.pool.DruidDataSource;
import com.neuedu.ssm.annotation.MyAnnotation;
import org.apache.ibatis.logging.stdout.StdOutImpl;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.TransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import javax.sql.DataSource;
/**
* @author 金山
* 项目:springmvc-learn
* site: https://blog.fulfill.com.cn
* 描述
* @data 2025/3/198:44
*/
@Configuration
@ComponentScan(basePackages = "com.neuedu.ssm")
@MapperScan("com.neuedu.ssm.mapper")
@EnableTransactionManagement
@PropertySource("classpath:jdbc.properties")
public class SSMConfigAPP {
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.driverClass}")
private String driverClass;
/**
* 声明数据源
* @return
*/
// @Bean
// public DataSource dataSource(){
// DruidDataSource dataSource = new DruidDataSource();
// dataSource.setUrl("jdbc:mysql://localhost:3306/his?useSSL=false");
// dataSource.setDriverClassName("com.mysql.jdbc.Driver");
// dataSource.setUsername("root");
// dataSource.setPassword("root");
//
//
// return dataSource;
// }
@Bean
public DataSource dataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(url);
dataSource.setDriverClassName(driverClass);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
/**
* 事务管理器( spring-tx包 已经写好的 通知)
* @param dataSource
* @return
*/
@Bean
public TransactionManager transactionManager(DataSource dataSource){
TransactionManager transactionManager = new DataSourceTransactionManager(dataSource);
return transactionManager;
}
/**
* SqlSessionFactory
* @param dataSource
* @return
* @throws Exception
*/
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource ) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
//设置 mybaits的 settingxxxxxx
org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
configuration.setLogImpl(StdOutImpl.class);
sqlSessionFactoryBean.setConfiguration(configuration);
sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));
return sqlSessionFactoryBean.getObject();
}
// /**
// * 扫描 MyBatis中 Mapper的 包,并注册在 IOC容器中
// * @param sqlSessionFactory
// * @return
// */
// @Bean
// public MapperScannerConfigurer mapperSanccer(SqlSessionFactory sqlSessionFactory){
// MapperScannerConfigurer scannerConfigurer = new MapperScannerConfigurer();
//
//
// //创建一堆 Mapper的扫描
//
// scannerConfigurer.setBasePackage("com.neuedu.ssm.mapper");
// scannerConfigurer.setSqlSessionFactory(sqlSessionFactory);
//
// return scannerConfigurer;
// }
}
```
# CRUD 测试
## Dept
DeptMapper。xml
DeptMapper.java
添加了一个 selectList的方法
## 编写Service
IDeptService 接口和 DeptServiceImpl 实现类
## DeptController
### 查询集合
```
@GetMapping("/list")
public List list(){
return deptService.list();
}
```
APIfox 邀请
狐友K4d9 在 Apifox 邀请你加入团队 个人团队 https://app.apifox.com/invite?token=CqwCXUzmMBjmWH04cbPgS
