SSM整合(一) | SSM创建项目配置整合 - 添加功能模块

news2024/12/28 20:28:29

文章目录

  • SSM整合
    • SSM配置整合
    • SSM功能模块

SSM整合

SSM配置整合

SSM整合流程:

  1. 创建工程
  2. SSM整合

Spring

  • SpringConfig

MyBatis

  • MybatisConfig
  • JdbcConfig
  • jdbc.properties

SpringMVC

  • ServletConfig
  • SpringMvcConfig

创建工程

基于Maven创建项目, 选择webapp模版并补全缺失的目录

在这里插入图片描述

导入整合SSM的全部依赖坐标

<dependencies>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.10.RELEASE</version>
  </dependency>

  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.2.10.RELEASE</version>
  </dependency>

  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>5.2.10.RELEASE</version>
  </dependency>

  <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.6</version>
  </dependency>

  <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.3.0</version>
  </dependency>

  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.47</version>
  </dependency>

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

  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
  </dependency>

  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
  </dependency>

  <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.0</version>
  </dependency>
</dependencies>

分别创建如下图所示的包

在这里插入图片描述

Spring整合Mybatis

配置文件:

  • SpringConfig
  • JdbcConfig、jdbc.properties
  • MyBatisConfig

config包下创建SpringConfig核心配置类

@Configuration // 设置为配置类
@ComponentScan({"com.chenyq.service"}) // 扫描Spring控制的bean
public class SpringConfig {
}

resource文件夹下创建jdbc.properties数据库配置文件

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/db1
jdbc.username=root
jdbc.password=123456789

config包下创建JdbcConfig配置类

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;

    @Bean
    public DataSource dataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driver);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }
}

config包下创建MyBatisConfig配置类

public class MyBatisConfig {
    @Bean
    public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSource);
        factoryBean.setTypeAliasesPackage("com.chenyq.pojo");
        return factoryBean;
    }

    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer() {
        MapperScannerConfigurer msc = new MapperScannerConfigurer();
        msc.setBasePackage("com.chenyq.dao");
        return msc;
    }
}

在SpringConfig文件中将配置的JdbcConfig、jdbc.properties、MyBatisConfig加载进来

@Configuration // 设置为配置类
@ComponentScan({"com.chenyq.service"}) // 扫描Spring控制的bean
@PropertySource("classpath:jdbc.properties") // 加载jdbc.properties配置文件
@Import({JdbcConfig.class, MyBatisConfig.class}) // 导入配置类
public class SpringConfig {
}

Spring整合SpringMVC

config包下创建一个Web容器配置类ServletConfig配置类

public class ServletConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{SpringConfig.class};
    }

    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMvcConfig.class};
    }

    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}

config包下创建SpringMvcConfig配置类

@Configuration
@ComponentScan("com.chenyq.controller")
@EnableWebMvc
public class SpringMvcConfig {
}

Spring事务配置

SpringConfig配置类中开启事务驱动

@Configuration // 设置为配置类
@ComponentScan({"com.chenyq.service"}) // 扫描Spring控制的bean
@PropertySource("classpath:jdbc.properties") // 加载jdbc.properties配置文件
@Import({JdbcConfig.class, MyBatisConfig.class}) // 导入配置类
@EnableTransactionManagement // 开启事务驱动
public class SpringConfig {
}

JdbcConfig创建事务管理器

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;

    @Bean
    public DataSource dataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driver);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }

    @Bean
    public PlatformTransactionManager transactionManager(DataSource dataSource) {
        DataSourceTransactionManager ds = new DataSourceTransactionManager();
        ds.setDataSource(dataSource);
        return ds;
    }
}

配置SpringMvc对静态资源放行, 不拦截静态资源路径(根据需求配置)

config包下添加一个配置类SpringMvcSupport

@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        // 当访问静态资源路径pages时, SpringMvc不进行管理
        registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
        // 当访问静态资源路径css时, SpringMvc不进行管理
        registry.addResourceHandler("/css/**").addResourceLocations("/css/");
        // 当访问静态资源路径js时, SpringMvc不进行管理
        registry.addResourceHandler("/js/**").addResourceLocations("/js/");
        // 当访问静态资源路径plugins时, SpringMvc不进行管理
        registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/");
    }
}

并让SpringConfig扫描SpringMvcSupport配置类

@Configuration
@ComponentScan({"com.chenyq.controller", "com.chenyq.config"})
@EnableWebMvc
public class SpringMvcConfig {
}

到这里SSM整合就完成了, 最终目录结构如下, 下面可以添加功能模块

在这里插入图片描述

SSM功能模块

功能模块添加流程:

表与实体类

dao(接口+自动代理)

service(接口+实现类)

  • 业务层接口测试(整合JUnit)

controller

  • 表现层接口测试(PostMan)

创建数据库表和实体类:

创建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 Java 第11版,Jolt大奖获奖作品,针对Java SE9、10、11全面更新');
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+');

pojo文件夹下创建实体类Book

public class Book {
    private Integer id;
    private String type;
    private String name;
    private String description;

    public Book() {
    }

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

dao层中创建一个接口BookDao, 该接口提供增删改查(查包括查全部和查单个)功能

public interface BookDao {
    // 添加数据
    @Insert("insert into tbl_book values(null, #{type}, #{name}, #{description})")
    void save(Book book);

    // 删除数据
    @Delete("delete from tbl_book where id=#{id}")
    void delete(Integer id);

    // 修改数据
    @Update("update tbl_book set type=#{type}, name=#{name}, description=#{description} where id=#{id}")
    void update(Book book);

    // 查询全部
    @Select("select * from tbl_book")
    List<Book> selectAll();

    // 根据id查询
    @Select("select * from tbl_book where id=#{id}")
    Book selectById(Integer id);
}

service中创建一个接口BookService, 并开启事务

@Transactional // 开启事务
public interface BookService {
    /**
     * 增加数据
     * @param book
     * @return
     */
    boolean save(Book book);

    /**
     * 删除数据
     * @param id
     * @return
     */
    boolean delete(Integer id);

    /**
     * 修改数据
     * @param book
     * @return
     */
    boolean update(Book book);

    /**
     * 查询全部数据
     * @return
     */
    List<Book> selectAll();

    /**
     * 根据id查询数据
     * @param id
     * @return
     */
    Book selectById(Integer id);
}

再在service层创建一个impl包, 并创建BookService接口的一个实现类BookServiceImpl

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

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

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

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

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

    public Book selectById(Integer id) {
        return bookDao.selectById(id);
    }
}

表现层controller包下创建控制器类BookController和控制器方法

@RestController
@RequestMapping("/books")
public class BookController {
    @Autowired
    private BookService bookService;

    @PostMapping
    public boolean save(@RequestBody Book book) {
        return bookService.save(book);
    }

    @DeleteMapping("/{id}")
    public boolean delete(@PathVariable Integer id) {
        return bookService.delete(id);
    }

    @PutMapping
    public boolean update(@RequestBody Book book) {
        return bookService.update(book);
    }

    @GetMapping
    public List<Book> selectAll() {
        return bookService.selectAll();
    }

    @GetMapping("/{id}")
    public Book selectById(@PathVariable Integer id) {
        return bookService.selectById(id);
    }
}

到这里我们整合完成了SSM, 完成了对数据库增删改查的功能, 但是在真是开发中, 我们需要进行测试接口

业务层接口通过Junit测试类测试; 创建com.chenyq.service包, 在该包下创建BookServiceTest测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfig.class)
public class BookServiceTest {
    @Autowired
    private BookService bookService;

    @Test
    public void testSave() {
        Book book = new Book("类型aaa", "名字bbb", "描述ccc");
        System.out.println(bookService.save(book));
    }

    @Test
    public void testDelete() {
        System.out.println(bookService.delete(7));
    }

    @Test
    public void testUpdate() {
        Book book = new Book("类型111", "名字222", "描述333");
        book.setId(8);
        System.out.println(bookService.update(book));
    }

    @Test
    public void testSelectAll() {
        System.out.println(bookService.selectAll());
    }


    @Test
    public void testSelectById() {
        System.out.println(bookService.selectById(2));
    }
}

表现层接口通过PostMan进行测试

在这里插入图片描述

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

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

相关文章

最优化方法Python计算:一元函数导数的数值计算

定义1 给定连续函数 f ( x ) f(x) f(x)&#xff0c; x ∈ Ω ⊆ R x\in\Omega\subseteq\text{ℝ} x∈Ω⊆R。设 x , x 1 ∈ Ω x,x_1\in\Omega x,x1​∈Ω&#xff0c; Δ x x − x 1 \Delta xx-x_1 Δxx−x1​ 称为变量 x x x的差分。此时&#xff0c; x x 1 Δ x xx_1\De…

黑盒测试过程中【测试方法】详解5-输入域,输出域,猜错法

在黑盒测试过程中&#xff0c;有9种常用的方法&#xff1a;1.等价类划分 2.边界值分析 3.判定表法 4.正交实验法 5.流程图分析 6.因果图法 7.输入域覆盖法 8.输出域覆盖法 9.猜错法 黑盒测试过程中【测试方法】讲解1-等价类&#xff0c;边界值&#xff0c;判定表_朝一…

Linux下实现共享内存的两种机制(附源码)

START Hello 大家好。 今天来讲一下Linux进程通信中重要的通信方式&#xff1a;共享内存作为Linux软件开发攻城狮&#xff0c;进程间通信是必须熟练掌握的重要技能&#xff0c;而共享内存是在程序开发中常用的也是重要的一种进程间通信方式。 下面我们就来聊一聊Linux下进程间…

【C++】string类的深浅拷贝问题

string类的深浅拷贝问题 浅拷贝问题构造/析构函数拷贝构造/赋值运算符重载的多种写法 浅拷贝问题 我们知道&#xff0c;定义一个类的时候&#xff0c;如果我们没有写构造&#xff0c;拷贝构造&#xff0c;赋值运算符重载&#xff0c;析构方法的话&#xff0c;编译器会自动生成。…

Django学习笔记001之创建项目

学习目标&#xff1a; 了解前端后台框架 掌握vs搭建Django环境 学习内容 1.背景学习 优缺点&#xff1a; 2.vs搭建Django开发环境 2.1. 准备vscode工具 可以从github上获取&#xff1a;https://github.com/microsoft/vscode。 2.2. 构建python虚拟环境 使用的命令是pyth…

微分方程数值解法(Runge-Kutta法PLC实现)

微分方程数值解法之欧拉法请参看下面的博客文章: 微分方程数值解法(PID仿真用一阶被控对象库PLC算法实现)_数学微积分算法plc编程实例_RXXW_Dor的博客-CSDN博客微分方程除极特殊情况外,大部分不可能求出它的精确解,只能用各种近似方法得到满足一定精度的近似解,微分方程由…

CTA进网检验要求修订原则和变更说明 SAR新国标在2024年正式实施

《进网检验要求文件》 实行定期及动态更新原则&#xff0c;其中检测项目应能体现进网监管的职责定位。 第一部分 基本功能性能 第二部分 空间性能 SAR 新版进网检验要求细化了各场景的测试距离&#xff1a; SAR新要求的实施日期&#xff1a; 第二部分 空间性能 EMC 第二部分 空…

【MySQL】查询中,NULL值转换为空字符串

系列文章 C#底层库–MySQLBuilder脚本构建类&#xff08;select、insert、update、in、带条件的SQL自动生成&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/129179216 C#底层库–MySQL数据库操作辅助类&#xff08;推荐阅读&#xff0…

【browserify】一步步教你学会browserify

https://www.cnblogs.com/fsg6/p/13139627.html Browserify browserify的官网是http://browserify.org/&#xff0c;他的用途是将前端用到的众多资源&#xff08;css,img,js,…) 打包成一个js文件的技术。 比如在html中引用外部资源的时候&#xff0c;原来我们可能这样写 &l…

C嘎嘎~~ [类 上篇]

类 上篇 1.面向过程和面向对象的认识2.类的引入3.类的定义4.类的访问限定符和封装4.1封装4.2访问限定符 5.类的作用域 1.面向过程和面向对象的认识 面向过程 和 面向对象的区别: 面向过程关注的是过程, 而面向对象关注的是对象之间的关系, 交互. C语言是面向过程的, 而C是面向对…

webshell gif图片文件绕过

目录页/dev/index. php允许GIF上传。尝试上传不同的文件类型将被拒绝。 这可以通过首先上传合法的GIF文件来绕过。使用了一个小的GIF https://giphy.com/gifs/obi-won-hvE0PhVAnGQAo 下载一个小的字节图片测试 上传文件并使用Burpsuite捕获请求。尝试上传时的请求应类似于下…

淘宝天猫店铺新品如何运营?

新品在店铺运营过程中是十分重要的部分&#xff0c;你知道新品在店铺运营中有何作用&#xff1f;了解新品运营机制吗&#xff1f;今天就来快速了解关于新品的知识点。 新品在店铺运营的角色&#xff1a; 01、商品生命周期有限 商品的普遍生命周期在3个月左右&#xff0c;3个…

Codeforces Round 867 (Div. 3)

Problem - E - Codeforces 思路&#xff1a; 首先&#xff0c;如果n为奇数&#xff0c;中间那个数无法调整&#xff0c;所以只考虑偶数只有26个字母&#xff0c;我们用cnt[]记录每个字母需要交换的对数。设maxn为交换对数最多的字母。显然&#xff0c;如果cnt[maxn]>n/2,显…

速锐得解码奔驰CAN数据应用于海外车联网远程控制与防盗系统

人们常说&#xff0c;奔驰征服一切&#xff0c;你征服奔驰。速锐得帮你征服奔驰的数据。 前日&#xff0c;有个海外客户&#xff0c;问我们做了奔驰哪些数据&#xff0c;他们需要一个车联网的远程控制系统&#xff0c;用于管理他们的车队。客户比较豪横&#xff0c;大多数都是…

大数据管理中心规划设计方案(ppt可编辑)

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除。 统一汇聚 推动业务数据协同5 价值提炼 支撑精准服务与科学管理6 实时感知 辅助城市治理高效运行7 大数据资源平台目标体系规划11 建设目标与思路12 使能高效协同&#xff0…

榜上有名 | 创宇盾荣登“2023 IT市场权威榜单”!

4月20日&#xff0c;已连续成功举办23届的IT市场年会在北京举行&#xff0c;作为权威咨询机构赛迪主办&#xff0c;中国IT业界延续时间最长的年度盛会之一&#xff0c;“2023 IT市场年会”隆重发布重磅权威榜单。 创宇盾作为云防护领域专业防护产品&#xff0c;在国家经济产业…

C++的默认成员函数

上一次我们说到了C的类&#xff0c;我们还知道在C的类中可以写函数&#xff0c;而且这个函数也属于这个类&#xff0c;我们可以直接使用这个类的对象去调用这个函数。 今天我们来看一下C的六个默认成员函数(这里说是6个&#xff0c;但是重要的只有4个) 构造函数 在C语言中&a…

Raft 共识算法3-日志复制

Raft 共识算法3-日志复制 Raft算法中译版地址&#xff1a;https://object.redisant.com/doc/raft%E4%B8%AD%E8%AF%91%E7%89%88-2023%E5%B9%B44%E6%9C%8823%E6%97%A5.pdf 英原论文地址&#xff1a;https://raft.github.io/raft.pdf Etcd Assistant 是一款 etcd 可视化管理软件&a…

idea使用 ( 一 ) 安装及初步使用

1.介绍 1.1.什么是 IDE 集成开发环境&#xff08;IDE&#xff0c;Integrated Development Environment &#xff09;是用于提供程序开发环境的应用程序&#xff0c;一般包括代码编辑器、编译器、调试器和图形用户界面]等工具。简单说就是开发工具&#xff0c;java开发中常用的…

一文读懂数据安全分级分类

目录 为什么要分级分类&#xff1f; 通用数据分级分类框架 数据分类 数据分类的常用方法 数据分类流程 数据分级 数据分级的常用方法 数据定级流程 行业数据安全分级分类指南 金融行业 电信行业 政务数据 健康医疗 企业实践 附录&#xff1a;数据分级分类大合集…