基于SpringBoot的SSM整合案例 -- SpringBoot快速入门保姆级教程(四)

news2024/9/23 3:14:35

文章目录

  • 前言
    • 1.设计创建数据库表tbl_book
    • 2.创建新的SpringBoot模块,勾选相关依赖
    • 3. 添加SpringBoot创建项目时没有提供的相关坐标
    • 4.根据数据库表创建实体类Book
    • 5.编写dao层操作BookDao
    • 6.编写Service服务层接口BookService
    • 7.编写服务层实现类BookServiceImpl
    • 8.编写Book模块Controller层BookController
    • 9.状态码类相关设计
    • .对比基于Spring的ssm整合案例
  • 总结


前言

为了巩固所学的知识,作者尝试着开始发布一些学习笔记类的博客,方便日后回顾。当然,如果能帮到一些萌新进行新技术的学习那也是极好的。作者菜菜一枚,文章中如果有记录错误,欢迎读者朋友们批评指正。
(博客的参考源码可以在我主页的资源里找到,如果在学习的过程中有什么疑问欢迎大家在评论区向我提出)

建议先去浏览本人ssm专栏发布的ssm快速入门案例(一)(二)后再阅读本文章

在这里插入图片描述

四、基于SpringBoot的SSM整合案例

1.设计创建数据库表tbl_book

-- ----------------------------
-- Table structure for tbl_book
-- ----------------------------
DROP TABLE IF EXISTS `tbl_book`;
CREATE TABLE `tbl_book`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `type` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 13 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

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

在这里插入图片描述

2.创建新的SpringBoot模块,勾选相关依赖

在这里插入图片描述

在这里插入图片描述

3. 添加SpringBoot创建项目时没有提供的相关坐标

<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
			<version>1.1.16</version>
		</dependency>

4.根据数据库表创建实体类Book

public class Book {
    //此处省略gettr、setter和toString方法
    private Integer id;
    private String type;
    private String name;
    private String description;

5.编写dao层操作BookDao

@Mapper
public interface BookDao {

    @Insert("insert into tbl_book (type,name,description) values(#{type},#{name},#{description})")
    public int save(Book book);

    @Update("update tbl_book set type = #{type}, name = #{name}, description = #{description} where id = #{id}")
    public int update(Book book);

    @Delete("delete from tbl_book where id = #{id}")
    public int 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();
}

6.编写Service服务层接口BookService

@Transactional
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();
}

7.编写服务层实现类BookServiceImpl

@Service
public class BookServiceImpl implements BookService {
    @Autowired
    private BookDao bookDao;

    public boolean save(Book book) {
        return bookDao.save(book) > 0;
    }

    public boolean update(Book book) {
        return bookDao.update(book) > 0;
    }

    public boolean delete(Integer id) {
        return bookDao.delete(id) > 0;
    }

    public Book getById(Integer id) {
        if(id == 1){
            throw new BusinessException(Code.BUSINESS_ERR,"请不要使用你的技术挑战我的耐性!");
        }
//        //将可能出现的异常进行包装,转换成自定义异常
//        try{
//            int i = 1/0;
//        }catch (Exception e){
//            throw new SystemException(Code.SYSTEM_TIMEOUT_ERR,"服务器访问超时,请重试!",e);
//        }
        return bookDao.getById(id);
    }

    public List<Book> getAll() {
        return bookDao.getAll();
    }
}

8.编写Book模块Controller层BookController

@RestController
@RequestMapping("/books")
public class BookController {

    @Autowired
    private BookService bookService;

    @PostMapping
    public Result save(@RequestBody Book book) {
        boolean flag = bookService.save(book);
        return new Result(flag ? Code.SAVE_OK:Code.SAVE_ERR,flag);
    }

    @PutMapping
    public Result update(@RequestBody Book book) {
        boolean flag = bookService.update(book);
        return new Result(flag ? Code.UPDATE_OK:Code.UPDATE_ERR,flag);
    }

    @DeleteMapping("/{id}")
    public Result delete(@PathVariable Integer id) {
        boolean flag = bookService.delete(id);
        return new Result(flag ? Code.DELETE_OK:Code.DELETE_ERR,flag);
    }

    @GetMapping("/{id}")
    public Result getById(@PathVariable Integer id) {
        Book book = bookService.getById(id);
        Integer code = book != null ? Code.GET_OK : Code.GET_ERR;
        String msg = book != null ? "" : "数据查询失败,请重试!";
        return new Result(code,book,msg);
    }

    @GetMapping
    public Result getAll() {
        List<Book> bookList = bookService.getAll();
        Integer code = bookList != null ? Code.GET_OK : Code.GET_ERR;
        String msg = bookList != null ? "" : "数据查询失败,请重试!";
        return new Result(code,bookList,msg);
    }
}

9.状态码类相关设计

  • Code类
package org.example.controller;

public class Code {
    public static final Integer SAVE_OK = 20011;
    public static final Integer DELETE_OK = 20021;
    public static final Integer UPDATE_OK = 20031;
    public static final Integer GET_OK = 20041;

    public static final Integer SAVE_ERR = 20010;
    public static final Integer DELETE_ERR = 20020;
    public static final Integer UPDATE_ERR = 20030;
    public static final Integer GET_ERR = 20040;

    public static final Integer SYSTEM_ERR = 50001;
    public static final Integer SYSTEM_TIMEOUT_ERR = 50002;
    public static final Integer SYSTEM_UNKNOW_ERR = 59999;

    public static final Integer BUSINESS_ERR = 60002;



}

  • ProjectExceptionAdvice类
@RestControllerAdvice
public class ProjectExceptionAdvice {
    @ExceptionHandler(SystemException.class)
    public Result doSystemException(SystemException ex){
        //记录日志
        //发送消息给运维
        //发送邮件给开发人员,ex对象发送给开发人员
        return new Result(ex.getCode(),null,ex.getMessage());
    }

    @ExceptionHandler(BusinessException.class)
    public Result doBusinessException(BusinessException ex){
        return new Result(ex.getCode(),null,ex.getMessage());
    }

    @ExceptionHandler(Exception.class)
    public Result doOtherException(Exception ex){
        //记录日志
        //发送消息给运维
        //发送邮件给开发人员,ex对象发送给开发人员
        return new Result(Code.SYSTEM_UNKNOW_ERR,null,"系统繁忙,请稍后再试!");
    }
}

  • Result类
public class Result {
    //此处省略getter、setter方法
    private Object data;
    private Integer code;
    private String msg;

    public Result() {
    }

    public Result(Integer code,Object data) {
        this.data = data;
        this.code = code;
    }

    public Result(Integer code, Object data, String msg) {
        this.data = data;
        this.code = code;
        this.msg = msg;
    }

    public Object getData() {
        return data;
    }
}

  • BusinessException类
public class BusinessException extends RuntimeException{
    private Integer code;

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public BusinessException(Integer code, String message) {
        super(message);
        this.code = code;
    }

    public BusinessException(Integer code, String message, Throwable cause) {
        super(message, cause);
        this.code = code;
    }

}

  • SystemException类
public class SystemException extends RuntimeException{
    private Integer code;

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public SystemException(Integer code, String message) {
        super(message);
        this.code = code;
    }

    public SystemException(Integer code, String message, Throwable cause) {
        super(message, cause);
        this.code = code;
    }

}

.对比基于Spring的ssm整合案例

(详情可以去关注作者的ssm专栏)

在这里插入图片描述

总结

欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下。
(博客的参考源码可以在我主页的资源里找到,如果在学习的过程中有什么疑问欢迎大家在评论区向我提出)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/658992.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI催生电影新纪元?大咖们纷纷发声|瞩目上影节

AI催生电影新纪元&#xff1f;大咖们纷纷发声&#xff5c;瞩目上影节 听说“谁懂AI&#xff0c;谁股票就飙高”。博纳影业集团创始人兼总经理于冬一句话引得会场爆笑连连。 AI成为今年上海国际电影节热议话题之一。在金爵电影论坛开幕论坛上&#xff0c;于冬、中国电影股份有限…

keyclock==纯java实现第三方登录

官网Guides - Keycloak 下载 Downloads 18.0.0 - Keycloak GitHub: https://github.com/keycloak/keycloak/tags?after17.0.1 1-安装启动 参照readme文件 启动 bin\kc.bat start-dev 初始化超管账号密码admin admin 参考官方教程 OpenJDK - Keycloak 打开超管界面h…

Mac 上的搜狗输入法卡顿问题

我的 Mac 使用的中文输入法是搜狗拼音输入法&#xff0c;一直有一个问题&#xff0c;就是 Mac 开机太久&#xff0c;输入法会出现卡顿问题&#xff0c;按下按键 0.5s 后需才会显示对应的汉字&#xff0c;用着非常难受&#xff0c;以前这种情况我都是通过重启 Mac 来解决&#x…

Python算法练习6.18

leetcode 1431 拥有最多糖果的孩子 给你一个数组 candies 和一个整数 extraCandies &#xff0c;其中 candies[i] 代表第 i 个孩子拥有的糖果数目。 对每一个孩子&#xff0c;检查是否存在一种方案&#xff0c;将额外的 extraCandies 个糖果分配给孩子们之后&#xff0c;此孩…

全国大数据与计算智能挑战赛:面向低资源的命名实体识别基线方案,排名13/64,组织单位:国防科技大学系统工程学院(大数据与决策实验室)

NLP专栏简介:数据增强、智能标注、意图识别算法|多分类算法、文本信息抽取、多模态信息抽取、可解释性分析、性能调优、模型压缩算法等 专栏详细介绍:NLP专栏简介:数据增强、智能标注、意图识别算法|多分类算法、文本信息抽取、多模态信息抽取、可解释性分析、性能调优、模型…

管理类联考——英语二——技巧篇——写作——B节——图表作文——必备词汇句型

图表作文必备词汇句型 1&#xff0e;该表格展示了…… The table reveals The table demonstrates The table shows The table depicts The tableillustrates The table presents The table describes 2&#xff0e;占…… Comprise Take up Account for Constitute C…

【MySQL】不就是索引

前言 嗨&#xff01;小伙伴们周末快乐呀&#xff01;想必你们周末都在家里边呆着吧&#xff0c;外面实在是太热了&#xff01;在家里吹着空调做着自己喜欢做的事情吧&#xff01;本期我们主要学习的是MySQL中的约束条件。 目录 前言 索引概述 外键约束 1.概念 2.语法 1.添加…

机器学习的学习准则(期望风险最小化、经验风险最小化、结构风险最小化)

训练集是有N个独立同分布的样本组成&#xff0c;即每个样本(x,y)是独立的从相同的分布中抽取的。这个真实的分布未知 输入空间X和输出空间Y构成样本空间&#xff0c;对于样本空间中的样本(x, y)∈X x Y&#xff0c;假定x和y之间可通过一个未知的真实隐射yg(x)来描述&#xff0…

九、提交代码自动触发Jenkins构建版本

提交代码自动触发Jenkins构建版本 1. 下载Generic Webhook Trigger 2. 配置Generic Webhook Trigger http://JENKINS_URL/generic-webhook-trigger/invoke?tokenruoyi-ui-8978456465 http://192.168.1.183:8080 为jenkisn地址&#xff0c;/generic-webhook-trigger/invoke?…

学习潘海东博士的《潮汐调和分析原理和应用》

潘海东博士在B站&#xff08;用户名&#xff1a;ocean_tide&#xff09;分享了他的电子书《潮汐调和分析原理和应用》&#xff0c;以及他开发的潮汐调和分析工具包S_Tide&#xff0c;非常厉害。 在学习《潮汐调和分析原理和应用》之前&#xff0c;我们需要安装matlab软件。 1 、…

阿里云免费服务器申请流程、领取入口、主机配置及限制条件

阿里云服务器免费试用申请链接入口 aliyunfuwuqi.com/go/free 阿里云个人用户和企业用户均可申请免费试用&#xff0c;最高可以免费使用3个小时&#xff0c;阿里云服务器网分享阿里云服务器免费试用申请入口链接及云服务器配置&#xff1a; 目录 阿里云服务器免费试用 企业…

高通 Android 12 调试产测NFC功能

1、在dev/nxpnfc节点添加对应的文件权限 on property:sys.boot_completed1# nfc add by zmchmod 777 /dev/nxpnfc 2、在vendor/nxp/nfcdevice-nfc.mk文件中 修改NFC添加到编译路径如下所示,跟平时内置apk方式有点类似 PRODUCT_PACKAGES NFCTestApp-include \vendor\nxp\nfc\…

powerdesigner简单使用

批量修改表名schema vb里面好像没有!的功能&#xff1f;我之前疯狂报错&#xff0c;直到把"!“改成了”<>"; table中的字段名&#xff0c;似乎用下面的界面就可以调用&#xff1b; 推荐找一些vbs的语法记录看一下 批量加入前缀后&#xff0c;所有的表名竟然…

微服务开发系列 第十二篇:MongoDB

总概 A、技术栈 开发语言:Java 1.8数据库:MySQL、Redis、MongoDB、Elasticsearch微服务框架:Spring Cloud Alibaba微服务网关:Spring Cloud Gateway服务注册和配置中心:Nacos分布式事务:Seata链路追踪框架:Sleuth服务降级与熔断:SentinelORM框架:MyBatis-Plus分布式任…

英语时态的变化

思考&#xff1a;汉语和英语是靠什么来说明时态的 汉语和英语关于时态的区别 汉语英语1.人们采取行动。&#xff08;一般状态&#xff09;People take actions.&#xff08;动词&#xff0c;注意动词的变化&#xff09;2.人们正在采取行动。&#xff08;正在进行&#xff09;P…

window中断/连网操作的命令提示符

window中断/连网操作的命令提示符 通过 cmd 实现网络查看与断/联网 以管理员身份打开命令提示符查看计算机网络接口名称 netsh interface show interface断网操作 # netsh interface set interface "你想断开的接口名称" admindisable netsh interface set inter…

【MySQL数据库】事务和存储引擎

【MySQL数据库】事务和存储引擎 一&#xff0c;事务1事务的概念 二 、事务的ACID特点2.1原子性2.2一致性&#xff08;Consistency&#xff09;2.3隔离性2.4持久性 三、脏读、不可重复读、幻读、丢失更新3.1脏读3.2不可重复读3.3幻读3.4丢失更新 四、事务的隔离级别事务隔离级别…

动态规划dp —— 28.摆动序列

连续相同的数不算是摆动序列 单独一个或不相等的两个数算是摆动序列 1.状态表示 是什么&#xff1f;dp表中里的值所表示的含义就是状态表示 dp[i]表示&#xff1a;以i位置为结尾的所有子序列中&#xff0c;最长的摆动序列的长度 但是i位置的值可能是下降后的&#xff0c;…

微信小程序自定义模块

自定义wxs并引入 新建一个tools.wxs 创建一些function,并使用moule.exports {}导出 使用 <wxs>标签 并填写正确src 书写module名称 之后在其他标签内&#xff0c;使用 {{自定的module名称.自定义的一个function并传入对应参数}}就可以实现参数在自定义function中的导入…

深入剖析 Spring Boot 的 SPI 机制

Java SPI实现 示例说明 创建动态接口 实现类1 实现类2 相关测试 运行结果&#xff1a; 源码分析 Spring SPI Spring 示例 定义接口 相关实现 相关测试类 输出结果 源码分析 SPI(Service Provider Interface)是JDK内置的一种服务提供发现机制&#xff0c;可以用来启…