SSM整合(纯注解版)

复习 SSM~写的不好,仍需努力,欢迎交流。

流程分析

  1. 创建 Maven 的 Web 工程;
  2. 引入 SSM 相关依赖及 Tomcat 服务器配置;
  3. SSM 配置类
    • Spring & MyBatisSpringMybatisConfig - db.properties
    • SpringMVCServletContainerInitConfig - SpringMvcConfig
  4. 功能模块
    • 数据库表与实体类;
    • 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:

    1. 在 SpringMybatis 配置类上标注 @EnableAspectJAutoProxy 注解;

    2. 创建 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 事务管理:

    1. 在 SpringMybatis 配置类上标注 @EnableTransactioManagement 注解;

    2. 在 SpringMybatis 配置类中注册 PlatformTransactionManager 平台事务管理器,通过 DataSourceTransactionManager 注册;

    3. 在需要开启 Spring 事务管理的位置标注 @Transactional 注解。

  • Spring & MyBatisSpringMybatisConfig - 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;
        }
    }
    
  • SpringMVCServletContainerInitConfig - 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}

版权声明:本文为weixin_45033015原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。