基于SpringBoot的SSM整合案例

项目目录:

数据库表以及表结构

user表结构

user_info表结构

引入依赖

父模块依赖:
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.12.RELEASE</version>
    </parent>
<properties>中的版本管理
<!--mybatis版本-->
        <mybatis.spring.version>2.2.2</mybatis.spring.version>
        <!--Druid版本-->
        <druid.version>1.2.11</druid.version>
        <!--mysql版本-->
        <mysql.version>5.1.38</mysql.version>
<dependences>依赖:
<!--应用程序的web起步依赖,包含了构建web应用程序所需的基本组件和依赖-->
        <!--使用该依赖可以快速启动一个基于SpringMVC的应用程序-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--添加测试依赖,该依赖用于在SpringBoot应用程序中进行单元测试和继承测试-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>${mybatis.spring.version}</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>${druid.version}</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

添加配置文件

application.xml
spring:
  profiles:
    active: dev
server:
  port: 8088
  servlet:
    context-path: /ssm
mybatis:
  config-location: classpath:mybatis/mybatis-config.xml
  mapper-locations: classpath:mybatis/**/*Mapper.xml
application-dev.xml
# 数据源配置
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/ssm?useUnicode=true&characterEncoding=utf-8&useSSL=false
    username: root
    password: root
    druid:
      # 初始连接数
      initialSize: 5
      # 最小连接池数量
      minIdle: 10
      # 最大连接池数量
      maxActive: 20
      # 配置获取连接等待超时的时间
      maxWait: 60000
      # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      timeBetweenEvictionRunsMillis: 60000
      # 配置一个连接在池中最小生存的时间,单位是毫秒
      minEvictableIdleTimeMillis: 300000
      # 配置一个连接在池中最大生存的时间,单位是毫秒
      maxEvictableIdleTimeMillis: 900000
      # 配置检测连接是否有效
      validationQuery: SELECT 1 FROM DUAL
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      webStatFilter:
        enabled: true
      statViewServlet:
        enabled: true
        # 设置白名单,不填则允许所有访问
        allow:
        # 指定访问druid监控页面的请求映射路径
        # 开发中一般通过:服务器映射路径/druid/index,来访问监控页面
        url-pattern: /druid/*
        # 监控默认是可以直接访问的
        # 如果有以下配置,那么访问监控页面时会跳转到,控制台管理页面进行登录控制
        # 控制台管理用户名和密码
        login-username: druid
        login-password: druid
      filter:
        stat:
          enabled: true
          # 慢SQL记录(控制慢查询sql语句显示为红色提醒)
          log-slow-sql: true
          slow-sql-millis: 1000
          merge-sql: true
        wall:
          config:
            multi-statement-allow: true
全局配置文件mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
</configuration>
MybatisConfig配置类(用于扫描mapper接口包)
@Configuration
@MapperScan("com.yaorange.mapper")
public class MyBatisConfig {
}

公共类包

返回结果以及常量
public interface CommonConstant {
    /**
     * {@code 500 Server Error} (HTTP/1.0 - RFC 1945)
     */
    Integer SC_INTERNAL_SERVER_ERROR_500 = 500;
    /**
     * {@code 200 OK} (HTTP/1.0 - RFC 1945)
     */
    Integer SC_OK_200 = 2000;

    String ERROR_MSG = "操作失败";
    String OK_MSG = "操作成功";
    String LOGIN_ERROR_MSG = "用户名或密码错误";
}
@Data
public class PageInfo<T> {
    /**
     * 当前页
     */
    private int pageNum;
    /**
     * 每页的数量
     */
    private int pageSize;
    /**
     * 总记录数
     */
    protected long total;
    /**
     * 结果集
     */
    protected List<T> list;
    /**
     * 总页数
     */
    private int pages;
}

数据层

entity实体类
@Data
public class User implements Serializable {
    /**
     * 用户Id
     */
    private Integer userId;

    /**
     * 用户名
     */
    private String userName;

    /**
     * 用户状态
     */
    private Integer userState;

    /**
     * 用户详情id
     */
    private UserInfo userInfo;

    private static final long serialVersionUID = 1L;
}
@Data
public class UserInfo implements Serializable {
    /**
     * 用户详情id
     */
    private Integer infoId;

    /**
     * 家庭住址
     */
    private String address;

    private static final long serialVersionUID = 1L;
}

mapper接口
public interface UserMapper {
    /**查询用户列表*/
    List<User> selectList();

    /**查询总记录数*/
    int countTotal();

    /**分页查询数据*/
    List<User> selectPage(@Param("start") int start,
                          @Param("pageSize") Integer pageSize);
    /**通过Id查询用户信息*/
    User selectUserById(Integer userId);

    /**添加用户信息*/
    int insert(User user);

    /**批量删除用户*/
    int deleteUsers(Integer[] ids);
}

mapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yaorange.mapper.UserMapper">

    <resultMap id="BaseResultMap" type="com.yaorange.entity.User">
            <id property="userId" column="user_id" jdbcType="INTEGER"/>
            <result property="userName" column="user_name" jdbcType="VARCHAR"/>
            <result property="userState" column="user_state" jdbcType="VARCHAR"/>
    </resultMap>
    <resultMap id="User_UserInfo" type="com.yaorange.entity.User" extends="BaseResultMap">
        <association property="userInfo" javaType="com.yaorange.entity.UserInfo">
            <id property="infoId" column="user_info_id" jdbcType="INTEGER"/>
            <result property="address" column="address" jdbcType="VARCHAR"/>
        </association>
    </resultMap>

    <sql id="Base_Column_List">
        user_id,user_name,user_state,
        user_info_id
    </sql>
    <insert id="insert" parameterType="com.yaorange.entity.User">
        INSERT INTO `ssm`.`user`( `user_name`, `user_state`, `user_info_id`)
        VALUES ( #{userName}, #{userState}, #{userInfo.infoId});

    </insert>
    <delete id="deleteUsers">
        update user set user.user_state=1
        <where>
            user_id in
            <foreach collection="array" separator="," open="(" close=")" item="e">
                #{e}
            </foreach>
        </where>

    </delete>
    <select id="selectList" resultMap="User_UserInfo">
        SELECT
            u.user_id,
            u.user_name,
            u.user_state,
            u.user_info_id,
            i.address
        FROM
            user AS u left join
            user_info AS i
            on u.user_info_id=i.info_id
        where u.user_state=0
    </select>
    <select id="countTotal" resultType="java.lang.Integer">
        select Count(*) from user where user_state=0
    </select>
    <select id="selectPage" resultMap="User_UserInfo">
        SELECT
            u.user_id,
            u.user_name,
            u.user_state,
            u.user_info_id,
            i.address
        FROM
            user AS u left join
            user_info AS i
            on u.user_info_id=i.info_id
        where u.user_state=0
        limit #{start},#{pageSize}
    </select>
    <select id="selectUserById" resultMap="User_UserInfo">
        SELECT
            u.user_id,
            u.user_name,
            u.user_state,
            u.user_info_id,
            i.address
        FROM
            user AS u left join
            user_info AS i
            on u.user_info_id=i.info_id
        where u.user_state=0
          and u.user_id=#{userId}
    </select>

</mapper>

业务层

业务层接口
public interface UserService {
    /**查询用户列表数据*/
    List<User> selectList();

    /**分页查询用户数据*/
    PageInfo<User> page(Integer pageNum, Integer pageSize);

    User selectUserById(Integer userId);

    int insertUser(User user);

    int deleteUsers(Integer[] ids);
}
业务层实现类
@Service
@Transactional(rollbackFor = Exception.class)
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;

    @Override
    public List<User> selectList() {
        return userMapper.selectList();
    }

    @Override
    public PageInfo<User> page(Integer pageNum, Integer pageSize) {
        //查询总条数
        int total=userMapper.countTotal();
        //总页数
        int pages=total%pageSize==0?total/pageSize:total/pageSize+1;
        //起始页
        int start=(pageNum-1)*pageSize;
        List<User> userList=userMapper.selectPage(start,pageSize);
        PageInfo<User> userPageInfo = new PageInfo<>();
        userPageInfo.setPageNum(pageNum);
        userPageInfo.setPageSize(pageSize);
        userPageInfo.setTotal(total);
        userPageInfo.setList(userList);
        userPageInfo.setPages(pages);
        return userPageInfo;
    }

    @Override
    public User selectUserById(Integer userId) {
        return userMapper.selectUserById(userId);
    }

    @Override
    public int insertUser(User user) {
        return userMapper.insert(user);
    }

    @Override
    public int deleteUsers(Integer[] ids) {
        return userMapper.deleteUsers(ids);
    }

}

控制层

@Controller
@ResponseBody
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;
    @RequestMapping(value="/list",method = RequestMethod.GET)
    public Result<?> list(){
       List<User> userList =userService.selectList();
       return Result.ok(userList);
    }
    @RequestMapping(value = "/page",method = RequestMethod.GET)
    public Result<?> page(@RequestParam(defaultValue = "1") Integer pageNum,
                          @RequestParam(defaultValue = "3") Integer pageSize){
        PageInfo<User> userPageInfo=userService.page(pageNum,pageSize);
        return Result.ok(userPageInfo);
    }

    @RequestMapping(method = RequestMethod.GET)
    public Result<?> selectUserById(@RequestParam Integer userId){
        User user=userService.selectUserById(userId);
        return Result.ok(user);
    }
    @RequestMapping(value="/add",method = RequestMethod.POST)
    public Result<?> addUser(@RequestBody  User user){
      int row=userService.insertUser(user);
      if(row>0){
          return Result.ok(CommonConstant.OK_MSG);
      }
      return Result.error(CommonConstant.ERROR_MSG);
    }
    @RequestMapping(value="/batchDelete",method=RequestMethod.POST)
    public Result<?> deleteUsers(@RequestBody Integer ids[]){
        int rows=userService.deleteUsers(ids);
        if(rows>0){
            return Result.ok(CommonConstant.OK_MSG);
        }
        return Result.error(CommonConstant.ERROR_MSG);
    }
}

数据层测试代码

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserServiceImplTest {

    @Autowired
    private UserService userService;
    @Test
    public void selectList() {
        List<User> users = userService.selectList();
        users.stream().forEach(System.out::println);
    }

    @Test
    public void page() {
        PageInfo<User> pageList = userService.page(1, 10);
        System.out.println(pageList);
    }

    @Test
    public void selectUserById() {
        User user = userService.selectUserById(2);
        System.out.println(user);
    }

    @Test
    public void insertUser() {
        User user = new User();
        user.setUserName("陈六");
        user.setUserState(1);
        UserInfo userInfo = new UserInfo();
        userInfo.setInfoId(2);
        user.setUserInfo(userInfo);

        int i = userService.insertUser(user);
        System.out.println(i);
    }

    @Test
    public void deleteUsers() {
        Integer[] ids={1,5};
        int i = userService.deleteUsers(ids);
        System.out.println(i);
    }
}

Postman测试结果

批量删除

查询用户列表

根据id查用户

添加用户

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

自动弹性,QPS线性提升|一文读懂云原生数仓AnalyticDB弹性技术原理

前言 在全球经济增长放缓的大背景之下&#xff0c;企业在加强数字化建设的过程中&#xff0c;实现效益最大化成为一个绕不开的话题。阿里云瑶池旗下的云原生数仓AnalyticDB MySQL湖仓版&#xff08;以下简称AnalyticDB MySQL&#xff09;在发布之初提供了定时弹性功能&#xf…

本地读取Excel文件并进行数据压缩传递到服务器

在项目开发过程中&#xff0c;读取excel文件&#xff0c;可能存在几百或几百万条数据内容&#xff0c;那么对于大型文件来说&#xff0c;我们应该如何思考对于大型文件的读取操作以及性能的注意事项。 类库&#xff1a;Papa Parse - Powerful CSV Parser for JavaScript 第一步…

漏洞复现-SpringBlade export-user SQL 注入漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

什么是ORM?

ORM&#xff08;Object-Relational Mapping&#xff0c;对象关系映射&#xff09;是一种编程技术&#xff0c;它的目标是实现面向对象编程语言与关系型数据库之间的数据映射和转换。ORM系统允许开发人员使用面向对象的方式来操作数据库&#xff0c;而无需直接编写复杂的SQL查询…

Cesium叠加超图二维服务、三维场景模型

前言 Cesium作为开源的库要加超图的服务则需要适配层去桥接超图与Cesium的数据格式。这个工作iClient系列已经做好&#xff0c;相比用过超图二维的道友们可以理解&#xff1a;要用Openlayer加载超图二维&#xff0c;那就用iClient for Openlayer库去加载&#xff1b;同样的要用…

mac自带录屏

1、打开 快捷键&#xff1a;Shift Command5 可以在指定存储位置 2、结束 快捷键&#xff1a; CommandControlEsc&#xff08;也可以点击顶部工具栏的结束按钮&#xff09;

图像数据增广

目录 一、常用的图像增广方法 1、随机翻转 2、随机裁剪 3、随机颜色变换 二、图像代码实现 1、定义图像显示辅助函数 2、随机翻转 3、随机裁剪 4、随机颜色变换 5、结合多种图像增广方法 三、使用图像增广进行训练 1、下载数据集 2、读取图像并增广 3、多GPU训练 …

麦芯(MachCore)应用开发教程2 --- 时序

黄国强 2024/01/22 正如计算机的本质是状态机一样&#xff0c;设备也是一个状态机。笔者之前文章“什么是时序”用 switch/case 实现了状态机。在麦芯中&#xff0c;我们用Lambda实现了状态机。相对于switch/case&#xff0c;Lambda更优雅&#xff0c;更符合面向对象。先上代码…

单元化(Set)架构设计详解:异地多活、突破扩展上限的优选方案

文章目录 一、单元化架构基础1、扩展性&#xff08;Scalability&#xff09;概述2、扩展性 - 横向扩展&#xff08;Horizontal Scale&#xff09;3、扩展性 - 纵向扩展&#xff08;Vertical Scale&#xff09;4、扩展性 - 扩展魔方5、一致性 - 数据库事务一致性&#xff08;ACI…

【中文版ChatGPT4.0!国内可直接用】

中文版ChatGPT4.0&#xff01;国内可直接用 文心一言微软Copilot迅捷AI写作 在国内使用ChatGPT 4.0可能需要支付每月20美元的费用&#xff0c;约合人民币145元。如果不愿意付费&#xff0c;也可以考虑使用其他免费的AI工具。 目前有许多公司在研发出色的AI大模型&#xff0c;这…

Python进阶-Anaconda使用总结

本文是 Anaconda 的使用总结&#xff0c;旨在帮助用户快速搭建 Python 环境、进行数据科学和机器学习工作。首先&#xff0c;介绍了在 Windows 系统上安装 Anaconda 的步骤&#xff0c;包括下载安装程序、配置环境变量以及验证安装。随后&#xff0c;详细列举了 Anaconda 的常用…

新版AndroidStudio dependencyResolutionManagement出错

在新版AndroidStudio中想像使用4.2版本或者4.3版本的AndroidStudio来构造项目&#xff1f;那下面这些坑我们就需要来避免了&#xff0c;否则会出各种各样的问题。 一.我们先来看看新旧两个版本的不同。 1.jdk版本的不同 新版默认是jdk17 旧版默认是jdk8 所以在新版AndroidSt…

processing集训day03

编程英语 load 加载 image 图像 hawthorn 山楂 true 真 false 假 if 如果 distance 距离 collision 碰 图片显示 显示图片步骤&#xff1a; 1、准备好图片 2、定义图片变量 3、载入图片至变量 4、进行图片显示 Processing 所支持的图片格式有很多&#xff0c;常见的有…

全栈没有那么难!15 分钟搞明白 Express.js

Express 是老牌的 Node.js 框架&#xff0c;以简单和轻量著称&#xff0c;几行代码就可以启动一个 HTTP 服务器。市面上主流的 Node.js 框架&#xff0c;如 Egg.js、Nest.js 等都与 Express 息息相关。 Express 框架使用标准 Node.js 语法&#xff0c;主要由以下 3 个核心部分…

Elasticsearch8使用统一的CA为HTTP层更新证书

官方文档参考&#xff1a; Update certificates with the same CA | Elasticsearch Guide [8.10] | Elastic 使用统一的CA为HTTP层更新证书&#xff0c;包括3部分&#xff1a;在ES集群内某个节点上生成证书&#xff1b;将生成的证书拷贝给集群内其他节点&#xff1b;更新kiban…

大模型相关学习资料整理

1. 核心2框架 1. semantic-kernel【微软】 https://learn.microsoft.com/en-us/semantic-kernel/overview/ 2. LangChain https://www.langchain.asia/ https://python.langchain.com/docs/get_started/introduction 2. 技术点 1. Function Call https://platform.opena…

Dell戴尔XPS 8930笔记本电脑原装Win10系统 恢复出厂预装OEM系统

链接&#xff1a;https://pan.baidu.com/s/1eaTQeX-LnPJwWt3fBJD8lg?pwdajy2 提取码&#xff1a;ajy2 原厂系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、系统属性专属LOGO标志、Office办公软件、MyDell等预装程序 文件格式&#xff1a;esd/wim/swm 安装方式&am…

11- OpenCV:自定义线性滤波(卷积,卷积边缘)

目录 一、卷积 1、卷积概念 2、卷积如何工作 3、常见算子&#xff08;卷积核 Kenel&#xff09; 4、自定义卷积模糊 5、代码演示 二、卷积边缘 1、卷积边缘问题 2、处理边缘 3、相关的API说明 4、代码演示 一、卷积 1、卷积概念 &#xff08;1&#xff09;在OpenC…

Recommender Systems with Generative Retrieval

TLDR: 本文提出一种新的生成式检索推荐系统范式TIGER。当前基于大规模检索模型的现代推荐系统&#xff0c;一般由两个阶段的流程实现&#xff1a;训练双编码器模型得到在同一空间中query和候选item的embedding&#xff0c;然后通过近似最近邻搜索来检索出给定query的embedding的…

DBA技术栈MongoDB: 数据增改删除

该博文主要介绍mongoDB对文档数据的增加、更新、删除操作。 1.插入数据 以下案例演示了插入单个文档、多个文档、指定_id、指定多个索引以及插入大量文档的情况。在实际使用中&#xff0c;根据需求选择适合的插入方式。 案例1&#xff1a;插入单个文档 db.visitor.insert({…