• SSM整合流程


    三层结构的理解

    • 表示层:负责直接跟用户进行交互,一般也就是指系统的界面,用于数据录入,数据显示等。意味着只做与外观显示相关的工作,不属于他的工作不用做。
    • 业务逻辑层:用于做一些有效的验证工作,以更好地保证程序运行的健壮性。如完成数据添加、修改和查询等;不允许指定的文本框中输入空字符串,数据格式是否正确及数据类型验证;用户的权限合法性判断等。通过以上诸多判断以决定是否将操作继续向后传递,尽量保证程序的正常运行。
    • 数据访问层:顾名思义,就是专门跟数据库进行交互,执行数据的添加、删除、修改和显示等。需要强调的是,所有的数据对象只在这一层被引用,除数据层之外的任何地方都不应该出现这样的引用。

    在SSM的组合:

     ·SpringMVC(表示层)+Spring(业务层)+Mybatis(持久层)

    业务层也是承接层,用来处理业务逻辑,通常使用数据库中的事务来进行,按照web层的要求来对数据层进行增删改查。

    service是业务层,是使用一个或多个模型执行操作的方法:

     ·封装通用的业务逻辑、操作。如一些数据的校验,可以通用处理;

     ·与数据层交互;

     ·其他请求:如远程服务获取数据,如第三方api等。

    持久层数据大概可以分为三个部分:DAO文件系统其他应用数据

    DAO由一下几个部分组成:

     ·DatabaseConnection:专门负责数据库的打开与关闭操作的类;

     ·VO:主要由属性、setter、getter、方法组成,VO类中的属性与表中的字段相对应,每一个VO类的对象都表示表中的每一条记录;

     ·DAO:主要定义操作的接口,定义一系列数据库的原子性操作,如增加、修改、删除和查询;

     ·impl:DAO接口的真实实现类,完成具体的数据库操作,但是不负责数据的打开和关闭;

     ·Proxy:代理实现类,主要完成数据库的打开和关闭操作,并且调用真实实现对象的操作;

     ·Factory:工厂类,通过工厂类取得一个DAO的实例化对象

    1.创建工程

    创建一个maven的web工程

    项目的结构如下

    pom.xml导入依赖

    2.SSM整合

    总的SSM整合所需要的结构

    config目录存放的是相关的配置类

    controller编写的是Controller类

    dao存放的是Dao接口,因为使用的是Mapper接口代理方式,所以没有实现类包

    service存的是Service接口,impl存放的是Service实现类

    resources:存入的是配置文件,如Jdbc.properties webapp:目录可以存放静态资源

    test/java:存放的是测试类

    1.Spring

    1.SpringConfig配置类的书写

    1. @Configuration //设定当前类为配置类
    2. @ComponentScan({"com.itheima.service"}) //扫描bean对象路径
    3. @PropertySource("classpath:jdbc.properties") //属性文件路径
    4. @Import({JdbcConfig.class,MyBatisConfig.class}) //导入配置文件
    5. @EnableTransactionManagement //
    6. public class SpringConfig {
    7. }

    2.MyBatis

    1.jdbc.properties文件的书写

    1. jdbc.driver=com.mysql.jdbc.Driver
    2. jdbc.url=jdbc:mysql://localhost:3306/ssm_db
    3. jdbc.username=root
    4. jdbc.password=xhsxcsjcnh

    2.JdbcConfig配置类的书写

    1. public class JdbcConfig {
    2. @Value("${jdbc.driver}")
    3. private String driver;
    4. @Value("${jdbc.url}")
    5. private String url;
    6. @Value("${jdbc.username}")
    7. private String username;
    8. @Value("${jdbc.password}")
    9. private String password;
    10. @Bean //将方法的返回值作为定义为bean对象
    11. public DataSource dataSource(){
    12. DruidDataSource dataSource = new DruidDataSource();
    13. dataSource.setDriverClassName(driver);
    14. dataSource.setUrl(url);
    15. dataSource.setUsername(username);
    16. dataSource.setPassword(password);
    17. return dataSource;
    18. }
    19. @Bean
    20. public PlatformTransactionManager transactionManager(DataSource
    21. dataSource){
    22. DataSourceTransactionManager ds = new DataSourceTransactionManager();
    23. ds.setDataSource(dataSource);
    24. return ds;
    25. }
    26. }

    3.MybatisConfig配置类的书写

    1. public class MyBatisConfig {
    2. @Bean
    3. public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource){
    4. SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
    5. factoryBean.setDataSource(dataSource);
    6. factoryBean.setTypeAliasesPackage("com.itheima.domain");
    7. return factoryBean;
    8. }
    9. @Bean
    10. public MapperScannerConfigurer mapperScannerConfigurer(){
    11. MapperScannerConfigurer msc = new MapperScannerConfigurer();
    12. msc.setBasePackage("com.itheima.dao");
    13. return msc;
    14. }
    15. }

    3.SpringMVC

    1.SpringMvcConfig配置类的书写

    1. @Configuration
    2. @ComponentScan("com.itheima.controller")
    3. @EnableWebMvc
    4. public class SpringMvcConfig {
    5. }

    2.ServletConfig(web项目入口)配置类

    1. public class ServletConfig extends
    2. AbstractAnnotationConfigDispatcherServletInitializer {
    3. //加载Spring配置类
    4. protected Class[] getRootConfigClasses() {
    5. return new Class[]{SpringConfig.class};
    6. }
    7. //加载SpringMVC配置类
    8. protected Class[] getServletConfigClasses() {
    9. return new Class[]{SpringMvcConfig.class};
    10. }
    11. //设置SpringMVC请求地址拦截规则
    12. protected String[] getServletMappings() {
    13. return new String[]{"/"};
    14. }
    15. //设置post请求中文乱码过滤器
    16. @Override
    17. protected Filter[] getServletFilters() {
    18. CharacterEncodingFilter filter = new CharacterEncodingFilter();
    19. filter.setEncoding("utf-8");
    20. return new Filter[]{filter};
    21. }
    22. }

    至此,SSM环境搭建完毕,接下来是功能模块的实现

    三.功能模块

    1.数据库与实现类

    建表

    domain路径下编写Book模型类 

    1. public class Book {
    2. private Integer id;
    3. private String type;
    4. private String name;
    5. //get,set,toString方法省略
    6. }

    2.dao(接口加自动代理)

    BookDao接口

    1. public interface BookDao {
    2. // @Insert("insert into tbl_book values(null,#{type},#{name},#{description})")
    3. @Insert("insert into tbl_book (type,name,description) values(#{type},# {name},#{description})")
    4. public void save(Book book);
    5. @Update("update tbl_book set type = #{type}, name = #{name}, description = #{description} where id = #{id}")
    6. public void update(Book book);
    7. @Delete("delete from tbl_book where id = #{id}")
    8. public void delete(Integer id);
    9. @Select("select * from tbl_book where id = #{id}")
    10. public Book getById(Integer id);
    11. @Select("select * from tbl_book")
    12. public List getAll();
    13. }

    3.service(接口加实现类)

    BookService接口

    1. @Transactional
    2. public interface BookService {
    3. /**
    4. * 保存
    5. * @param book
    6. */
    7. public boolean save(Book book);
    8. /**
    9. * 修改
    10. * @param book
    11. * @return
    12. */
    13. public boolean update(Book book);
    14. /**
    15. * 按id删除
    16. * @param id
    17. * @return
    18. */
    19. public boolean delete(Integer id);
    20. /**
    21. * 按id查询
    22. * @param id
    23. * @return
    24. */
    25. public Book getById(Integer id);
    26. /**
    27. * 查询全部
    28. * @return
    29. */
    30. public List getAll();
    31. }

     BookService实现类

    1. @Service
    2. public class BookServiceImpl implements BookService {
    3. @Autowired
    4. private BookDao bookDao;
    5. public boolean save(Book book) {
    6. bookDao.save(book);
    7. return true;
    8. }
    9. public boolean update(Book book) {
    10. bookDao.update(book);
    11. return true;
    12. }
    13. public boolean delete(Integer id) {
    14. bookDao.delete(id);
    15. return true;
    16. }
    17. public Book getById(Integer id) {
    18. return bookDao.getById(id);
    19. }
    20. public List<Book> getAll() {
    21. return bookDao.getAll();
    22. }
    23. }

    这里出现error,是因为BookDao作为接口,不能创造对象 ,这里使用代理模式创造对象

    但是代理对象在IOC里面管理,IOC容器在web服务器启动时才会创建。

    所以IDEA在检测依赖关系时,没有找到合适的类注入,提示错误。

    但是程序运行是无影响的

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

     4.controller

    1. @RestController
    2. @RequestMapping("/books")
    3. public class BookController {
    4. @Autowired
    5. private BookService bookService;
    6. @PostMapping
    7. public boolean save(@RequestBody Book book) {
    8. return bookService.save(book);
    9. }
    10. @PutMapping
    11. public boolean update(@RequestBody Book book) {
    12. return bookService.update(book);
    13. }
    14. @DeleteMapping("/{id}")
    15. public boolean delete(@PathVariable Integer id) {
    16. return bookService.delete(id);
    17. }
    18. @GetMapping("/{id}")
    19. public Book getById(@PathVariable Integer id) {
    20. return bookService.getById(id);
    21. }
    22. @GetMapping
    23. public List<Book> getAll() {
    24. return bookService.getAll();
    25. }
    26. }

    四.测试

    1.单元测试

    业务层接口测试,整合JUnit

    新建一个测试类,测试service

    注入service,编写测试方法

    运行测试方法

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

  • 相关阅读:
    leetcode 第388场周赛第二题
    C 语言进阶
    SEO优化之扁平化目录结构PbootCMS
    亚马逊国际按关键字搜索商品 API 返回值说明
    钓鱼攻击防不胜防,该如何预防网络钓鱼攻击?
    【精品资源】Java毕业设计攻略:从选题到答辩,一站式指南
    【PAT(甲级)】1070 Mooncake
    【自然语言处理(NLP)】基于BiLSTM+CRF的事件抽取
    webpack5基础--05_处理图片资源
    LeetCode刷题复盘笔记—一文搞懂0 - 1背包之474. 一和零问题(动态规划系列第十篇)
  • 原文地址:https://blog.csdn.net/cvpatient/article/details/126054620