后台图书管理系统:SSM整合开发案例

代码已经完善,文章内容会在后续补充
代码地址(https://javazhang.lanzn.com/ig8tf1wd2aba
密码:1234)
在这里插入图片描述
1.1 .SpringConfig 代码

@Configuration
@ComponentScan({"com.itheima.service" })
@PropertySource("classpath:jdbc.properties")
@Import({JdbcConfig.class, MyBatisConfig.class})
@EnableTransactionManagement
public class SpringConfig {
}

第一个注解: 设置当前类为配置类
第二个:包扫描识别Spring组件类
第三个:加载外部配置文件
第四个:导配置包(导入service 是为了自动装配能够找到它 , 在后续代码中有用到service类的代码 , 需要用到自动装配)
第五个:开启事务

1.2JdbcConfig

package com.itheima.config;import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;import javax.sql.DataSource;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;@Beanpublic DataSource dataSource(){DruidDataSource ds = new DruidDataSource();ds.setDriverClassName(driver);ds.setUrl(url);ds.setUsername(username);ds.setPassword(password);return ds;}@Beanpublic PlatformTransactionManager transactionManager(DataSource dataSource){DataSourceTransactionManager ds = new DataSourceTransactionManager();//这里的dataSourse不能用方法调 因为用发放调就会脱离Spring管理 就不是一个东西ds.setDataSource(dataSource);return ds;}

第二个方法是用来配合事务管理的

1.3 MyBatisConfig

package com.itheima.config;import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;import javax.sql.DataSource;public class MyBatisConfig {@Beanpublic SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();ssfb.setDataSource(dataSource);//类型别名ssfb.setTypeAliasesPackage("com.itheima.domain");return ssfb;}@Beanpublic MapperScannerConfigurer mapperScannerConfigurer(){MapperScannerConfigurer msc = new MapperScannerConfigurer();//指定映射从哪加载msc.setBasePackage("com.itheima.dao");return msc;}
}

这个类是为了在Spring类中集成MyBatis的
第一个方法 创建与数据交互用到的sqlsession
为类型起别名 简化sql语句类型引用

第二个方法 为了绑定mapper的类 ,mapper中做到了进行数据库操作等内容

1.4 jdbc配置类

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm_db
jdbc.username=root
jdbc.password=1234

2.1 ServletConfig

package com.itheima.config;import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;/*** 外部容器配置类*/
public class ServletConfig extends AbstractAnnotationConfigDispatcherServletInitializer {//记载spring配置类protected Class<?>[] getRootConfigClasses() {return new Class[]{SpringConfig.class};}//web容器加载SpringMvcconfigprotected Class<?>[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class};}//拦截请求归谁管protected String[] getServletMappings() {return new String[]{"/"};}
}

第一个方法指定SpringConfig 的配置类
第二个指定SpringMVC配置类
第三个指定Spring mvc响应哪些请求
SpringMvc:为构建web项目提供了一个完整的流程

2.2SpringMvcConfig
SpringMvc 配置类

package com.itheima.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;@Configuration
@ComponentScan({"com.itheima.controller" , "com.itheima.config"})
@EnableWebMvc
public class SpringMvcConfig {}

第一个注解: 表明当前类为配置类
第二个注解:扫描包下的组件
第三个注解:功能很强大,开启mvc功能 , 暂时用到解析JSON数据

SpringMvcSupport

package com.itheima.config;import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {@Overrideprotected void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");registry.addResourceHandler("/css/**").addResourceLocations("/css/");registry.addResourceHandler("/js/**").addResourceLocations("/js/");registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/");}
}

用来响应前端代码 , 告诉他访问目录与去哪个文件找

controller类:
1.BookController

package com.itheima.controller;import com.itheima.domain.Book;
import com.itheima.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;/*** 控制器类*/
@RestController
@RequestMapping("/books")
public class BookController {@Autowiredprivate BookService bookService;// 这里面的参数从Json数据中来 所以从@RequestBody 请求体中获得@PostMappingpublic Result save(@RequestBody Book book) {boolean flag = bookService.save(book);return new Result(flag? Code.SAVE_OK:Code.SAVE_ERR,flag);}@PutMappingpublic Result update(@RequestBody Book book) {boolean flag = bookService.update(book);return new Result(flag? Code.UPDATE_OK:Code.UPDATE_ERR , flag) ;}// 这种是路径参数 所以从@PathVariable(英文翻译是路径参数) 中获得@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);}@GetMappingpublic Result getAll() {List<Book> book = bookService.getAll();Integer code = book != null ? Code.GET_OK : Code.GET_ERR;String msg = book != null ? "" :"数据查询失败,请重试";return new Result(code,book,msg);}
}

使用了Rest风格简化开发 统一规范
Rest风格个人理解
在这里插入图片描述
2.Code 编写与前端商量好的协议号

package com.itheima.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 BUSINESS_ERR = 50002;public static final Integer SYSTEM_UNKNOW_ERR = 59999;}

3.异常处理类

package com.itheima.controller;import com.itheima.exception.BusinessException;
import com.itheima.exception.SystemException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;//声明类是用来做异常处理的
@RestControllerAdvice
public class ProjectExceptionAdvice {@ExceptionHandler(SystemException.class)public Result  doSystemException(SystemException 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  doException(Exception ex){System.out.println("Bug ");return new Result(Code.SYSTEM_UNKNOW_ERR,"null" , "系统繁忙,请稍后再试");}}

分为三部分 系统异常 , 运行异常 ,其他异常 根据返回一个异常类 来表明出现什么问题

3.异常类Result

package com.itheima.controller;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;}
}

dao层

package com.itheima.dao;import com.itheima.domain.Book;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;import java.util.List;/*** 提供怎删改查功能*/
public interface BookDao {// 这里中的type指的是book中属性//使用这个语句可以少写一个数据库操作类@Insert("INSERT INTO tbl_book values (null , #{type}, #{name},#{description}) ")//第二种写法 为了不写id 因为id是默认给的//                               下面的type是表中字段名                   这里的是Book中的属性//@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();}

执行对数据库操作的内容

domain

package com.itheima.domain;public class Book {private Integer id;private String type;private String name;private String description;@Overridepublic String toString() {return "Book{" +"id=" + id +", type='" + type + '\'' +", name='" + name + '\'' +", description='" + description + '\'' +'}';}public int getId() {return id;}public void setId(int 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;}
}

用于映射数据库 在MyBatis配置类中会用到这个类

exception类

两个异常处理相关方法

package com.itheima.exception;public class BusinessException extends RuntimeException{//添加异常编号//添加异常编号private Integer code;public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public BusinessException(String message, Integer code) {super(message);this.code = code;}public BusinessException(String message, Throwable cause, Integer code) {super(message, cause);this.code = code;}public BusinessException(Throwable cause, Integer code) {super(cause);this.code = code;}}
package com.itheima.exception;public class SystemException extends RuntimeException{//添加异常编号private Integer code;public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public SystemException(String message, Integer code) {super(message);this.code = code;}public SystemException(String message, Throwable cause, Integer code) {super(message, cause);this.code = code;}public SystemException(Throwable cause, Integer code) {super(cause);this.code = code;}}

service 包
使用了事务

package com.itheima.service;import com.itheima.domain.Book;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import org.springframework.transaction.annotation.Transactional;import java.util.List;@Transactional
public interface BookService {/*** 保存* @param book* @return*/boolean save(Book book);/*** 修改* @param book* @return*/boolean update(Book book);/*** 按id删除* @param id* @return*/boolean delete(Integer id);/*** 按id查询* @param id* @return*/Book getById(Integer id);/*** 查询全部* @return*/List<Book> getAll();}
package com.itheima.service.impl;import com.itheima.controller.Code;
import com.itheima.dao.BookDao;
import com.itheima.domain.Book;
import com.itheima.exception.BusinessException;
import com.itheima.exception.SystemException;
import com.itheima.service.BookService;
import com.itheima.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class BookServiceImpl implements BookService {/*** 进行添加正确失败的判断是根据BookDao传回来的受影响行数决定 >0表示操作成功*/@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("访问超时请重试", e, Code.SYSTEM_TIMEOUT_ERR);
//        }return  bookDao.getById(id);}public List<Book> getAll() {return  bookDao.getAll();}
}
插入代码片

剩下的部分是前端相关在资源中有介绍

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

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

相关文章

【STM32+HAL】读取电池电量

一、准备工作 有关CUBEMX的初始化配置&#xff0c;参见我的另一篇blog&#xff1a;【STM32HAL】CUBEMX初始化配置 有关定时器触发ADC模式配置&#xff0c;详见【STM32HAL】ADC采集波形实现 有关软件触发ADC模式配置&#xff0c;详见【STM32HAL】三轴按键PS2摇杆 二、所用工具…

如何替代传统的方式,提高能源企业敏感文件传输的安全性?

能源行业是一个关键的基础设施领域&#xff0c;它涉及能源的勘探、开采、生产、转换、分配和消费。随着全球经济的发展和人口的增长&#xff0c;能源需求持续上升&#xff0c;这对能源行业的可持续发展提出了挑战。能源行业的传输场景多种多样&#xff0c;需要重点关注能源企业…

【热门话题】Chrome 插件研发详解:从入门到实践

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 Chrome 插件研发详解&#xff1a;从入门到实践一、引言二、Chrome 插件基础概念…

应用实战 | 别踩白块小游戏,邀请大家来PK挑战~

“踩白块会输”是一个简单的微信小程序游戏&#xff0c;灵感来自当年火热的别踩白块游戏&#xff0c;程序内分成三个模块&#xff1a;手残模式、经典模式和极速模式&#xff0c;分别对应由易到难的三种玩法&#xff0c;可以查看游戏排名。动画效果采用JS实现&#xff0c;小程序…

多线程事务怎么回滚

1、背景介绍 1&#xff0c;最近有一个大数据量插入的操作入库的业务场景&#xff0c;需要先做一些其他修改操作&#xff0c;然后在执行插入操作&#xff0c;由于插入数据可能会很多&#xff0c;用到多线程去拆分数据并行处理来提高响应时间&#xff0c;如果有一个线程执行失败…

Git重修系列 ------ Git的使用和常用命令总结

一、Git的安装和配置 git安装&#xff1a; Git - Downloads git首次配置用户信息&#xff1a; $ git config --global user.name "kequan" $ git config --global user.email kequanchanqq.com $ git config --global credential store 配置 Git 以使用本地存储机…

mysql主库delete一个没主键的表导致从库延迟很久问题处理

一 问题描述 发现线上环境一个从库出现延迟&#xff0c;延迟了2天了&#xff0c;还没追上主库。 查看当前运行的sql及事务&#xff0c;发现这个sql语句是在delete一个没主键的表。 二 问题模拟 这里在测试环境复现下这个问题。 2.1 在主库造数据 use baidd; CREATE TABL…

【数据库】Redis

文章目录 [toc]Redis终端操作进入Redis终端Redis服务测试切换仓库 String命令存储字符串普通存储设置存储过期时间批量存储 查询字符串查询单条批量查询 Key命令查询key查询所有根据key首字母查询判断key是否存在查询指定的key对应的value的类型 删除键值对 Hash命令存储hash查…

软件测试_v模型_w模型

v模型&#xff1a; w模型&#xff1a; 一、V模型的8个阶段及其对应关系如下&#xff1a; 1. 需求分析&#xff1a;明确项目的需求&#xff0c;为后续设计提供依据。 2. 总体设计&#xff1a;根据需求分析&#xff0c;设计系统的总体架构。 3. 详细设计&#xff1a;在总体设计的…

在no branch上commit后,再切换到其他分支,找不到no branch分支的修改怎么办?

解决办法 通过git reflog我们可以查看历史提交记录&#xff0c;这里的第二条提交&#xff08;fbd3ea8&#xff09;就是我在no branch上的提交。 再通过git checkout -b backup fbd3ea8&#xff0c;恢复到上次提交的状态&#xff0c;并且为其创建个分支backup&#xff0c;此时…

(七)Servlet教程——Idea编辑器集成Tomcat

1. 点击桌面上Idea快捷方式打开Idea编辑器&#xff0c;假如没有创建项目的话打开Idea编辑器后的界面展示如下图所示 2. 点击界面左侧菜单中的自定义 3. 然后点击界面中的“所有设置...”,然后点击“构建、执行、部署”&#xff0c;选择其中的“应用程序服务器” 4. 点击“”按钮…

C语言-动态内存分配

即使行动导致错误&#xff0c;却也带来了学习与成长;不行动则是停滞与萎缩。&#x1f493;&#x1f493;&#x1f493; •&#x1f319;知识回顾 亲爱的友友们大家好&#xff01;&#x1f496;&#x1f496;&#x1f496;&#xff0c;我们紧接着要进入一个新的内容&#xff0c;…

k8s RBAC 角色访问控制详解与生产中的实际应用案例

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Kubernetes航线图&#xff1a;从船长到K8s掌舵者》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、前言 1、k8s简介 2、RBAC简介 二、RBAC关键…

【AMBA Bus ACE 总线 6 -- ACE cache maintenance 详细介绍】

文章目录 ACE cache maintenance什么叫 cache maintenance operations呢?ACE cache line statesACE cache maintenance 什么叫 cache maintenance operations呢? 比如ARM CPU 对自己的Icache 和 Dcache会有大量的transaction操作,也即maintenance操作,如果cache 是dirty 话…

Python的历史演变与作用

目录 1.概述 2.起源 3.发展阶段 4.Python 3的诞生 5.现状与未来 6.Python的作用 6.1.Web开发 6.2.数据科学与人工智能 ​​​​​​​6.3.自动化与脚本编程 ​​​​​​​6.4.教育与学习 ​​​​​​​6.5.其他领域 7.结语 1.概述 Python&#xff0c;一门富有表…

26.统一网关Gateway

网关的功能 1.身份认证&#xff0c;权限的校验。 2.服务的路由&#xff0c;负载均衡。用户请求被分配到哪一个微服务。一个微服务可以有多个实例&#xff0c;所以使用负载均衡。 3.请求限流。 springcloud网关实现有两种&#xff1a;gateway, zuul zuul是基于servlet实现的…

JavaEE——介绍 HTTPServlet 三部分使用与 cookie 和 session 的阐述

文章目录 一、HTTPServlet介绍其中的关键 三个方法 二、HTTPServletRequest(处理请求)1.分块介绍方法作用get 为前缀的方法字段中 含有 getParameter 字段 的方法(前后端交互)&#xff1a;字段中 含有 getHeader 字段 的方法&#xff1a; 2.解释前后端的交互过程3.使用 json 格…

币圈是什么意思?币圈开发

币圈是一个涵盖了区块链、加密货币及其应用的独特领域&#xff0c;它的兴起与发展已经彻底改变了我们对金融、科技和未来的认知。 一、什么是币圈&#xff1f; 币圈可以被理解为围绕虚拟货币展开的一系列活动和产业的总称。它包括区块链技术的研发、数字货币的创造、交易、投资…

数字旅游打造个性化旅行体验,科技让旅行更精彩:借助数字技术,旅行者可以定制专属旅行计划,享受个性化的旅行体验

目录 一、引言 二、数字旅游的兴起与发展 三、数字技术助力个性化旅行体验 1、智能推荐系统&#xff1a;精准匹配旅行者需求 2、定制化旅行计划&#xff1a;满足个性化需求 3、实时互动与分享&#xff1a;增强旅行体验 四、科技提升旅行便捷性与安全性 1、移动支付与电…

PotatoPie 4.0 实验教程(30) —— FPGA实现摄像头图像中值滤波

中值滤波是什么&#xff1f; 图像的中值滤波是一种非线性图像滤波方法&#xff0c;它用于去除图像中的椒盐噪声或其他类型的噪声。中值滤波的原理是用每个像素周围的邻域中的中值来替代该像素的值。与均值滤波不同&#xff0c;中值滤波不会受到极端值的影响&#xff0c;因此在处…