基于SpringBoot的SSM整合案例

news2024/10/1 3:33:29

项目目录:

数据库表以及表结构

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查用户

添加用户

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

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

相关文章

LINUX文件fd(file descriptor)文件描述符

目录 1.文件接口 1.1open 1.2C语言为什么要对open进行封装 2.fd demo代码 第一个问题 第二个问题 打开文件流程 引言&#xff1a;在学习C语言的时候&#xff0c;我们见过很多的文件的接口&#xff0c;例如fopen&#xff0c;fwrite&#xff0c;fclose等等&#xff0c;但…

Mac NTFS 磁盘读写工具选哪个好?Tuxera 还是 Paragon?

在使用 Mac 电脑时&#xff0c;我们经常需要读写 NTFS 格式的硬盘或 U 盘。然而&#xff0c;由于 Mac 系统不支持 NTFS 格式的读写&#xff0c;因此我们需要借助第三方工具来实现这个功能。而在市场上&#xff0c;Tuxera 和 Paragon 是两款备受推崇的 Mac NTFS 磁盘读写工具。那…

CPMS靶场练习

关键&#xff1a;找到文件上传点&#xff0c;分析对方验证的手段 首先查看前端发现没有任何上传的位置&#xff0c;找到网站的后台&#xff0c;通过弱口令admin 123456可以进入 通过查看网站内容发现只有文章列表可以进行文件上传&#xff1b;有两个图片上传点 图片验证很严格…

HCIP-BGP选路实验

一.实验拓扑图 二.详细配置 R1 interface GigabitEthernet0/0/0 ip address 12.1.1.1 255.255.255.0interface LoopBack0 ip address 1.1.1.1 255.255.255.0interface LoopBack1 ip address 10.1.1.1 255.255.255.0bgp 1 router-id 1.1.1.1 peer 12.1.1.2 as-number 2ipv4-fa…

websocket实现聊天室(vue2 + node)

通过websocket实现简单的聊天室功能 需求分析如图&#xff1a; 搭建的项目结构如图&#xff1a; 前端步骤&#xff1a; vue create socket_demo (创建项目)views下面建立Home , Login组件路由里面配置路径Home组件内部开启websocket连接 前端相关组件代码&#xff1a; Login…

CVE重要通用漏洞复现java phpCVE-2021-44228

在进行漏洞复现之前我们需要在linux虚拟机上进行docker的安装 我不喜欢win上安因为不知道为什么总是和我的vmware冲突 然后我的kali内核版本太低 我需要重新安装一个新的linux 并且配置网络 我相信这会话费我不少时间 查看版本 uname -a 需要5.5或以上的版本 看错了浪…

微信小程序-03

小程序官方把 API 分为了如下 3 大类&#xff1a; 事件监听 API 特点&#xff1a;以 on 开头&#xff0c;用来监听某些事件的触发 举例&#xff1a;wx.onWindowResize(function callback) 监听窗口尺寸变化的事件 同步 API 特点1&#xff1a;以 Sync 结尾的 API 都是同步 API 特…

使用多进程库计算科学数据时出现内存错误

问题背景 我经常使用爬虫来做数据抓取&#xff0c;多线程爬虫方案是必不可少的&#xff0c;正如我在使用 Python 进行科学计算时&#xff0c;需要处理大量存储在 CSV 文件中的数据。由于每个处理过程需要很长时间才能完成&#xff0c;而您拥有多核处理器&#xff0c;所以您尝试…

SpringBoot教务管理源码

技术框架&#xff1a; springboot mybatis layui shiro jquery react 运行环境&#xff1a; jdk8 mysql5.7 IntelliJ IDEA maven nginx 系统介绍&#xff1a; 教务管理系统是一个基于网络的在线管理平台 , 帮助学校管理教务系统&#xff0c; 用一个账号解决学校教…

聪明的小羊肖恩(双指针)

题目 import java.util.Arrays; import java.util.Scanner;public class Main {public static long calc(long[] num,int max) { int l 0;int r num.length-1;long res 0;while(l<r) {while(l<r && num[l]num[r]>max) {r--;}res(r-l);l;}return res;}pub…

LeetCode---380周赛

题目列表 3005. 最大频率元素计数 3006. 找出数组中的美丽下标 I 3007. 价值和小于等于 K 的最大数字 3008. 找出数组中的美丽下标 II 一、最大频率元素计数 这题就是个简单的计数题&#xff0c;正常遍历统计数据即可&#xff0c;关键是你要会写代码逻辑。 代码如下&…

CocoaPods的安装和使用

前言 本篇文章讲述CocoaPods的安装和使用 安装cocoaPods 如果电脑没有安装过cocoaPods&#xff0c;需要先安装&#xff0c;使用下面的命令&#xff1a; sudo gem install cocoapods输入密码后开始安装&#xff0c;需要等待。。。但是我这里报错了。 The last version of d…

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

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

被施工现场折磨哭的我,真后悔没早点用这个方法!

在当今数字化时代&#xff0c;智慧工地的概念越来越受到重视。通过整合先进的技术和创新的解决方案&#xff0c;智慧工地不仅提高了工程施工效率&#xff0c;还加强了安全管理和资源利用。 客户案例一 广州某建筑公司在项目中部署了泛地缘科技推出的智慧工地大数据平台&#x…

ORB-SLAM 论文阅读

论文链接 ORB-SLAM 0. Abstract 本文提出了 ORB-SLAM&#xff0c;一种基于特征的单目同步定位和建图 (SLAM) 系统该系统对严重的运动杂波具有鲁棒性&#xff0c;允许宽基线环路闭合和重新定位&#xff0c;并包括全自动初始化选择重建的点和关键帧的适者生存策略具有出色的鲁棒…

浅谈大数据智能化技术在多个领域的应用实践

摘要 大数据智能化技术在当今信息社会中得到了广泛的应用。从金融、互联网电商、视频行业到垂直短视频领域&#xff0c;从工业互联网到云计算、边缘计算等领域&#xff0c;大数据智能化技术已经成为了企业竞争力的重要组成部分。技术实践、架构设计、指标体系、数据质量、数据分…

系统架构设计师教程(十二)信息系统架构设计理论与实践

信息系统架构设计理论与实践 12.1 信息系统架构基本概念及发展12.1.1 信息系统架构的概述12.1.2 信息系统架构的发展12.1.3 信息系统架构的定义 12.2 信息系统架构12.2.1 架构风格12.2.2 信息系统架构分类12.2.3 信息系统架构的一般原理12.2.4 信息系统常用4种架构模型12.2.5 企…

【Java】IDEA集成开发环境工具切换JDK和设置环境变量

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《Java》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握…

php基础学习之常量

php常量的基本概念 常量是在程序运行中的一种不可改变的量&#xff08;数据&#xff09;&#xff0c;常量一旦定义&#xff0c;通常不可改变&#xff08;用户级别&#xff09;。 php常量的定义形式 使用define函数&#xff1a;define("常量名字", 常量值);使用cons…

自定义注解与拦截器实现不规范sql拦截(自定义注解填充插件篇)

在自定义注解与拦截器实现不规范sql拦截&#xff08;拦截器实现篇&#xff09;中提到过&#xff0c;写了一个idea插件来辅助对Mapper接口中的方法添加自定义注解&#xff0c;这边记录一下插件的实现。 需求简介 在上一篇中&#xff0c;定义了一个自定义注解对需要经过where判…