写点什么

SSM 整合 (功能模块的开发)

作者:fake smile by
  • 2022 年 9 月 20 日
    辽宁
  • 本文字数:3708 字

    阅读完需:约 12 分钟



步骤 1:创建数据库及表

create database ssm_db character set utf8;use ssm_db;create table tbl_book(  id int primary key auto_increment,  type varchar(20),  name varchar(50),  description varchar(255))
insert into `tbl_book`(`id`,`type`,`name`,`description`) values (1,'计算机理论','Spring实战 第五版','Spring入门经典教程,深入理解Spring原理技术内幕'),(2,'计算机理论','Spring 5核心原理与30个类手写实践','十年沉淀之作,手写Spring精华思想'),(3,'计算机理论','Spring 5设计模式','深入Spring源码刨析Spring源码中蕴含的10大设计模式'),(4,'计算机理论','Spring MVC+Mybatis开发从入门到项目实战','全方位解析面向Web应用的轻量级框架,带你成为Spring MVC开发高手'),(5,'计算机理论','轻量级Java Web企业应用实战','源码级刨析Spring框架,适合已掌握Java基础的读者'),(6,'计算机理论','Java核心技术 卷Ⅰ 基础知识(原书第11版)','Core Java第11版,Jolt大奖获奖作品,针对Java SE9、10、11全面更新'),(7,'计算机理论','深入理解Java虚拟机','5个纬度全面刨析JVM,大厂面试知识点全覆盖'),(8,'计算机理论','Java编程思想(第4版)','Java学习必读经典,殿堂级著作!赢得了全球程序员的广泛赞誉'),(9,'计算机理论','零基础学Java(全彩版)','零基础自学编程的入门图书,由浅入深,详解Java语言的编程思想和核心技术'),(10,'市场营销','直播就这么做:主播高效沟通实战指南','李子柒、李佳奇、薇娅成长为网红的秘密都在书中'),(11,'市场营销','直播销讲实战一本通','和秋叶一起学系列网络营销书籍'),(12,'市场营销','直播带货:淘宝、天猫直播从新手到高手','一本教你如何玩转直播的书,10堂课轻松实现带货月入3W+');
复制代码


最后表长这样:


步骤 2:编写模型类

在这一步我们编写 POJO 的封装对象。我们把这个类放到 domain 文件夹中:


public class Book {    private Integer id;    private String type;    private String name;    private String description;
public Integer getId() { return id; }
public void setId(Integer id) { this.id = id; }
public String getType() { return type; }
public void setType(String type) { this.type = type; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getDescription() { return description; }
public void setDescription(String description) { this.description = description; }
@Override public String toString() { return "Book{" + "id=" + id + ", type='" + type + '\'' + ", name='" + name + '\'' + ", description='" + description + '\'' + '}'; }}
复制代码

步骤 3:编写 Dao 接口

这一步我们实现数据层的接口。然后 MyBatis 的自动代理会帮我们创建实现类!


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<Book> getAll();}
复制代码


@Insert("insert into tbl_book values(null,#{type},#{name},#{description})")
复制代码


括号中的 type,name 等和 Book 中的属性对应。


 @Insert("insert into tbl_book (type,name,description) values(#{type},#{name},#{description})")
复制代码


这种写法前面圆括号中的 type,name 等和表里面的字段名对应。后面的括号中的 type,name 等和 Book 中的属性对应。


后面的都可以以此类推。

步骤 4:编写 Service 接口

这一步我们编写业务层的接口。文件写在 Service 文件夹下。


快速写法:


  • 直接把 Dao 接口中定义的方法复制粘贴过来

  • 在这个基础上进行修改

  • 修改返回值的类型(对于增删改操作)

  • 最好加上文档注释,方便其他人调用的时候可查阅


快速写法虽然快速,但是不推荐!因为业务层的接口最好是让别人见名知义,能够一眼看出是执行什么业务。


BookService:


public interface BookService {    /**     * 保存     * @param book     * @return     */    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<Book> getAll();}
复制代码

步骤 5:编写 Service 实现类

此实现类放在 Service/Impl 文件夹中


这里就需要用到数据层接口 Dao 了,同时我们要把这个实现类定义为 bean。


BookServiceImpl:


@Servicepublic 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(); }}
复制代码


有人看到很多方法我们都是直接 return true,那么什么时候 return false 呢?当我们在抛异常的时候就会 return false,我们会在后期处理这个问题,这个地方不详细赘述。


说明:


  • bookDao 在 Service 中注入的会提示一个红线提示,为什么呢?

  • BookDao 是一个接口,没有实现类,接口是不能创建对象的,所以最终注入的应该是代理对象

  • 代理对象是由 Spring 的 IOC 容器来创建管理的

  • IOC 容器又是在 Web 服务器启动的时候才会创建

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

  • 但是程序运行的时候,代理对象就会被创建,框架会使用 DI 进行注入,所以程序运行无影响。

  • 如何解决上述问题?

  • 可以不用理会,因为运行是正常的

  • 设置错误提示级别


步骤 6:编写 Contorller 类

这里的 Controller 类我们放在 Controller 文件夹下。


这个控制器类我们同样要把它定义为 bean,同时我们要使用 REST 风格,并且将当前控制器返回值作为响应体。所以本来我们要两个注解 @Controller 与 @ResponseBody,优化之后我们直接使用 @RestController


然后我们要配置这个模块的公共映射使用 @RequestMapping(在类上)


Controller 属于表现层,在这里我们要调用业务层的接口,这里我们使用自动装配引入,也就是注解 @Autowired


@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(); }}
复制代码


我们删除和查询需要的 id 参数使用的是路径传递,所以使用注解 @PathVariable,记得括号的名字要与形参的名字相对应


因为 Book 类的参数是从我们提交过来的 json 数据中获取,所以要加上注解 @RequestBody

总结

功能模块[与具体的业务模块有关]


  • 创建数据库表

  • 根据数据库表创建对应的模型类

  • 通过 Dao 层完成数据库表的增删改查(接口+自动代理)

  • 编写 Service 层[Service 接口+实现类]

  • @Service

  • @Transactional

  • 整合 Junit 对业务层进行单元测试

  • @RunWith

  • @ContextConfiguration

  • @Test

  • 编写 Controller 层

  • 接收请求 @RequestMapping @GetMapping @PostMapping @PutMapping @DeleteMapping

  • 接收数据 简单、POJO、嵌套 POJO、集合、数组、JSON 数据类型

  • @RequestParam

  • @PathVariable

  • @RequestBody

  • 转发业务层

  • @Autowired

  • 响应结果

  • @ResponseBody

发布于: 刚刚阅读数: 6
用户头像

fake smile by

关注

还未添加个人签名 2022.07.31 加入

还未添加个人简介

评论

发布
暂无评论
SSM整合(功能模块的开发)_Java_fake smile by_InfoQ写作社区