SpringBoot SSMP项目搭建保姆级教程

news2024/11/19 17:24:30

一、SpringBoot项目创建

  1. Idea中创建New Project,选择Spring Initializr,输入Name、Location、JDK等,下一步。
    在这里插入图片描述
  2. 选择合适的 SpringBoot 版本,点击创建。
    在这里插入图片描述
    此时,SpringBoot基础项目已经创建完毕。

二、Entity 开发

  1. 引入 lombok org.projectlombok。Lombok,一个Java类库,提供了一组注解,简化POJO实体类开发,SpringBoot目前默认集成了lombok技术,并提供了对应的版本控制,所以只需要提供对应的坐标即可,在pom.xml中添加lombok的坐标。

            <!--lombok-->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
            </dependency>
    
  2. 创建 entity 目录,在其包下创建对应Entity。 由于已经引入 lombok,实体类上可直接使用 @Data 注解。使用lombok可以通过一个注解@Data 完成一个实体类对应的getter,setter,toString,equals,hashCode等操作的快速添加。

    package com.ty.entity;
    
    import lombok.Data;
    
    @Data
    public class User {
    
        private Integer id;
    
        private String name;
    
        private Integer age;
    
    }
    
    

三、DAO 开发

1、参数配置与Dao创建

  1. 导入MyBatisPlus 对应的starter mybatis-plus-boot-starter 与 mysql 驱动 mysql-connector-java

            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>3.4.3</version>
            </dependency>
    
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.27</version>
                <scope>runtime</scope>
            </dependency>
    
  2. 创建对应mapper包,并创建 DemoMapper接口,由于使用MyBatisPlus技术,使用MP的标准通用接口BaseMapper加速开发,并添加注解 @Mapper 和泛型的指定。

    package com.ty.mapper;
    
    import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    import com.ty.entity.User;
    import org.apache.ibatis.annotations.Mapper;
    
    @Mapper
    public interface DemoMapper extends BaseMapper<User> {
    }
    

    接口BaseMapper中默认提供了各种增删改查常用方法,继承后即可直接使用。
    在这里插入图片描述

  3. application.yml 配置文件中,配置数据库连接相关的数据源配置

    id-type: auto : 设置主键id字段的生成策略为参照数据库设定的策略,当前数据库设置id生成策略为自增。

    table-prefix: XX:设置表名通用前缀。

    spring:
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/ty
        username: root
        password: 123
    
    mybatis-plus:
      global-config:
        db-config:
          table-prefix: tbl_    #设置表名通用前缀
          id-type: auto     #设置主键id字段的生成策略为参照数据库设定的策略,当前数据库设置id生成策略为自增
      configuration:
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl   #输出MP运行日志
    

    mybatisplus提供了通过配置的形式就可以查阅执行期SQL语句,配置 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl 会将生成 SQL与执行结果输出到控制台,也可选择其提供的各种输出方式。
    在这里插入图片描述

  4. 创建对应dao包,注入之前创建的demoMapper,即可直接使用MyBatisPlus自带的增删改查。

package com.ty.dao;

import com.ty.entity.User;
import com.ty.mapper.DemoMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
public class DemoDao {

    @Autowired
    private DemoMapper demoMapper;

    public void deleteUserById(Integer id){
        demoMapper.deleteById(id);
    }

    public void updateUser(User user){
        demoMapper.updateById(user);
    }
}

2、分页查询

Mybatis Plus提供了 selectPage 等分页查询方法。其中selectPage方法需传入一个由MybatisPlus封装分页数据的对象,可以通过new的形式创建这个对象 IPage page = new Page(pageNo, pageSize)

在这里插入图片描述
创建 dao包,随后创建 DemoDao 。

package com.ty.dao;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ty.entity.User;
import com.ty.mapper.DemoMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class DemoDao {

    @Autowired
    private DemoMapper demoMapper;

    public IPage selectUserByPage(Integer currentPage, Integer pageSize) {
        IPage page = new Page(currentPage,pageSize);
        return demoMapper.selectPage(page, null);
    }
    
    public void deleteUserById(Integer id){
        demoMapper.deleteById(id);
    }

    public void updateUser(User user){
        demoMapper.updateById(user);
    }
}

但对于MySQL,分页使用 limit,但其他数据库却不使用 limit。为提升 mybatis plus的兼容性,故将分页操作进行了拦截器形式优化。

定义mybatis plus 拦截器:
创建 Interceptor 包,并创建 MybatisPlusInterceptor 拦截器栈。

package com.ty.interceptor;

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MybatisPlusInterceptorConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return mybatisPlusInterceptor;
    }

}

通过测试类进行验证,此时分页查询已经生效。

在这里插入图片描述

总结

  • 使用IPage封装分页数据
  • 分页操作依赖MyBatisPlus分页拦截器实现功能
  • 借助MyBatisPlus日志查阅执行SQL语句

3、条件查询

以往我们写条件查询要自己动态拼写复杂的SQL语句,而 mybatis plus 提供有强大的条件查询功能。

  • 通过一个用于封装查询条件的对象QueryWrapper ,该对象可以动态使用API调用的方法添加条件,最终转化成对应的SQL语句。
  • 针对字段检查,mybatis plus 全面支持Lambda表达式,可代替QueryWrapper ,使用LambdaQueryWrapper对象。
  • 为了便于开发者动态拼写SQL,防止将null数据作为条件使用,userLambdaQueryWrapper.like(boolean condition, R column, Object val) 第一个参数Condition 可作为判空验证。
package com.ty.dao;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ty.entity.User;
import com.ty.mapper.DemoMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
public class DemoDao {

    @Autowired
    private DemoMapper demoMapper;

    public IPage selectUserByPage(Integer currentPage, Integer pageSize) {
        IPage page = new Page(currentPage,pageSize);
        return demoMapper.selectPage(page, null);
    }

    public List<User> selectUserByName(String name) {
        LambdaQueryWrapper<User> userLambdaQueryWrapper = new LambdaQueryWrapper<>();
        userLambdaQueryWrapper.like(User::getName, name);
        userLambdaQueryWrapper.like(name != null, User::getName, name);
        return demoMapper.selectList(userLambdaQueryWrapper);
    }
    
    public void deleteUserById(Integer id){
        demoMapper.deleteById(id);
    }

    public void updateUser(User user){
        demoMapper.updateById(user);
    }
    
    public void insertUser(User user){
        demoMapper.insert(user);
    }
}

通过测试类进行验证,即可直接进行条件查询。

package com.ty;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ty.dao.DemoDaoImpl;
import com.ty.entity.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest
class SpringbootSsmpDemoApplicationTests {

    @Autowired
    private DemoDaoImpl demoDao;
    @Test
    void selectUserByNameTest() {
        List<User> ty = demoDao.selectUserByName("ty");
        System.out.println(ty);
    }
}

在这里插入图片描述

四、Service 开发

创建service包,创建 UserService接口与其对应的UserServiceImpl实现类。其中编写业务逻辑,没啥过多可说的。
注意使用 @Service 注解,将其加入 SpringBoot bean容器中。

在这里插入图片描述

package com.ty.service.impl;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ty.dao.DemoDao;
import com.ty.entity.User;
import com.ty.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private DemoDao demoDao;

    public List<User> queryUserByName(String name){
        return demoDao.selectUserByName(name);
    }

    public IPage queryUserByPage(Integer pageNo, Integer pageSize){
        return demoDao.selectUserByPage(pageNo, pageSize);
    }

    public void deleteUserById(Integer id){
        demoDao.deleteUserById(id);
    }

    public void updateUser(User user){
        demoDao.updateUser(user);
    }
    
    public void insertUser(User user){
        demoDao.insertUser(user);
    }
}

五、Controller 开发

继续创建 controller 包,创建基本的Controller实现类。

注意引入 @RestController@RequestMapping("/user") 注解,将该Controller注入 Springboot bean容器中,并设置通用访问 url 为 /user

package com.ty.controller;

import com.ty.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

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

    @Autowired
    private UserService userService;
    
}

Restful接口开发

修改使用 @PutMapping,Post请求使用 @PostMapping, 删除使用 @DeleteMapping,Get请求使用 @GetMapping

package com.ty.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ty.entity.User;
import com.ty.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

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

    @Autowired
    private UserService userService;

    @GetMapping("{name}")
    public List<User> getUserById(@PathVariable String name){
        return userService.queryUserByName(name);
    }

    @DeleteMapping("{id}")
    public void deleteUserById(@PathVariable Integer id){
        userService.deleteUserById(id);
    }
    
    /**
     * GET请求传递路径变量,后台实用@PathVariable接收数据**
     * @param pageNo
     * @param pageSize
     * @return
     */
    @GetMapping("{pageNo}/{pageSize}")
    public IPage<User> getUserByPage(@PathVariable Integer pageNo,@PathVariable Integer pageSize){
        return userService.queryUserByPage(pageNo, pageSize);
    }

    @PutMapping
    public void updateUser(@RequestBody User user){
        userService.updateUser(user);
    }
    
    /**
     * 实体数据:@RequestBody
     * @param user
     */
    @PostMapping
    public void addUser(@RequestBody User user){
        userService.insertUser(user);
    }
}

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

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

相关文章

【AIFEM案例教程】压力容器热固耦合分析

AIFEM是由天洑自主研发的一款通用的智能结构仿真软件&#xff0c;助力用户解决固体结构相关的静力学、动力学、振动、热力学等实际工程问题&#xff0c;软件提供高效的前后处理工具和高精度的有限元求解器&#xff0c;帮助用户快速、深入地评估结构的力学性能&#xff0c;加速产…

天锐绿盾公司终端文件数据、资料防泄密系统——自动智能透明加密保护核心数据防止外泄软件

天锐绿盾公司终端文件数据防泄密系统采用高强度加密算法&#xff0c;对各种类型的文件进行实时、强制、透明的加解密。 该系统具有以下特点&#xff1a; 稳定性高&#xff1a;天锐绿盾文档透明加密安全系统是酷卫士电子文档安全管理平台的一个重要功能模块&#xff0c;性能稳定…

如何快速批量修改多个视频的MD5值?

在日常工作和生活中&#xff0c;我们经常需要处理大量的视频文件。有时候&#xff0c;我们需要修改这些视频文件的MD5值来满足某些需求。手动修改每个视频的MD5值是一项繁琐且容易出错的任务。幸运的是&#xff0c;有一种方法可以快速批量修改多个视频的MD5值&#xff0c;以下是…

[MySQL]BLOB/TEXT column ‘xxx‘ used in key specification without a key length

报错信息&#xff1a; SQLSTATE[42000]: Syntax error or access violation: 1170 BLOB/TEXT column xxx used in key specification without a key length 原因&#xff1a; MySQL的唯一索引不支持text类型的字段&#xff01;

Vue3开始

1. Vue3简介 2020年9月18日&#xff0c;Vue.js发布版3.0版本&#xff0c;代号&#xff1a;One Piece&#xff08;海贼王&#xff09; 经历了&#xff1a;4800次提交、40个RFC、600次PR、300贡献者 官方发版地址&#xff1a;Release v3.0.0 One Piece vuejs/core 截止2023年…

网站防护的多种方案,如何让网站坚不可破

越权问题 问题叙述&#xff1a;存在权限管理不当的问题&#xff0c;导致用户可以越权访问资源。 改动提议&#xff1a;强化用户权限认证机制。 留意&#xff1a;通常&#xff0c;这种问题涉及到不同权限用户之间的资源访问&#xff0c;如浏览历史、cookie&#xff0c;以及标识…

软考公告 | 2023下半年软考模拟练习平台上线

软考办官方2023年下半年计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试模拟练习平台已开通&#xff0c;各位考生可于2023年10月16日-11月3日登录免费模拟练习。 模拟地址&#xff1a; https://bm.ruankao.org.cn/sign/welcome 01 软考模拟系统 大家可以登录…

FPGA纯verilog实现RIFFA的PCIE通信,提供工程源码和软件驱动

目录 1、前言免责声明 2、我已有的PCIE方案3、RIFFA简介RIFFA概述RIFFA架构RIFFA驱动RIFFA方案的局限性 4、RIFFA 源码详解用户接口 5、vivado工程详解6、工程移植说明vivado版本不一致处理FPGA型号不一致处理其他注意事项 7、上板调试验证并演示8、福利&#xff1a;工程代码的…

滴滴弹性云基于 K8S 的调度实践

上篇文章详细介绍了弹性云混部的落地历程&#xff0c;弹性云是滴滴内部提供给网约车等核心服务的容器平台&#xff0c;其基于 k8s 实现了对海量 node 的管理和 pod 的调度。本文重点介绍弹性云的调度能力&#xff0c;分为以下部分&#xff1a; 调度链路图&#xff1a;介绍当前弹…

【数据结构】Java对象的比较

作者主页&#xff1a;paper jie_博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《JAVA数据结构》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精力…

Swift 周报 第三十九期

文章目录 前言新闻和社区卖不动了 iPhone 在美国市场销量或陷入停滞与 Apple 专家会面交流 提案通过的提案 Swift论坛推荐博文话题讨论关于我们 前言 本期是 Swift 编辑组整理周报的第三十九期&#xff0c;每个模块已初步成型。各位读者如果有好的提议&#xff0c;欢迎在文末留…

C#根据ip获取地理位置信息的方法,史上最全

商业收费 百度地图高德地图腾讯地图纯真IP 开源免费 纯真ip免费版 以前可以直接下载&#xff0c;现在获取ip数据库的方式改变了&#xff0c;自行官网查看把&#xff0c;个人或者学术研究&#xff0c;商用追责&#xff0c;商业用途慎用 using System.Collections.Generic; us…

亚马逊,shopee,lazada流量攻略:测评补单是提升排名不可或缺的利器

亚马逊卖家为什么一定要测评补单&#xff0c;今年不测评补单的卖家会很惨&#xff0c;不要抬杠&#xff0c;听完林哥给你分析&#xff0c;如果你感觉不对在抬杠不迟 1.亚马逊的广告成本越来越贵而且单纯靠砸广告做排名&#xff0c;你是不是发现广告一停排名就往下掉&#xff0…

求臻医学:实体肿瘤FDA/NMPA新获批抗癌药物/适应症盘点

肿瘤分子靶向治疗发展迅速&#xff0c;随着研究的深入开展&#xff0c;多款靶向药物及免疫药物获批。求臻医学根据美国食品药品监督管理局&#xff08;FDA&#xff09;公布信息、中国国家药品监督管理局&#xff08;NMPA&#xff09;发布的药品批准证明文件&#xff0c;以及各公…

[esp32]Micorpython进行PWM

通过wokwi进行模拟PWM from machine import PWM,ADC,Pin import time led_blue1PWM(Pin(2),freq1000)#把GPIO2定义为PWM输出&#xff0c;脉冲频率为1秒1000个 led_blue1.duty(1023) btn1Pin(35) liangdu0 while(1):if(btn1.value()0):#有按钮按下time.sleep(1) #延时1秒liang…

视频标注的两个主要方法

视频标注技术 单一图像法 在自动化工具面世之前&#xff0c;视频标注效率不高。各公司使用单一图像法提取视频中的所有帧&#xff0c;然后使用标准图像标注技术将它们作为图像来标注。在30fps的视频中&#xff0c;每分钟有1800帧。这个过程没有利用视频标注的优势&#xff0c;…

性能测试 —— 通过Jmeter压测存储过程!

一、存储过程准备&#xff1a; 1、建立一个空表&#xff1a; 1 CREATE TABLE test_data ( id NUMBER, name VARCHAR2(50), age NUMBER ); 2、建立一个存储过程&#xff1a; 1 2 3 4 5 6 7 8 9 CREATE OR REPLACE PROCEDURE insert_test_data (n IN NUMBER) AS BEGIN --E…

苏州市发改委领导一行莅临蓝海彤翔集团调研考察

10月11日&#xff0c;苏州市发改委领导一行莅临蓝海彤翔集团考察调研未来产业发展与“四链融合“情况&#xff0c;集团副总裁张蓓丽接待了调研组一行。 张蓓丽首先对苏州发改委领导一行的到来表示热烈欢迎&#xff0c;并在集团一楼展厅就蓝海彤翔发展历程、产品研发、行业应用及…

vmware ESXi简易使用说明

单位弄了一台联想的啥服务器。具体啥配置我不太清楚&#xff0c;但是看上去高大上&#xff0c;实际上是远程做虚拟机操作的&#xff0c;具体咋回事我也不太清楚&#xff0c;但是简单用用总要会的吧&#xff0c;于是学习了一下&#xff0c;写个笔记。 首先用ip访问这台主机 用户…

ardupilot开发 --- 雷迅开发文档 篇

1. 数传 1.1 CUAV P8 Radio 规格 工作频率 840-845MHZ 工作温度 -40C~85C 极限距离&#xff1a;60km&#xff08;高增益玻璃钢天线无遮挡海边、理想环境&#xff09; 参考距离&#xff1a;40km&#xff08;地对空&#xff0c;郊区无遮挡&#xff09; 接线 串口连接 PixHack系列…