SSM 整合详细步骤与配置
SSM(Spring + SpringMVC + MyBatis)是功能强大的开发框架,要使用它我们首先要学会如何将这三大模块整合起来,本篇文章我们就来实现 SSM 的整合!!!
整合流程主要分为以下三块(第 3 部分主要是功能测试模块,不属于具体整合的范围内):
一、创建工程
① 创建一个 maven 项目(基于 webapp 起步)
② 将项目完整化(File ---> Project Structure)
③ 向 pom.xml 文件中导入相关依赖的坐标
org.springframework spring-webmvc 5.2.10.RELEASE org.springframework spring-jdbc 5.2.10.RELEASE org.springframework spring-test 5.2.10.RELEASE mysql mysql-connector-java 5.1.47 org.mybatis mybatis 3.5.6 org.mybatis mybatis-spring 1.3.0 com.alibaba druid 1.1.16 junit junit 4.12 test javax.servlet javax.servlet-api 3.1.0 provided com.fasterxml.jackson.core jackson-databind 2.9.0 org.apache.tomcat.maven tomcat7-maven-plugin 2.2 80 /
④ 配置 tomcat 环境
二、SSM 整合
① 创建项目结构
② 在 SpringConfig.java 类,配置 Spring
@Configuration@ComponentScan({"com.ssm.integration.service","com.ssm.integration.dao"})// 扫描service和dao包下的bean@PropertySource("classpath:jdbc.properties")// 指定jdbc.properties配置文件后才能使用其数据【不加classpath可能会出错】@Import({JdbcConfig.class, MyBatisConfig.class})// 导入mybatis的配置类,就不用在JdbcConfig和MyBatisConfig上加@Configuration注解了public class SpringConfig {}
③ 在 MyBaitsConfig.java、JdbcConfig.java、jdbc.peoperties 类中,配置 MyBatis
jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/db1jdbc.username=rootjdbc.password=root
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; /** * 配置数据源 * @return */ @Bean public DataSource dataSource() { DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName(driver); dataSource.setUrl(url); dataSource.setUsername(username); dataSource.setPassword(password); return dataSource; }}
public class MyBatisConfig { /** * 注册并配置SqlSessionFactoryBean实例,并将之前配置好的DataSource实例注入进去 * @param dataSource * @return */ @Bean public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource) { SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); factoryBean.setDataSource(dataSource); factoryBean.setTypeAliasesPackage("com.ssm.integration.pojo");// 设置别名 // 如果dao包下存在mapper映射的.xml文件,则需指定.xml文件的位置 factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResource("classpath:com/**/dao/impl/*.xml")); return factoryBean; } /** * 扫描指定包下的bean,将dao层的接口自动代理生成实现类(在接口里需要声明注解式的SQL语句);可以不用加@Mapper注解 * @return */ @Bean public MapperScannerConfigurer mapperScannerConfigurer() { MapperScannerConfigurer msc = new MapperScannerConfigurer(); msc.setBasePackage("com.ssm.integration.dao"); return msc; }}
④ 在 SpringMvcConfig.java、ServletConfig.java(自定义名)类中,配置 SpringMVC
@Configuration@ComponentScan("com.ssm.integration.controller")// 扫描controller包下的bean@EnableWebMvc// 许多mvc功能(包括Json字符串映射)public class SpringMvcConfig {}
public class ServletConfig extends AbstractAnnotationConfigDispatcherServletInitializer { @Override// 加载Spring的配置文件 protected Class[] getRootConfigClasses() { return new Class[]{SpringConfig.class}; } @Override// 加载SpringMVC的配置文件 protected Class[] getServletConfigClasses() { return new Class[]{SpringMvcConfig.class}; } @Override// 配置SpringMVC要处理的路径("/"表示全部路径都交予SpringMVC处理) protected String[] getServletMappings() { return new String[]{"/"}; }}
三、功能模块
① 创建实体类 Book.java(表创建省略)
public class Book { private Integer id; private String name; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; }}
② 创建 BookDao.java 接口
//@Mapper // 这里,由于在配置MyBatis时使用自动代理,进行了MapperScan,所以可以省略@Mapperpublic interface BookDao { @Insert("insert into book values(null, #{name})") public void save(Book book); @Update("update book set name=#{name} where id=#{id}") public void update(Book book); @Delete("delete from book where id=#{id}") public void delete(Integer id); @Select("select * from book") public List selectAll();}
③ 创建 BookService.java 接口、和其实现类 BookServiceImpl.java
public interface BookService { /** * 新增一本书 * @param book */ public boolean save(Book book); /** * 按id修改 * @param book */ public boolean update(Book book); /** * 按id删除 * @param id */ public boolean delete(Integer id); /** * 查询所有书 * @return */ public List selectAll();}
@Servicepublic class BookServiceImpl implements BookService { // 这里如果报错,是因为bookDao的实现类是自动代理生成的,此时还没有bookDao // 而IDEA会自动检测不到就会报红,但不影响使用,可以忽略。也可以设置一下警告级别,具体操作这里就不多介绍了,有兴趣的小伙伴可以百度一下!!! @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 List selectAll() { return bookDao.selectAll(); }}
④ 创建 BookController.java
@RestController// @Controller和@Response的合体@RequestMapping("/book")// 这里使用 Restful 风格的方式进行资源访问(如果路径一样,就看其请求方式:GET、POST、PUT、DELETE....)public class BookController { @Autowired private BookService bookService; @PostMapping public boolean save(@RequestBody Book book) { bookService.save(book); return true; } @PutMapping public boolean update(@RequestBody Book book) { bookService.update(book); return true; } @DeleteMapping("/{id}") // Restful 风格的请求方式 public boolean delete(@PathVariable Integer id) { bookService.delete(id); return true; } @GetMapping public List getAll() { return bookService.selectAll(); }}