SpringBoot项目整合

news2024/11/17 14:27:11

一、创建项目

IDEA中采用spring initialzer...创建,jdk选择8,maven,jar。。。springboot版本2.5.0(稳定)

项目依赖:

二、项目结构:

原始pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.5.0</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.itheima</groupId>
	<artifactId>springboot_09_ssm</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>springboot_09_ssm</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>1.8</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>2.2.0</version>
		</dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<!--TODO 添加必要的依赖坐标-->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
			<version>1.1.16</version>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

 原始application.yml



spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/www #?servierTimezone=UTC
    username: root
    password: root
server:
  port: 80

domain层

用于存储实体类

public class Book {
    private Integer id;
    private String type;
    private String name;
    private String description;
    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", type='" + type + '\'' +
                ", name='" + name + '\'' +
                ", description='" + 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;
    }
}

dao层

用于操作数据库 

@Mapper  //注意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();
}

service层

用于业务实现

接口:

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

类:

@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) {
        
        return bookDao.getById(id);
    }

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

controller层

用于控制业务流程

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

tip: Code 类和 Result 和ProjectExceptionAdvice在Controller层中

code类用于规定result返回的编码类别

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;

}

result用于封装返回的结果,让后台数据进行统一化处理

public class Result {
    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;
    }

    public void setData(Object data) {
        this.data = data;
    }

    public Integer getCode() {
        return code;
    }

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

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}

ProjectExceptionAdvice类用于规定 系统异常都抛到业务控制层,也就是controller层

@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,"系统繁忙,请稍后再试!");
    }
}

exception层

封装异常类

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;
    }

}

测试:

@SpringBootTest
public class BookServiceTest {

    @Autowired
    private BookService bookService;  //测试哪个  装配哪个

//    @Test
//    public void testGetById(){
//        Book book = bookService.getById(2);
//        System.out.println(book);
//    }

    @Test
    public void testGetAll(){
        List<Book> all = bookService.getAll();
        System.out.println(all);
    }

}

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

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

相关文章

Java基础篇 数组

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Java从入门到精通 ✨特色专栏&#xf…

[VC++]圆形进度条

[VC]圆形进度条 源码开发环境&#xff1a;VC6.0 WIN10 64位下编译通过利用绘制饼图的原理&#xff0c;来制作的圆形进度条&#xff0c;可以显示百分比。软件运行截图如下&#xff1a; 附件源码下载(点击下载&#xff09;

低投入,高产出的数字人直播间软件强势“出圈”,铭顺科技带你一探究竟

数字人直播的魅力在于它的独特性&#xff0c;通过先进的数字技术&#xff0c;创作者可以打造自己独一无二的数字形象&#xff0c;让观众与其互动。 与传统的直播相比&#xff0c;数字人直播模式的投入成本相对较低&#xff0c;却能获得高额产出。传统直播需要大量的设备、场地…

ROS2创建工作区

ROS2创建工作区 ros2官方使用colcon工具来进行代码编译&#xff0c;首先需要安装colcon&#xff1a; sudo apt install python3-colcon-common-extensions创建工作区&#xff1a; mkdir -p ~/ros2_ws/src cd ~/ros2_ws进入src文件夹下拉取一部分例子代码&#xff1a; cd ~/…

RK3568笔记二:部署手写数字识别模型

若该文为原创文章&#xff0c;转载请注明原文出处。 环境搭建参考RK3568笔记一&#xff1a;RKNN开发环境搭建-CSDN博客 一、介绍 部署手写数字识别模型&#xff0c;使用手写数字识别&#xff08;mnist&#xff09;数据集训练了一个 LENET 的五层经典网络模型。Lenet是我们的…

Step2:Java内存区域与内存溢出异常

文章目录 1.1 概述1. 2 运行时数据区域1. 3 HotSpot虚拟机对象探秘1. 4 作业:OutOfMemoryError异常体验1.1 概述 对于Java程序员来说,再虚拟机自动内存管理机制的帮助下,不再需要为每一个new操作去写配对的delete/free代码,不容易出现内存泄露和内存溢出的问题,看起来由虚…

Jenkins 设置定时任务

1、点击项目后点击Configure 2、点击Build Triggers勾选Build periodically 3、设置规则 # 样例展示&#xff1a; # 每天的22:00 执行 0 22 * * * # 每个月的1号22:00 执行 0 22 1 * *# 每周一到周五的晚上22&#xff1a;00&#xff0c; 1-5 表示周一到周五 0 22 * * 1-5# 每…

短视频平台的那些事

短视频平台的那些事 文章目录 短视频平台的那些事1. 前言2. 概览介绍3. 业务框架4. 关键技术能力4.1 视频处理4.1.1 FFMPEG技术 4.2 视频安全&#xff0c;合规4.2.1 视频安全审核4.2.2 视频MD5校验4.2.3 视频AI指纹 4.3 视频内容理解4.3.1 视频分类4.3.2 视频标签4.3.3 视频质量…

体育场馆能源消耗监测管理平台,为场馆提供能源服务

随着能源问题的不断重视&#xff0c;体育场馆能源问题也被人们广泛的关注。为了让体育场馆的能源高效利用&#xff0c;体育场馆能源消耗监测管理平台应用而生。 该平台通过采集、监测场内数据&#xff0c;并对数据进行实时分析与反馈&#xff0c;从而帮助管理者了解到场内能源…

用 Python 进行数据分析,不懂 Python,求合适的 Python 书籍或资料推荐?

想要学好Python数据分析&#xff0c;打好基础最重要&#xff0c;学习Python语言基础语法知识&#xff0c;推荐菜鸟教程这个网站。 Python 基础教程 | 菜鸟教程 ​www.runoob.com/python/python-tutorial.html 如果觉得文字教程生硬难懂的话&#xff0c;可以看视频教学&#xf…

网络安全工程师需要学习什么?争做网络安全守护使者

文章目录 前言 一、计算机基础知识二、网络安全技术三、信息安全法律法规四、风险评估与管理五、安全运维六、渗透测试与防护七、安全知识演练八、心理承受力与逆向思维九、团队合作与沟通能力十、持续学习和自我提升十一、道德与伦理十二、综合素质与领导力 如何入门学习网络…

LeetCode 143.重排链表

题目链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目解析 分析题目后我们可以直接进行模拟实现。 具体用到的就是我们之前的知识的结合&#xff0c;首先使用快慢指针找到链表的中间结点。然后将后半段链表给翻转一下&#xff0c;然后再让这…

Kotlin异常处理runCatching,getOrDefault,getOrNull run(2)

Kotlin异常处理runCatching&#xff0c;getOrDefault&#xff0c;getOrNull run&#xff08;2&#xff09; fun main(args: Array<String>) {runCatching {1 / 0 //发生异常}.getOrNull().run {println(this)}println("-")runCatching {1 / 1 //正常}.getOrNul…

2023年失业了,想学一门技术可以学什么?

有一个朋友&#xff0c;大厂毕业了&#xff0c;原本月薪估计有5w吧&#xff0c;年终奖也不错&#xff0c;所以早早的就买了房生了娃&#xff0c;一直是人生赢家的姿态。 但是今年突然就被毕业了&#xff0c;比起房货还有个几百万没还来说&#xff0c;他最想不通的是自己的价值…

“悦己经济”升温,鲜花产业如何利用软文获客

在消费结构升级的大环境下&#xff0c;人们越来越注重精神层面的追求&#xff0c;“悦己消费”正在成为主流&#xff0c;鲜花逐渐成为生活中的必需品&#xff0c;鲜花业务的不断拓宽和鲜花消费场景的丰富将会吸引更多消费者。那么在竞争激烈的鲜花产业中&#xff0c;商家们应该…

账户权限

目录 1. 文件的一般权限 1.1. 文件详细信息 1.2. 文件权限构成 示例&#xff1a; 1.3. chmod命令 1.3.1. 参数 示例&#xff1a; 扩展&#xff1a;隐藏权限(chattr a) 1.4. chown命令 示例&#xff1a; 2. 特殊权限 2.1. 概述 2.2. SUID权限 2.3. SGID 权限 2.4…

深度优先(DFS) (例子:全排列,迷宫)

深度搜索是一种计算机算法&#xff0c;用于在图或树等数据结构中查找目标节点。深度搜索从一个节点出发&#xff0c;依次遍历其所有子节点&#xff0c;直到找到目标节点或遍历完所有节点。如果找到目标节点&#xff0c;则搜索结束&#xff1b;如果遍历完所有节点仍未找到目标节…

文心一言 VS 讯飞星火 VS chatgpt (109)-- 算法导论10.1 7题

七、用go语言&#xff0c;说明如何用两个队列实现一个栈&#xff0c;并分析相关栈操作的运行时间。 文心一言&#xff1a; 在Go语言中&#xff0c;我们可以用两个队列&#xff08;queue1和queue2&#xff09;实现一个栈。以下是实现代码&#xff1a; package main import &…

拉绳位移传感器钢丝绳角度偏离过大就会减少使用寿命

拉绳位移传感器钢丝绳角度偏离过大就会减少使用寿命 拉绳位移传感器还有一种情况就是&#xff0c;如果钢丝绳在恶劣的环境中作业&#xff0c;磨损&#xff0c;挤压&#xff0c;弯折等非正常使用&#xff0c;也更容易使钢丝绳断裂。位移传感器在作业中&#xff0c;钢丝绳角度偏离…

【JavaEE初阶】 线程的状态和转移

文章目录 &#x1f332;线程的状态&#x1f340;观察线程的所有状态&#x1f38d;线程状态和状态转移的意义&#x1f38b;观察线程的状态和转移&#x1f4cc;观察 1:&#x1f4cc;观察 2:&#x1f4cc;观察-3: ⭕总结 &#x1f332;线程的状态 &#x1f340;观察线程的所有状态…