SSM学习记录4:SSM整合(注释方式 + SprigMVC项目 + 2022发布版本IDEA)

news2025/1/20 14:51:01

SSM整合

整合中Tomcat等配置与前面学习相同
注:SpringMvcConfig里扫描的用@Configuration注解的组件可以装载SpringConfig里扫描的组件,而SpringMvc不可以装载SpringMvcConfig里扫描的组件,相同配置类中扫描的组件可以相互装载
1.添加依赖↓

        <dependencies>
            <!-- SpringMVC -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>6.0.6</version>
            </dependency>

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

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

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

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

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

            <!-- ServletAPI -->
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
                <version>4.0.1</version>
                <scope>provided</scope>
            </dependency>

            <!--选择与tomcat对应的servlet-api版本-->
            <dependency>
                <groupId>org.apache.tomcat</groupId>
                <artifactId>tomcat-servlet-api</artifactId>
                <version>10.1.7</version>
            </dependency>

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

            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-annotations</artifactId>
                <version>2.14.2</version>
            </dependency>

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

            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-test</artifactId>
                <version>6.0.6</version>
                <scope>provided</scope>
            </dependency>

        </dependencies>

            

2.添加所有项目库↓
在这里插入图片描述
3.类与配置在这里插入图片描述

各配置类如下:
JdbcConfig↓

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;

import javax.sql.DataSource;

public class JdbcConfig {
    @Value("${jdbc.drive}")
    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 druidDataSource = new DruidDataSource();
        druidDataSource.setDriverClassName(driver);
        druidDataSource.setUrl(url);
        druidDataSource.setUsername(username);
        druidDataSource.setPassword(password);
        return druidDataSource;
    }
}

MyBatisConfig↓

import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;

import javax.sql.DataSource;

public class MyBatisConfig {
    @Bean
    public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSource);
        return factoryBean;
    }

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

}

SpringConfig↓

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.PropertySource;

@Configuration
@ComponentScan({"dao", "service"})
@PropertySource("classpath:jdbc.properties")
@Import({JdbcConfig.class, MyBatisConfig.class})
/*@ComponentScan(value = "com.example.bishe",
        excludeFilters = @ComponentScan.Filter(
                type = FilterType.ANNOTATION,
                classes = Controller.class
        ))*/
public class SpringConfig {
}

SpringMvcConfig↓

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

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

ServletContainersInitConfig↓

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

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

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

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

    //POST传中文字符串时出现乱码添加过滤
    /*@Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        filter.setEncoding("UTF-8");
        return new Filter[]{filter};
    }*/
}

jdbc.properties的配置如下↓

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/数据库名?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false
jdbc.username=root
jdbc.password=root

实体类包↓
在这里插入图片描述

public class User {
    private String uName;
    private String uSex;
    private String uPhone;
    private String uIdentityCard;
    private String uPassword;
    private String uAccount;

    @Override
    public String toString() {
        return "User{" +
                "uName='" + uName + '\'' +
                ", uSex='" + uSex + '\'' +
                ", uPhone='" + uPhone + '\'' +
                ", uIdentityCard='" + uIdentityCard + '\'' +
                ", uPassword='" + uPassword + '\'' +
                ", uAccount='" + uAccount + '\'' +
                '}';
    }

    public void setuName(String uName) {
        this.uName = uName;
    }

    public void setuSex(String uSex) {
        this.uSex = uSex;
    }

    public void setuPhone(String uPhone) {
        this.uPhone = uPhone;
    }

    public void setuIdentityCard(String uIdentityCard) {
        this.uIdentityCard = uIdentityCard;
    }

    public void setuPassword(String uPassword) {
        this.uPassword = uPassword;
    }

    public void setuAccount(String uAccount) {
        this.uAccount = uAccount;
    }

    public String getuName() {
        return uName;
    }

    public String getuSex() {
        return uSex;
    }

    public String getuPhone() {
        return uPhone;
    }

    public String getuIdentityCard() {
        return uIdentityCard;
    }

    public String getuPassword() {
        return uPassword;
    }

    public String getuAccount() {
        return uAccount;
    }
}

dao包↓
在这里插入图片描述
UserDao接口

import domain.User;
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 UserDao {
    @Insert("insert into user(uAccount,uPassword) values(#{uAccount},#{uPassword})")
    public void save(User user);
    @Update("update user set uName = #{uName}, uSex = #{uSex}, uPhone = #{uPhone}, uIdentityCard= #{uIdentityCard} where uAccount = #{uAccount}")
    public void update(User user);
    @Update("update user set uPassword = #{uPassword} where uAccount = #{uAccount}")
    public void updatePassword(String uAccount);
    @Delete("delete from user where uAccount = #{uAccount}")
    public void delete(String uAccount);
    @Select("select * from user where uAccount = #{uAccount}")
    public User getByUaccount(String uAccount);
    @Select("select * from user")
    public List<User> getAll();
}

注:当传入多个参数时,使用@Param进行注解↓
在这里插入图片描述

service包↓
在这里插入图片描述
UserService接口↓

import domain.User;

import java.util.List;

public interface UserService {

    /**
     *保存
     * @param user
     * @return
     */
    public boolean save(User user);
    /**
     *修改信息
     * @param user
     * @return
     */

    public boolean update(User user);
    /**
     *修改密码
     * @param user
     * @return
     */

    public boolean updatePassword(String uAccount);
    /**
     *删除
     * @param user
     * @return
     */

    public boolean delete(String uAccount);
    /**
     *查询
     * @param user
     * @return
     */

    public User getByuAccount(String uAccount);
    /**
     *查询全部
     * @param user
     * @return
     */

    public List<User> getAll();
}

impl包的实现类UserServiceImpl↓
在这里插入图片描述

import dao.UserDao;
import domain.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import service.UserService;

import java.util.List;


@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao userDao;
    @Override
    public boolean save(User user) {
        userDao.save(user);
        return true;
    }

    @Override
    public boolean update(User user) {
        userDao.update(user);
        return true;
    }

    @Override
    public boolean updatePassword(String uAccount) {
        userDao.updatePassword(uAccount);
        return true;
    }

    @Override
    public boolean delete(String uAccount) {
        userDao.delete(uAccount);
        return true;
    }

    @Override
    public User getByuAccount(String uAccount) {
        return userDao.getByUaccount(uAccount);
    }

    @Override
    public List<User> getAll() {
        return userDao.getAll();
    }
}

controller包↓
在这里插入图片描述

import domain.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import service.UserService;

import java.util.List;

@RestController
@RequestMapping("/users")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/save")
    public String save(){
        System.out.println("你好");
        return "[success]";
    }

    @PostMapping
    public boolean save(@RequestBody User user) {
        return userService.save(user);
    }

    @PutMapping
    public boolean update(@RequestBody User user) {
        return userService.update(user);
    }

    @PutMapping("/{uAccount}")
    public boolean updatePassword(@PathVariable String uAccount) {
        return userService.updatePassword(uAccount);
    }

    @DeleteMapping("/{uAccount}")
    public boolean delete(@PathVariable String uAccount) {
        return userService.delete(uAccount);
    }

    @GetMapping("/{uAccount}")
    public User getByAccount(@PathVariable String uAccount) {
        return userService.getByuAccount(uAccount);
    }

    @GetMapping
    public List<User> getAll() {
        return userService.getAll();
    }
}

4.测试
测试时Junit4中文乱码,未找到解决方法,就此不记
通过SpringMVC控制器功能进行测试↓

在这里插入图片描述
注:实体类的属性名需与数据库中字段名相同,否的读取数据时,无法装载进实体类对象中

5.事务管理
SpringConfig中添加事务管理注解@EnableTransactionManagement↓
在这里插入图片描述
JdbcConfig配置类中添加平台事务管理类型方法,其中DataSource是自动装配的Bean↓
在这里插入图片描述
服务类接口中使用注解@Transactional开启事务管理↓
在这里插入图片描述

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

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

相关文章

PLATO: Pre-trained Dialogue Generation Model with Discrete Latent Variable论文学习

一、大纲内容 二、详细内容 Abstract ○ 对话生成模型可以用于闲聊、知识对话、对话问题生成 ○ 本文 ■ 构建了一个灵活的attention机制&#xff0c;充分的促进了单向和双向的语言生成模型 ■ 介绍了一个离散的潜变量&#xff0c;较好的解决了一问多答的问题 ■ 上述两个结构…

DAY 36 文本处理命令awk

awk的概述 awk&#xff1a; 在 Linux/UNIX 系统中&#xff0c;awk 是一个功能强大的编辑工具&#xff0c;逐行读取输入文本&#xff0c; 默认以空格或tab键作为分隔符作为分隔&#xff0c;并按模式或者条件执行编辑命令 awk信息的读入也是逐行指定的匹配模式进行查找&#x…

Unity ——使用贝塞尔曲线对三维管状物体进行弯曲

参考链接&#xff1a;【Unity】弹性鱼竿简单实现-通过贝塞尔曲线修改Mesh - 简书 参考论文&#xff1a;吴晓亮, 黄襄念. Unity 中使用贝塞尔曲线对三维物体进行弯曲[J]. 现代计算机, 2016 (5): 57-59. unity项目下载&#xff1a;https://download.csdn.net/download/weixin_4…

时间序列 | MATLAB实现CNN-GRU-Attention时间序列预测

时间序列 | MATLAB实现CNN-GRU-Attention时间序列预测 目录时间序列 | MATLAB实现CNN-GRU-Attention时间序列预测预测效果基本介绍模型描述程序设计参考资料预测效果 基本介绍 MATLAB实现CNN-GRU-Attention时间序列预测&#xff0c;CNN-GRU结合注意力机制时间序列预测。 模型描…

涨点技巧:卷积变体DCNV2引入Yolov8,助力小目标涨点

1.DCN V2介绍 DCN V2: Improved Deep & Cross Network and Practical Lessons for Web-scale Learning to Rank Systems 论文:https://arxiv.org/abs/2008.13535 作者通过在DCN的基础上,增加了2个创新点,分别是调制模块和使用多个调制后的DCN模块,从形成了DCN的升级版…

解码营养行业新趋势 2023晶球益生菌与肠内营养健康高峰论坛圆满落幕

后疫情时代&#xff0c;国人自身健康管理意识日益提高&#xff0c;越来越多的人认识到到微生物组、营养吸收与免疫健康的密切联系&#xff0c;并逐渐认可微生态和肠内营养在临床应用过程中的积极作用&#xff0c;使得营养治疗研究成果进一步落地转化。消费升级新时代&#xff0…

一文带你读懂,这三个交换机层级的区别和联系。

01 第二层交换机 OSI参考模型的第二层叫做数据链路层&#xff0c;第二层交换机通过链路层中的MAC地址实现不同端口间的数据交换。 第二层交换机主要功能&#xff0c;就包括物理编址、错误校验、帧序列以及数据流控制。 因为这是最基本的交换技术产品&#xff0c;目前桌面型交…

CDN到期不想续费?!MINIO救个场!

一、安装MINIO 下载 wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20230413030807.0.0.x86_64.rpm -O minio.rpm 安装 yum install minio.rpm 二、启动 MinIO 服务器 创建启动实例目录 mkdir ~/minio 启动 MInIO实例 minio server ~/minio -…

解析hash(散列)数据结构

前言 在学习完map、set这两个由红黑树构成的容器后&#xff0c;我们来到了这里hash&#xff0c;首先我们要有一个基础的认知——哈希和map与set的仅在使用时的差别区别&#xff1a;前者内部的元素没有序&#xff0c;而后者有序&#xff0c;其它的都相同&#xff0c;这里我们可…

【C++进阶之路】第一篇:C++中的继承

&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f; &#x1f36d;&#x1f36d;系列专栏&#xff1a;【C学习与应用】 ✒️✒️本篇内容&#xff1a;继承的基础概念&#xff0c;定义方法&#xff0c;基类和派生类的转换&#xff0c;继承中类的作用域&#xf…

VSCode配置React Native调试环境

首先&#xff0c;用VSCode打开新建的react native工程&#xff0c;此时只能运行&#xff0c;是无法调试的。如果想单步调试代码&#xff0c;需要配置。 点击VSCode左边三角形菜单&#xff1a; 点击“创建launch.json文件”&#xff0c; 选择“React Native”调试器&#xff0c;…

肖 sir_就业课__011性能测试讲解

性能测试讲解 一、你做过性能测试吗&#xff1f; 方法1&#xff1a;做过 方法2&#xff1a;在公司中性能测试有专门的性能小组做&#xff0c;但是我也会做性能 二、性能测试有哪些类型&#xff1f; 1&#xff09;压力测试&#xff08;破坏性测试&#xff09; 压力测试是系统在一…

WiFi协议曝安全漏洞:Linux、Android和iOS未能逃脱

来自美国东北大学和鲁汶大学的学者披露了一组IEEE 802.11 Wi-Fi协议标准的一个基础设计漏洞&#xff0c;影响到运行Linux、FreeBSD、Android和iOS的各种设备。 来自美国东北大学和鲁汶大学的学者披露了一组IEEE 802.11 Wi-Fi协议标准的一个基础设计漏洞&#xff0c;影响到运行L…

【C++核心】内存、引用、函数

一、内存四区域 C程序在执行时&#xff0c;将内存大方向划分为4个区域 程序运行前分为&#xff1a; 代码区&#xff1a;存放函数体的二进制代码exe&#xff0c;由操作系统进行管理的 exe机器指令、共享、只读 全局区&#xff1a;存放全局变量和静态变量以及常量&#xff08;字…

运行时内存数据区之虚拟机栈——操作数栈

操作数栈 每一个独立的栈帧中除了包含局部变量表以外&#xff0c;还包含一个后进先出(Last-In-First-Out)的操作数栈&#xff0c;也可以称之为表达式栈(Expression Stack)。操作数栈&#xff0c;在方法执行过程中&#xff0c;根据字节码指令&#xff0c;往栈中写入数据或提取数…

Netty缓冲区ByteBuf源码解析

在网线传输中&#xff0c;字节是基本单位&#xff0c;NIO使用ByteBuffer作为Byte字节容器&#xff0c; 但是其使用过于复杂&#xff0c;因此Netty 写了一套Channel&#xff0c;代替了NIO的Channel &#xff0c;Netty 缓冲区又采用了一套ByteBuffer代替了NIO 的ByteBuffer &…

微服务+springcloud+springcloud alibaba学习笔记【OpenFeign的使用】(5/9)

OpenFeign的使用 5/91、OpenFeign简介1.1、Feign及OpenFeign概念和作用1.2、Feign和OpenFeign区别2、OpenFeign使用步骤2.1、创建Feign消费端微服务2.2、修改POM文件配置2.3、编写yml配置文件2.4、编写主启动类2.5、编写业务类2.5.1、编写 service 层接口&#xff0c;用于服务提…

什么是线性回归?线性回归有什么特征?

什么是线性回归 线性回归定义与公式 线性回归(Linear regression)是利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模的一种分析方式。 特点&#xff1a;只有一个自变量的情况称为单变量回归&#xff0c;多于一个自变量情况的叫做多元回归 线…

Orange Pi 5B面世,传承经典,再续传奇

近日&#xff0c;香橙派又出大招。刚刚发布的Orange Pi 5B在性能和表现上再度升级。此前&#xff0c;Orange Pi 5凭借出色的性能和极低的价格被誉为“地表最高性价比开发板”&#xff0c;一经上市就引起市场轰动&#xff0c;销量引领同类产品市场&#xff0c;获得极佳口碑。那么…

【音视频第13天】另外一种拥塞控制算法-TransportCC

目录与Goog-REMB区别TrendLine滤波器与Goog-REMB区别 与Goog-REMB有两个区别&#xff1a; 将拥塞评估算法从接收端移动到了发送端&#xff0c;评估和控制是一体的。TransportCC是发送端评估发送端接着改变码率&#xff0c;REMB是接收端评估&#xff0c;把评估出来的值给发送端…