文章目录
核心步骤
- 创建maven webapp工程
- 在工程的pom.xml中添加依赖
- 搭建SpringMvc的基本环境
- 整合Spring
- 整合Mybatis
- SSM开启事务管理
具体实现
创建maven Webapp工程
cmd界面使用以下命令创建工程
mvn org.apache.maven.plugins:maven-archetype-plugin:3.1.2:generate -DarchetypeArtifactId="maven-archetype-webapp" -DarchetypeGroupId="org.apache.maven.archetypes" -DarchetypeVersion="1.4"
pom.xml中添加依赖
<dependencies>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!--Spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.3.1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.3.1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.1</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.6</version>
</dependency>
<!--SpringMvc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.1</version>
</dependency>
<!--json-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.12.0-rc2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.0-rc2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.12.0-rc2</version>
</dependency>
<!--servlet3 4版本不行-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<!--druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<!--mybatis-spring-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>
</dependencies>
搭建SpringMvc的环境
- 编写SpringMvc的配置类
@ComponentScan("com.dean.controller")
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
//视图解析器
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
InternalResourceViewResolver viewResolver=new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".jsp");
registry.viewResolver(viewResolver);
}
//配置静态资源:允许访问静态资源
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
//配置主页面:设定/默认返回页面
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("index"); //index会自动与视图解析器的前后缀结合
}
}
- 编写前端控制器UserController
@RestController
@RequestMapping("/user")
public class UserController {
}
- 编写启动类
public class WebServerInit extends AbstractAnnotationConfigDispatcherServletInitializer {
//Spring
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[0];
}
//SpringMvc
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{WebConfig.class};
}
//Mapping
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
- 编写前端页面
测试后显示主页面如下:
整合Spring
整合Spring,主要就是编写三层架构
- 配置类AppConfig,并在WebServerInit中配置
@ComponentScan("com.dean.service")
public class AppConfig {
}
WebServerInit中的getRootConfigClasses
- 完成Service接口并编写test方法
@Service
public class UserServiceIm implements UserService {
@Override
public void test() {
System.out.println("User Service test");
}
}
- UserController中注入UserService并调用test方法
- 测试结果
整合MyBatis
通过Spring托管数据源
- 编写资源文件data.properties,提供连接数据库的参数
jdbc.url=jdbc:mysql://192.168.100.2:3306/ssm?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.user=root
jdbc.pwd=**** #填写自己的密码
- AppConfig中指定资源文件位置 并将数据源注入到容器
@Configuration
@ComponentScan("com.dean.service")
@PropertySource({"classpath:data.properties"}) //指定资源文件路径
public class AppConfig {
@Autowired
private Environment env;
@Bean("dataSource") //注入数据源到Spring容器
public DataSource dataSource()
{
String driver=env.getProperty("jdbc.driver");
String url=env.getProperty("jdbc.url");
String username=env.getProperty("jdbc.user");
String pwd=env.getProperty("jdbc.pwd");
DruidDataSource dataSource=new DruidDataSource();
dataSource.setDriverClassName(driver);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(pwd);
return dataSource;
}
}
通过Spring托管Session工厂
- AppConfig中注入SqlSessionFactoryBean
@Bean
public SqlSessionFactoryBean getSessionFactory(@Qualifier("dataSource") DataSource dataSource)
{
SqlSessionFactoryBean sqlSessionFactoryBean=new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
return sqlSessionFactoryBean;
}
- 在controller中进行测试
测试结果
创建Mapper接口和对象关系映射文件
- 创建pojo类
数据库中表格式如下:
pojo类
//@Data是lombok中的注释
//lombok与IDEA 2020版本不兼容,需要自己去下载插件,百度搜索解决方式即可
@Data
public class User {
private String id;
private String name;
private Integer age;
private Date birth;
}
- 编写Mapper查询接口和对象映射文件UserMapper.xml
Mapper查询接口
public interface UserMapper {
List<User> findAll();
}
对象映射文件
<?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.dean.mapper.UserMapper">
<resultMap id="baseMap" type="com.dean.model.User">
<id property="id" column="ID"></id>
<result property="name" column="NAME"></result>
<result property="age" column="AGE"></result>
<result property="birth" column="BIRTH"></result>
</resultMap>
<select id="findAll" resultMap="baseMap">
select * from user;
</select>
</mapper>
配置Mybatis,(mapper接口位置、对象映射文件所在位置)
- AppConfig中配置Mapper查询接口所在的位置
- AppConfig中的Session工厂中配置对象关系映射文件所在的位置
MyBatis整合完成测试
在Controller层进行测试
启动tomcat后显示结果
与数据库数据一致
ssm管理事务
- 准备工作,编写一个新增用户的接口
前端视图
<form action="/user/addUser" method="post">
<p>
<label for="name">Name:</label>
<input type="text" id="name" name="name">
</p>
<p>
<label for="age">Age:</label>
<input type="text" id="age" name="age">
</p>
<p>
<label for="birth">Birth:</label>
<input type="date" id="birth" name="birth">
</p>
<p>
<input type="submit" value="添加用户">
</p>
</form>
前端控制器
@PostMapping("/addUser")
public ModelAndView addUser(User user) throws Exception
{
user.setId(UUID.randomUUID().toString());
userService.addUser(user);
return new ModelAndView("success");
}
Service层代码:抛出异常后应回滚
@Override
public void addUser(User user) throws Exception {
userMapper.addUser(user); int count=userMapper.selectCount(user.getName());
//判断用户是否唯一,如果不唯一,则进行回滚
if(count>1)
{
throw new RuntimeException("用户名已被注册");
}
}
- 在AppConfig中配置事务管理器,并通过注释开启事务管理
@Bean
public DataSourceTransactionManager getDataSourceTransactionManager(@Qualifier("dataSource") DataSource dataSource)
{
DataSourceTransactionManager transactionManager=new DataSourceTransactionManager(dataSource);
return transactionManager;
}
在AppConfig的头部添加注释开启事务管理
- 在Service层目标方法处添加注释使用事务
- 附加:进行统一异常处理
编写统一异常类
@ControllerAdvice
public class BasicControllerAdvice {
//对自定义异常的处理
@ExceptionHandler(RuntimeException.class)
public ModelAndView customError(Exception e, Model model)
{
//将异常信息放入model
model.addAttribute("message",e.getMessage());
return new ModelAndView("error");
}
}
将advice层加入容器
在SpringMVC的配置类WebConfig中扫描advice的路径