Springboot整合mybatis实现增删改查(crud)

SpringBoot整合Mybatis

今天我们来学习一个Springboot案例!!

那么什么是SpringBoot技术呢?

  • Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。
  • 该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。
  • Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。

SpringBoot有哪些特点:

(1)可以创建独立的Spring应用程序,并且基于其Maven或Gradle插件,可以创建可执行的JARs和WARs;

(2)内嵌Tomcat或Jetty等Servlet容器;

(3)提供自动配置的“starter”项目对象模型(POMS)以简化Maven配置;

(4)尽可能自动配置Spring容器;

(5)提供准备好的特性,如指标、健康检查和外部化配置;

(6)绝对没有代码生成,不需要XML配置

SpringBoot的核心功能有哪些?

  1. 独立运行:SpringBoot开发的应用可以以JRA包的形式独立运行,运行一个SpringBoot应用只需通过 java –jar xxxx.jar 来运行。
  2. 内嵌容器:SpringBoot内嵌了多个WEB容器,如:Tomcat、Jetty、Undertow,所以可以使用非WAR包形式进行项目部署;
  3. 自动starter依赖:SpringBoot提供了一系列的starter来简化Maven的依赖加载。starter是一组方便的依赖关系描述符,它将常用的依赖分组并将其合并到一个依赖中,这样就可以一次性将相关依赖添加到Maven或Gradle中;
  4. 自动配置:SpringBoot会根据在类路径中的JAR包和类,自动将类注入到SpringBoot的上下文中,极大地减少配置的使用;
  5. 应用监控:SpringBoot提供基于http、ssh、telnet的监控方式,对运行时的项目提供生产级别的服务监控和健康检测;
  6. 无代码生成/无需编写XML配置:SpringBoot不是借助于代码生成来实现的,而是通过条件注解来实现的,这是 Spring 4.x 提供的新特性。Spring4.x提倡使用Java配置和注解组合,无需编写任何xml配置即可实现Spring的所有配置功能;

该案例主要使用到的技术有:Springboot、mybatis,外加一个测试工具 Postman 或者 ApiPost都是可以的!http请求测试工具。

话不多说,开始整活!!!上代码。

特点:Springboot与SSM之间是类似的,并且Springboot没有减少代码,而是Springboot通过注解的形式帮我们封装了SSM的过程,简化了编写代码的量!
这里提供一个Springboot启动类中,@SpringBootApplication的源码分析链接!
文档链接: https://zhuanlan.zhihu.com/p/301063931

话不多说,开始整活!!!写代码。


1.创建数据库

首先,数据库–>创建一个数据库名称: goods
-- 创建数据库
create database goods ;
-- 进入 goods数据库
use goods ; 
创建表–>商品表:goods 和 类型表:type
CREATE TABLE `goods`  ( -- 商品表
  `id` int NOT NULL AUTO_INCREMENT,
  `goodsName` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_german2_ci NULL DEFAULT NULL,
  `goodsPrice` decimal(10, 2) NULL DEFAULT NULL,
  `goodsNum` int NULL DEFAULT NULL,
  `goodsType` int NULL DEFAULT NULL,
  `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_german2_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_german2_ci ROW_FORMAT = Dynamic;
-- 添加数据
INSERT INTO `goods` VALUES (1, '华为手机', 2500.00, 8, 1, '手机质量好');
INSERT INTO `goods` VALUES (2, '苹果', 15.00, 5, 2, '品质优,水分多而甜');
INSERT INTO `goods` VALUES (3, '苹果手机', 18000.00, 1, 1, '价格贵');
INSERT INTO `goods` VALUES (4, '华硕电脑', 8000.00, 1, 3, '高配置,性能强');
INSERT INTO `goods` VALUES (5, '格力空调', 2500.00, 1, 4, '格力空调,好品质,值得信赖');

CREATE TABLE `type`  ( -- 类型表
  `typeId` int NOT NULL AUTO_INCREMENT,
  `typeName` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_german2_ci NULL DEFAULT NULL,
  PRIMARY KEY (`typeId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_german2_ci ROW_FORMAT = Dynamic;
-- 添加数据
INSERT INTO `type` VALUES (1, '手机');
INSERT INTO `type` VALUES (2, '水果');
INSERT INTO `type` VALUES (3, '电脑');
INSERT INTO `type` VALUES (4, '电器');

2.idea创建项目

(1)进入创建项目查窗口

在这里插入图片描述##### (2)选择Springboot版本 和 所需要的依赖
在这里插入图片描述##### (3)创建完成后导入 mybatis依赖

<!--Springboot整合mybatis依赖包-->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.2.2</version>
</dependency>

3.创建三层架构 pojo、service和impl、mapper

在这里插入图片描述##### (1)实体类pojo ==> Goods

@Data
public class Goods {
  private long id;
  private String goodsName;
  private double goodsPrice;
  private long goodsNum;
  private String goodsType;
  private String remark;
}
(2)接口mapper ==> GoodsMapper 接口

编写mapper接口,并写入Spring管理注解(交由IoC管理)

@Mapper
public interface GoodsMapper {
    /**
     * 查询所有商品信息
     * @return
     */
    List<Goods> getGoodsList();
    
    /**
     * 添加商品信息
     * @param goods
     * @return
     */
    int addGoods(Goods goods);
    
    /**
     * 根据id删除商品信息
     * @param id
     * @return
     */
    int deleteGoodsById(@Param("id") Integer id);

    /**
     * 根据id查询商品信息
     * @param id
     * @return
     */
    Goods findGoodsById(@Param("id") Integer id);

    /**
     * 根据id修改商品信息
     * @param id
     * @return
     */
    int updateGoodsById(Goods goods);
}
(3)编写mapper的映射文件 GoodsMapper.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接口 -->
<mapper namespace="com.ithjc.mapper.GoodsMapper">
    <select id="getGoodsList" resultType="goods">
        select *
        from goods
    </select>

    <select id="findGoodsById" resultType="goods">
    select * from goods where id = #{id}
    </select>

    <insert id="addGoods" parameterType="goods">
        insert into goods (id,goodsName, goodsPrice, goodsNum, goodsType, remark)
        values (null,#{goodsName}, #{goodsPrice}, #{goodsNum}, #{goodsType}, #{remark});
    </insert>

    <delete id="deleteGoodsById" parameterType="java.lang.Integer">
        delete
        from goods
        where id = #{id};
    </delete>

    <update id="updateGoodsById" parameterType="goods">
        update goods
        <set>
            <if test="goodsName != null and goodsName != ''">
                goodsName = #{goodsName},
            </if>
           <if test="goodsPrice != null and goodsPrice != ''">
                goodsPrice = #{goodsPrice},
            </if>
            <if test="goodsType != null and goodsType != ''">
                goodsType = #{goodsType},
            </if>
             <if test="goodsNum != null and goodsNum != ''">
                goodsType = #{goodsType},
            </if>
             <if test="remark != null and remark != ''">
                remark = #{remark}
            </if>
        </set>
        where id = #{id};
    </update>
</mapper>
(4)service ==> GoodsService 和 实现接口 Impl ==>GoodsServiceImpl

首先是,GoodsService

public interface GoodsService {
    List<Goods> getGoodsList();
    int addGoods(Goods goods);
    int deleteGoodsById(Integer id);
    Goods findGoodsById(Integer id);
    int updateGoodsById(Goods goods);
}

再实现接口,GoodsServiceImpl

写入@Service注解,交由Spring管理

@Service
public class GoodsServiceImpl implements GoodsService {

    @Autowired
    private GoodsMapper goodsMapper;

    @Override
    public List<Goods> getGoodsList() {
        return goodsMapper.getGoodsList();
    }

    @Override
    public int addGoods(Goods goods) {
        return goodsMapper.addGoods(goods);
    }

    @Override
    public int deleteGoodsById(Integer id) {
        return goodsMapper.deleteGoodsById(id);
    }

    @Override
    public Goods findGoodsById(Integer id) {
        return goodsMapper.findGoodsById(id);
    }

    @Override
    public int updateGoodsById(Goods goods) {
        return goodsMapper.updateGoodsById(goods);
    }

4.使用数据统一格式 工具类util

(1)统一返回的数据类型 和 状态码

封装数据类:R

/**
 * 统一返回数据 json 格式 前后端 分离 json
 **/
@Data
public class R {

    //状态值
    private Boolean success;

    //状态吗
    private Integer code;

    //数据
    private String message;

    private Map<String, Object> data = new HashMap<String, Object>();

    private R(){}

    public static R ok(){
        R r = new R();
        r.setSuccess(ResultCodeEnum.SUCCESS.getSuccess());
        r.setCode(ResultCodeEnum.SUCCESS.getCode());
        r.setMessage(ResultCodeEnum.SUCCESS.getMessage());
        return r;
    }

    public static R error(){
        R r = new R();
        r.setSuccess(ResultCodeEnum.UNKNOWN_REASON.getSuccess());
        r.setCode(ResultCodeEnum.UNKNOWN_REASON.getCode());
        r.setMessage(ResultCodeEnum.UNKNOWN_REASON.getMessage());
        return r;
    }

    public static R setResult(ResultCodeEnum resultCodeEnum){
        R r = new R();
        r.setSuccess(resultCodeEnum.getSuccess());
        r.setCode(resultCodeEnum.getCode());
        r.setMessage(resultCodeEnum.getMessage());
        return r;
    }

    public R success(Boolean success){
        this.setSuccess(success);
        return this;
    }

    public R message(String message){
        this.setMessage(message);
        return this;
    }

    public R code(Integer code){
        this.setCode(code);
        return this;
    }

    public R data(String key, Object value){
        this.data.put(key, value);
        return this;
    }

    public R data(Map<String, Object> map){
        this.setData(map);
        return this;
    }
(2)ResultCodeEnum 类!

枚举类 :ResultCodeEnum

@Getter
public enum ResultCodeEnum {

    SUCCESS(true, 200,"成功"),
    UNKNOWN_REASON(false, 20001, "未知错误"),
    BAD_SQL_GRAMMAR(false, 21001, "sql语法错误"),
    JSON_PARSE_ERROR(false, 21002, "json解析异常"),
    PARAM_ERROR(false, 21003, "参数不正确"),
    FILE_UPLOAD_ERROR(false, 21004, "文件上传错误"),
    EXCEL_DATA_IMPORT_ERROR(false, 21005, "Excel数据导入错误"),
    USERLOGIN_INVALID_ERROR(false, 21007,"登录信息过期,请重新登录"),
    USERUNLOGIN_ERROR(false, 21008,"用户未登录,请重新登录");

    private Boolean success;

    private Integer code;

    private String message;

    private ResultCodeEnum(Boolean success, Integer code, String message) {
        this.success = success;
        this.code = code;
        this.message = message;
    }

5.编写Springboot的配置文件

Springboot的配置文件是在,resources 包下的 application.properties
我们一般使用的是 .yml 或者 .yaml格式的配置手法!!

(1)所以首先,把application.properties 改为 application.yml

application.yml 配置文件编写

# 设置端口
server:
  port: 8080

# mybatis 的配置 
mybatis:
  type-aliases-package: com.ithjc.pojo
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  mapper-locations: classpath:/mapper/*.xml
  
# spring 的配置  
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/goods?characterEncoding=utf-8&serverTimezone=GMT%2B8
    username: root
    password: root

6.编写业务代码 (crud)

(1)创建 controller 包 ==>类名:GoodsController

GoodsController

写入@Controller注解!

@Controller
public class GoodsController {

    @Autowired
    private GoodsService goodsService;

    @RequestMapping("/getAll")
    @ResponseBody
    public R getAll(){
        List<Goods> goodsList = goodsService.getGoodsList();
        return R.ok().data("goodsList",goodsList);
    }

    @RequestMapping("/addGoods")
    @ResponseBody
    public R addGoods(Goods goods){
        int i = goodsService.addGoods(goods);
        return R.ok().data("addGoods",i);
    }

    @RequestMapping("/deleteGoods")
    @ResponseBody
    public R deleteGoodsById(@RequestParam("id")Integer id){
        int i = goodsService.deleteGoodsById(id);
        return R.ok().data("deleteGoods",i);
    }

    @RequestMapping("/getGoods")
    @ResponseBody
    public R getGoodsById(@RequestParam("id") Integer id){
        Goods goods = goodsService.findGoodsById(id);
        return R.ok().data("goods",goods);
    }

    @RequestMapping("/updateGoods")
    @ResponseBody
    public R updateGoodsById(Goods goods){
        int i = goodsService.updateGoodsById(goods);
        return R.ok().data("updateGoods",i);
    }

7.使用Postman 或者ApiPost ==>API在线测试工具

在这里插入图片描述

我这里使用的ApiPost,国产的Http请求测试工具,使用教程如下:在这里插入图片描述
(2)Http请求:
查询选择: GET 请求
localhost:8080/getAll
增加选择:POST 请求
localhost:8080/addGoods

增加数据时,需要加入参数:

在这里插入图片描述

删除选择:DELETE 请求 或者 POST 请求
localhost:8080/deleteGoods

删除数据时,根据id删除:
在这里插入图片描述

修改选择:PUT 请求 或者 POST 请求
localhost:8080/updateGoods

修改数据时,根据id修改,和修改那些数据(我使用了mybatis的动态sql,所以修改指定数据即可,看您的需求)

在这里插入图片描述

查询选择:GET 请求
localhost:8080/getGoods

在这里插入图片描述

  • 9
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值