复习 SSM~写的不好,仍需努力,欢迎交流。
流程分析
- 创建 Maven 的 Web 工程;
- 引入 SSM 相关依赖及 Tomcat 服务器配置;
- SSM 配置类
- Spring & MyBatis:
SpringMybatisConfig-db.properties;- SpringMVC:
ServletContainerInitConfig-SpringMvcConfig。- 功能模块
- 数据库表与实体类;
- Dao(Mapper 接口及 Mapper 映射文件);
- Service(接口 + 实现类)
- Controller
引入相关依赖
引入 SSM 相关依赖及 Tomcat 服务器配置;
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>80</port>
<path>/</path>
<uriEncoding>UTF-8</uriEncoding>
</configuration>
</plugin>
</plugins>
</build>
SSM 配置类
Spring AOP:
在 SpringMybatis 配置类上标注
@EnableAspectJAutoProxy注解;创建 Aspect 切面类。
@Component @Aspect public class BookAspect { @Pointcut("execution(boolean com.sun.service.*Service.*(..))") public void pointCut(){} @Around("pointCut()") public Object around(ProceedingJoinPoint pjp){ Object result = null; try { result = pjp.proceed(); boolean flag = (boolean) result; if (flag){ System.out.println("执行成功"); } else { System.out.println("执行失败"); } } catch (Throwable e) { throw new RuntimeException(e); } return result; } }
Spring 事务管理:
在 SpringMybatis 配置类上标注
@EnableTransactioManagement注解;在 SpringMybatis 配置类中注册
PlatformTransactionManager平台事务管理器,通过DataSourceTransactionManager注册;在需要开启 Spring 事务管理的位置标注
@Transactional注解。
Spring & MyBatis:
SpringMybatisConfig-db.properties;# db.properties jdbc.driverClassName=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/spring_db?characterEncoding=UTF-8&serverTimezone=GMT%2B8 jdbc.username=root jdbc.password=root mapperLocations=classpath*:mappers/*Mapper.xml typeAliasesPackage=com.sun.entity@Configuration @ComponentScan({"com.sun.service", "com.sun.aspect"}) @MapperScan("com.sun.mapper") @EnableTransactionManagement @EnableAspectJAutoProxy @PropertySource("classpath:db.properties") public class SpringMybatisConfig { @Value("${jdbc.driverClassName}") private String driverClassName; @Value("${jdbc.url}") private String url; @Value("${jdbc.username}") private String username; @Value("${jdbc.password}") private String password; @Value("${mapperLocations}") private String mapperLocations; @Value("${typeAliasesPackage}") private String typeAliasesPackage; @Bean public DataSource dataSource(){ DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName(driverClassName); dataSource.setUrl(url); dataSource.setUsername(username); dataSource.setPassword(password); return dataSource; } @Bean public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource) throws IOException { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dataSource); PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); Resource[] resources = resolver.getResources(mapperLocations); sqlSessionFactoryBean.setMapperLocations(resources); sqlSessionFactoryBean.setTypeAliasesPackage(typeAliasesPackage); return sqlSessionFactoryBean; } @Bean public PlatformTransactionManager platformTransactionManager(DataSource dataSource){ DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager(); dataSourceTransactionManager.setDataSource(dataSource); return dataSourceTransactionManager; } }SpringMVC:
ServletContainerInitConfig-SpringMvcConfig。@Configuration @ComponentScan("com.sun.controller") @EnableWebMvc public class MvcConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/pages/**").addResourceLocations("/pages/"); registry.addResourceHandler("/css/**").addResourceLocations("/css/"); registry.addResourceHandler("/js/**").addResourceLocations("/js/"); registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/"); } }public class ServletContainerInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer { // Spring @Override protected Class<?>[] getRootConfigClasses() { return new Class[]{SpringMybatisConfig.class}; } // Spring MVC @Override protected Class<?>[] getServletConfigClasses() { return new Class[]{MvcConfig.class}; } // Spring MVC 处理的请求路径 @Override protected String[] getServletMappings() { return new String[]{"/"}; } // 处理乱码 @Override protected Filter[] getServletFilters() { CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter(); characterEncodingFilter.setEncoding("UTF-8"); return new Filter[]{characterEncodingFilter}; } }
功能模块
数据库表与实体类;
id int(PK & AUTO_INCREMENT) type varchar name varchar decsription varchar@Data @NoArgsConstructor @AllArgsConstructor public class Book { private Integer id; private String type; private String name; private String description; }Dao(Mapper 接口及 Mapper 映射文件);
public interface BookMapper { Book getOne(@Param("id") Integer id); List<Book> getBooks(); int add(Book book); int modify(Book book); int delete(@Param("id") Integer id); }<mapper namespace="com.sun.mapper.BookMapper"> <select id="getBookById" resultType="book"> select * from tb_book where id = #{id} </select> <select id="getBooks" resultType="book"> select * from tb_book </select> <insert id="save"> insert into tb_book values(null, #{type}, #{name}, #{description}) <!-- insert into tb_book(type, name, description) values(#{type}, #{name}, #{description}) --> </insert> <update id="modify"> update tb_book set type = #{type}, name = #{name}, description = #{description} where id = #{id} </update> <delete id="delete"> delete from tb_book where id = #{id} </delete> </mapper>Service(接口 + 实现类)
@Transactional public interface BookService { Book getBookById(Integer id); List<Book> getBooks(); boolean add(Book book); boolean modify(Book book); boolean delete(Integer id); }@Service public class BookServiceImpl implements BookService { @Autowired private BookMapper bookMapper; @Override public Book getBookById(Integer id) { return bookMapper.getBookById(id); } @Override public List<Book> getBooks() { return bookMapper.getBooks(); } @Override public boolean add(Book book) { return bookMapper.add(book); } @Override public boolean modify(Book book) { return bookMapper.modify(book); } @Override public boolean delete(Integer id) { return bookMapper.delete(id); } }Controller
@RestController @RequestMapping("/books") public class BookController { @Autowired private BookService bookService; @GetMapping("/{id}") public Book getBookById(@PathVariable Integer id){ return bookService.getBookById(id); } @GetMapping public List<Book> getBooks(){ return bookService.getBooks(); } @PostMapping public boolean add(@RequestBody Book book){ return bookService.add(book); } @PutMapping public boolean modify(@RequestBody Book book){ return bookService.modify(book); } @DeleteMapping("/{id}") public boolean delete(@PathVariable Integer id){ return bookService.delete(id); } }
测试
业务方法测试
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = SpringMybatisConfig.class) public class AssembleTest { @Autowired private BookService bookService; @Test public void getBookById(){ System.out.println("BookService#getBookById()"); Book bookById = bookService.getBookById(1); System.out.println(bookById); } ... }接口测试
- GET:
localhost/books/{id}&localhost/books - POST:
localhost/books(在请求体中设置 JSON 数据) - PUT:
localhost/books(在请求体中设置 JSON 数据) - DELETE:
localhost/books/{id}
- GET:
版权声明:本文为weixin_45033015原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。