前言
昨天拿到了第一份实习 offer,无奈牛魔学院不让走,导员说学校的实训(装个hadoop环境都得两三天的课程)比实习强多了,没办法,我只能心里说“汝之顶患疾久矣,莫如粪”,然后和导员笑着说说“好的呢”,其实心里万马奔腾。也是没有办法,country让促进就业、大力xxx、全力、三步走、六个抓牢、七个推进、就业加速度 ... 都是扯淡,下面的领导们才不关心你就不就业,搬砖还是吃土。
1、SSM 整合
1.1、总览
SSM 整合
- Spring
- SpringConfig
- Mybatis
- MybatisConfig
- JdbcConfig
- jdbc.properties
- SpringMVC
- ServletConfig
- SpringMvcConfig
功能模块
- 表与实体类
- dao(接口 + 自动代理)
- service(接口 + 实现类)
- 业务层接口测试(整合 JUnit)
- controller
- 表现层接口测试(PostMan)
1.2、Spring 整合 Mybatis
1.2.1、Spring 配置类
这里先设置 Spring 负责管理的 Bean 路径
@Configuration @ComponentScan({"com.lyh.service"}) @PropertySource("jdbc.properties") @Import({JdbcConfig.class,MybatisConfig.class}) public class SpringConfig { }
这里的 jdbc.properties 是为了整合 Mybatis 用的:
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/ssm_db jdbc.username=root jdbc.password=Yan1029.
如果报错:Could not open ServletContext resource [/jdbc.properties] 就替换为 @PropertySource("classpath:jdbc.properties")
1.2.2、Jdbc 配置类
public class JdbcConfig { @Value("${jdbc.driver}") private String driver; @Value("${jdbc.url}") private String url; @Value("${jdbc.username}") private String username; @Value("${jdbc.password}") private String password; @Bean public DataSource dataSource(){ DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName(driver); dataSource.setUrl(url); dataSource.setUsername(username); dataSource.setPassword(password); return dataSource; } }
1.2.3、Mybatis 配置类
这里需要写两个方法,分别负责返回 Mybatis 创建连接对象的工厂和设置 Mybatis 的 Mapper 扫描包(Mapper 接口所在的包)。
public class MybatisConfig { @Bean public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource){ SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); factoryBean.setDataSource(dataSource); factoryBean.setTypeAliasesPackage("com.lyh.domain"); return factoryBean; } @Bean public MapperScannerConfigurer mapperScannerConfigurer(){ MapperScannerConfigurer msc = new MapperScannerConfigurer(); msc.setBasePackage("com.lyh.dao"); return msc; } }
1.2.4、事务处理
1、首先在 JdbcConfig 中添加事务管理器
@Bean public PlatformTransactionManager transactionManager(DataSource dataSource){ return new DataSourceTransactionManager(dataSource); }
2、然后在 SpringConfig 中启用事务
3、最后在 BookService 设置事务注解
@Transactional public interface BookService { //... }
1.3、Spring 整合 SpringMVC
1.3.1、Servlet 容器配置类
public class ServletConfig extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class<?>[] getRootConfigClasses() { return new Class[]{SpringConfig.class}; } // Web 容器加载的是 SpringMVC 的配置类 @Override protected Class<?>[] getServletConfigClasses() { return new Class[]{SpringMvcConfig.class}; } @Override protected String[] getServletMappings() { return new String[]{"/"}; } // 中文乱码处理 @Override protected Filter[] getServletFilters() { CharacterEncodingFilter filter = new CharacterEncodingFilter(); filter.setEncoding("UTF-8"); return new Filter[]{filter}; } }
注意:这里 getRootConfigClass 和 getServletConfigClass 造出来的容器对象不是同一个容器对象。但是 SpringMVC 的容器可以访问 Spring 的容器,但是 Spring 的容器不能访问 SpringMVC 的容器。 也就相当于 Spring 的容器是父容器,而 SpringMVC 是子容器,儿子可以向父亲无限索取,但是父亲却不能向儿子索取一点。
1.3.2、SpringMVC 配置类
@Configuration @ComponentScan("com.lyh.controller") @EnableWebMvc public class SpringMvcConfig { }
到这里我们就把 Spring、Mybatis 和 SpringMVC 整合在了一起,这样当我们的 Web 容器启动的时候,他就会把我们 SpringConfig 和 SpirngMvcConfig 进行加载,然后这两个配置类会各自加载自己对应的 Bean。
1.4、功能模块开发
先把文件创建出来:
- 在 domain 下创建 Book 类
- 在 dao 下创建 BookDao 接口
- 在 service 下创建 BookService 接口
- 在 service 下的 impl 下创建 BookServiceImpl 实现类
- 在 controller 下创建 BookController 控制器类
1.4.1、dao 层
public interface BookDao { // @Insert("insert into tbl_book values(null,#{type},{name},{description})") @Insert("insert into tbl_book (type,name,description) values(null,#{type},{name},{description})") void save(Book book); @Update("update tbl_book set type = #{type},name = #{},description = #{description} where id = #{id}") void update(Book book); @Delete("delete from tbl_book where id = #{id}") void delete(Integer id); @Select("select * from tbl_book where id = #{id}") Book getById(); @Select("select * from tbl_book") List<Book> getAll(); }
这里的两个插入语句都是可以的。
1.4.2、service 层
1)service 接口开发
接口我们按照开发规范是必须写注释的。
public interface BookService { /** * 新增 * @param book * @return */ boolean save(Book book); /** * 更新 * @param book * @return */ boolean update(Book book); /** * 根据 id 删除 * @return */ boolean delete(Integer id); /** * 按照 id 查询 * @param id * @return */ Book getById(Integer id); /** * 查询所有 * @return */ List<Book> getAll(); }
2)接口实现
com.lyh.service 这个包已经被我们设置让 Spring 管理了 ,这里因为要用到 BookDao 的实现类对象,所以这里自动装配一下就好了,因为我们在 BookDao 中已经配置了自动代理了。
@Service public class BookServiceImpl implements BookService { @Autowired private BookDao bookDao; @Override public boolean save(Book book) { bookDao.save(book); return true; } @Override public boolean update(Book book) { bookDao.update(book); return true; } @Override public boolean delete(Integer id) { bookDao.delete(id); return true; } @Override public Book getById(Integer id) { return bookDao.getById(id); } @Override public List<Book> getAll() { return bookDao.getAll(); } }
1.4.3、controller 层
controller 层依赖我们的 BookService 实现类。
@RestController @RequestMapping("/books") public class BookController { @Autowired private BookService bookService; @PostMapping public boolean save(@RequestBody Book book) { return bookService.save(book); } @PutMapping public boolean update(@RequestBody Book book) { return bookService.update(book); } @DeleteMapping("/{id}") public boolean delete(@PathVariable Integer id) { return bookService.delete(id); } @GetMapping("/{id}") public Book getById(@PathVariable Integer id) { return bookService.getById(id); } @GetMapping public List<Book> getAll() { return bookService.getAll(); } }
SpringMVC(四)【SSM 整合、统一结果封装、异常处理、前后台协议联调】(2)https://developer.aliyun.com/article/1534218