·SpringMVC(表示层)+Spring(业务层)+Mybatis(持久层)
业务层也是承接层,用来处理业务逻辑,通常使用数据库中的事务来进行,按照web层的要求来对数据层进行增删改查。
service是业务层,是使用一个或多个模型执行操作的方法:
·封装通用的业务逻辑、操作。如一些数据的校验,可以通用处理;
·与数据层交互;
·其他请求:如远程服务获取数据,如第三方api等。
持久层数据大概可以分为三个部分:DAO、文件系统和其他应用数据。
DAO由一下几个部分组成:
·DatabaseConnection:专门负责数据库的打开与关闭操作的类;
·VO:主要由属性、setter、getter、方法组成,VO类中的属性与表中的字段相对应,每一个VO类的对象都表示表中的每一条记录;
·DAO:主要定义操作的接口,定义一系列数据库的原子性操作,如增加、修改、删除和查询;
·impl:DAO接口的真实实现类,完成具体的数据库操作,但是不负责数据的打开和关闭;
·Proxy:代理实现类,主要完成数据库的打开和关闭操作,并且调用真实实现对象的操作;
·Factory:工厂类,通过工厂类取得一个DAO的实例化对象
项目的结构如下



总的SSM整合所需要的结构
config目录存放的是相关的配置类
controller编写的是Controller类
dao存放的是Dao接口,因为使用的是Mapper接口代理方式,所以没有实现类包
service存的是Service接口,impl存放的是Service实现类
resources:存入的是配置文件,如Jdbc.properties webapp:目录可以存放静态资源
test/java:存放的是测试类
- @Configuration //设定当前类为配置类
- @ComponentScan({"com.itheima.service"}) //扫描bean对象路径
- @PropertySource("classpath:jdbc.properties") //属性文件路径
- @Import({JdbcConfig.class,MyBatisConfig.class}) //导入配置文件
- @EnableTransactionManagement //
- public class SpringConfig {
- }
- jdbc.driver=com.mysql.jdbc.Driver
- jdbc.url=jdbc:mysql://localhost:3306/ssm_db
- jdbc.username=root
- jdbc.password=xhsxcsjcnh
- 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 //将方法的返回值作为定义为bean对象
- public DataSource dataSource(){
- DruidDataSource dataSource = new DruidDataSource();
- dataSource.setDriverClassName(driver);
- dataSource.setUrl(url);
- dataSource.setUsername(username);
- dataSource.setPassword(password);
- return dataSource;
- }
- @Bean
- public PlatformTransactionManager transactionManager(DataSource
- dataSource){
- DataSourceTransactionManager ds = new DataSourceTransactionManager();
- ds.setDataSource(dataSource);
- return ds;
- }
- }
- public class MyBatisConfig {
- @Bean
- public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource){
- SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
- factoryBean.setDataSource(dataSource);
- factoryBean.setTypeAliasesPackage("com.itheima.domain");
- return factoryBean;
- }
- @Bean
- public MapperScannerConfigurer mapperScannerConfigurer(){
- MapperScannerConfigurer msc = new MapperScannerConfigurer();
- msc.setBasePackage("com.itheima.dao");
- return msc;
- }
- }
- @Configuration
- @ComponentScan("com.itheima.controller")
- @EnableWebMvc
- public class SpringMvcConfig {
- }
- public class ServletConfig extends
- AbstractAnnotationConfigDispatcherServletInitializer {
- //加载Spring配置类
- protected Class>[] getRootConfigClasses() {
- return new Class[]{SpringConfig.class};
- }
- //加载SpringMVC配置类
- protected Class>[] getServletConfigClasses() {
- return new Class[]{SpringMvcConfig.class};
- }
- //设置SpringMVC请求地址拦截规则
- protected String[] getServletMappings() {
- return new String[]{"/"};
- }
- //设置post请求中文乱码过滤器
- @Override
- protected Filter[] getServletFilters() {
- CharacterEncodingFilter filter = new CharacterEncodingFilter();
- filter.setEncoding("utf-8");
- return new Filter[]{filter};
- }
- }
至此,SSM环境搭建完毕,接下来是功能模块的实现
建表

domain路径下编写Book模型类
- public class Book {
- private Integer id;
- private String type;
- private String name;
-
- //get,set,toString方法省略
- }
BookDao接口
- public interface BookDao {
- // @Insert("insert into tbl_book values(null,#{type},#{name},#{description})")
- @Insert("insert into tbl_book (type,name,description) values(#{type},# {name},#{description})")
- public void save(Book book);
- @Update("update tbl_book set type = #{type}, name = #{name}, description = #{description} where id = #{id}")
- public void update(Book book);
- @Delete("delete from tbl_book where id = #{id}")
- public void delete(Integer id);
- @Select("select * from tbl_book where id = #{id}")
- public Book getById(Integer id);
- @Select("select * from tbl_book")
- public List
getAll(); - }
BookService接口
- @Transactional
- public interface BookService {
- /**
- * 保存
- * @param book
- */
- public boolean save(Book book);
- /**
- * 修改
- * @param book
- * @return
- */
- public boolean update(Book book);
- /**
- * 按id删除
- * @param id
- * @return
- */
- public boolean delete(Integer id);
-
- /**
- * 按id查询
- * @param id
- * @return
- */
- public Book getById(Integer id);
-
- /**
- * 查询全部
- * @return
- */
- public List
getAll(); - }
BookService实现类
- @Service
- public class BookServiceImpl implements BookService {
- @Autowired
- private BookDao bookDao;
- public boolean save(Book book) {
- bookDao.save(book);
- return true;
- }
- public boolean update(Book book) {
- bookDao.update(book);
- return true;
- }
- public boolean delete(Integer id) {
- bookDao.delete(id);
- return true;
- }
- public Book getById(Integer id) {
- return bookDao.getById(id);
- }
- public List<Book> getAll() {
- return bookDao.getAll();
- }
- }
这里出现error,是因为BookDao作为接口,不能创造对象 ,这里使用代理模式创造对象
但是代理对象在IOC里面管理,IOC容器在web服务器启动时才会创建。
所以IDEA在检测依赖关系时,没有找到合适的类注入,提示错误。
但是程序运行是无影响的

解决报错或者无视此报错皆可

- @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();
- }
- }
业务层接口测试,整合JUnit
新建一个测试类,测试service

注入service,编写测试方法

运行测试方法

2.表现层测试(PostMan测试)