MyBatis 详解 (2) -- 增删改操作

news2024/11/27 16:45:58

MyBatis 详解 2 -- 增删改操作

  • 前言
  • 一、准备工作
    • 1.1 创建数据库和表
    • 1.2 添加实体类
    • 1.3 添加 mapper 接口 (数据持久层)
    • 1.4 创建与接口对应的 xml 文件
  • 二、增加操作
    • 2.1 默认返回受影响的行数
    • 2.2 特殊的新增:返回自增 id
  • 三、删除操作
  • 四、修改操作
  • 五、实现完整交互
    • 5.1 添加 Service
    • 5.2 添加 Controller
    • 5.3 验证

前言

承接上篇博客 (环境搭建、查询操作):https://blog.csdn.net/yyhgo_/article/details/128695930?spm=1001.2014.3001.5501

上篇博客我们实现了 MyBatis 环境搭建与查询操作。接下来,我们实现增加、删除和修改操作,对应使用 MyBatis 的标签如下:

  • <insert>标签:插⼊语句
  • <update>标签:修改语句
  • <delete>标签:删除语句

一、准备工作

1.1 创建数据库和表

-- 创建数据库
drop database if exists mycnblog;
create database mycnblog DEFAULT CHARACTER SET utf8mb4;

-- 使用数据数据
use mycnblog;

-- 创建表[用户表]
drop table if exists  userinfo;
create table userinfo(
    id int primary key auto_increment,
    username varchar(100) not null,
    password varchar(32) not null,
    photo varchar(500) default '',
    createtime datetime default now(),
    updatetime datetime default now(),
    `state` int default 1
) default charset 'utf8mb4';

-- 创建文章表
drop table if exists  articleinfo;
create table articleinfo(
    id int primary key auto_increment,
    title varchar(100) not null,
    content text not null,
    createtime datetime default now(),
    updatetime datetime default now(),
    uid int not null,
    rcount int not null default 1,
    `state` int default 1
)default charset 'utf8mb4';

1.2 添加实体类

package com.example.demo.model;

import lombok.Data;

import java.util.Date;

/**
 * 文章表的实体类
 */
@Data
public class ArticleInfo {
    private int id;
    private String title;
    private String content;
    private Date createtime;
    private Date updatetime;
    private int uid;
    private int rcount; // 访问量
    private int state; // 状态(预览字段)
    private String name; // 文章作者名
    //..
}

1.3 添加 mapper 接口 (数据持久层)

package com.example.demo.mapper;

import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface ArticleInfoMapper {
    
}

1.4 创建与接口对应的 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.example.demo.mapper.ArticleInfoMapper">

</mapper>

二、增加操作

2.1 默认返回受影响的行数

ArticleInfoMapper 接口:

@Mapper
public interface ArticleInfoMapper {
    // 添加方法
    public int add(@Param("articleInfo") ArticleInfo articleInfo);   
}

ArticleMapper.xml:

    <insert id="add">
        insert into articleinfo(title,uid,content)
        values(
        #{articleInfo.title},
        #{articleInfo.uid},
        #{articleInfo.content})
    </insert>

在这里插入图片描述

插入默认返回的是受影响的行数,所以不需要设置 resultType / resultMap。

另一种格式:接口中方法参数不带@Param("articleInfo");.xml 文件中的字段不需要添加articleInfo.,直接写字段名即可。

单元测试:

package com.example.demo.mapper;

import com.example.demo.model.ArticleInfo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import static org.junit.jupiter.api.Assertions.*;

@SpringBootTest // 当前测试的上下文环境为 springboot
class ArticleInfoMapperTest {

    @Autowired
    private ArticleInfoMapper articleInfoMapper;

    @Test
    void add() {
        ArticleInfo articleInfo = new ArticleInfo();
        articleInfo.setTitle("111");
        articleInfo.setContent("很高兴认识你~");
        articleInfo.setUid(1);
        int result = articleInfoMapper.add(articleInfo);
        System.out.println("添加结果:" + result);
    }
}

经测试,新增成功。

2.2 特殊的新增:返回自增 id

ArticleInfoMapper 接口:

    // 添加方法(得到自增主键的id)
    public int addGetId(@Param("articleInfo") ArticleInfo articleInfo);

ArticleMapper.xml:

    <insert id="addGetId" useGeneratedKeys="true" keyProperty="id">
        insert into articleinfo(title,content,uid)
        values(
        #{articleInfo.title},
        #{articleInfo.content},
        #{articleInfo.uid})
    </insert>
  • useGeneratedKeys:这会令 MyBatis 使⽤ JDBC 的 getGeneratedKeys ⽅法来取出由数据库内部⽣成的主键(⽐如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的⾃动递增字段),默认值:false。
  • keyColumn:设置⽣成键值在表中的列名,在某些数据库(像 PostgreSQL)中,当主键列不是表中的第⼀列的时候,是必须设置的。如果⽣成列不⽌⼀个,可以⽤逗号分隔多个属性名称。
  • keyProperty:指定能够唯⼀识别对象的属性,MyBatis 会使⽤ getGeneratedKeys 的返回值或 insert 语句的 selectKey ⼦元素设置它的值,默认值:未设置(unset)。如果⽣成列不⽌⼀个,可以⽤逗号分隔多个属性名称。

单元测试:

    @Test
    void addGetId() {
        ArticleInfo articleInfo = new ArticleInfo();
        articleInfo.setTitle("mybaits添加并返回自增id");
        articleInfo.setContent("设置xml中的useGeneratedKeys=\"true\" keyProperty=\"id\"");
        articleInfo.setUid(1);
        int result = articleInfoMapper.addGetId(articleInfo); // 返回受影响的行数
        System.out.println("添加结果:" + result + " |自增id:" + articleInfo.getId());
    }

因为设置了 keyProperty="id",所以通过 articleInfo.getId() 拿到 自增id!
(默认的返回值依然是 受影响的行数)

经测试,新增成功。

三、删除操作

ArticleInfoMapper 接口:

    // 删除单条数据
    public int delById(@Param("id") Integer id);

ArticleMapper.xml:

    <delete id="delById">
        delete from articleinfo where id=#{id}
    </delete>

默认返回值依然是受影响的行数。

单元测试:

    @Test
    void delById() {
        int result = articleInfoMapper.delById(3);
        System.out.println("删除结果:" + result);
    }

经测试,删除成功。

四、修改操作

ArticleInfoMapper 接口:

    // 修改标题
    public int updateTitle(@Param("id") Integer id, @Param("title") String title);

ArticleMapper.xml:

    <update id="updateTitle">
        update articleinfo set title=#{title} where id=#{id}
    </update>

默认返回值依然是受影响的行数。

单元测试:

    @Test
    void updateTitle() {
        int result = articleInfoMapper.updateTitle(1, "你好世界");
        System.out.println("修改结果:" + result);
    }

经测试,修改成功。

五、实现完整交互

在这里插入图片描述

5.1 添加 Service

先在数据持久层 (mapper) 实现接口与 xml 文件。

服务层实现代码如下:

package com.example.demo.service;

import com.example.demo.mapper.UserMapper;
import com.example.demo.model.UserInfo;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;

@Service
public class UserService {
    @Resource
    private UserMapper userMapper;

    public List<UserInfo> getAll() {
        return userMapper.getAll();
    }
}

5.2 添加 Controller

控制器层实现代码如下:

package com.example.demo.controller;

import com.example.demo.model.UserInfo;
import com.example.demo.service.UserService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;

@RestController
@RequestMapping("/u")
public class UserController {
    @Resource
    private UserService userService;

    @RequestMapping("/getall")
    public List<UserInfo> getAll(){
        return userService.getAll();
    }
}

5.3 验证

启动后,访问 http://localhost:8080/u/getall:
在这里插入图片描述
交互成功了 ~

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

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

相关文章

爆肝9万字,我已从小白晋升ARM嵌入式工程师!带你从零熟悉常用的M4嵌入式功能,建议收藏(含码源)

&#x1f4da; 前言 &#x1f4d1;博客主页&#xff1a;丘比特惩罚陆 &#x1f496;欢迎关注&#xff1a;点赞收藏⭐留言✒ &#x1f4ac;系列专栏&#xff1a;web前端、嵌入式、笔记专栏 &#x1f3ae; 加入社区&#xff1a; 丘比特惩罚陆 &#x1f947;人生格言&#xff1a;选…

【教学赛】金融数据分析赛题1:银行客户认购产品预测(0.9676)

本文是对天池教学赛&#xff0c;银行客户认购产品预测的记录&#xff0c;教学赛网址如下&#xff1a; 【教学赛】金融数据分析赛题1&#xff1a;银行客户认购产品预测_学习赛_天池大赛-阿里云天池 1. 读取数据 import pandas as pd# 加载数据 train pd.read_csv(train.csv) …

P5587 打字练习————C++

题目 打字练习 题目描述 R 君在练习打字。 有这样一个打字练习网站&#xff0c;给定一个范文和输入框&#xff0c;会根据你的输入计算准确率和打字速度。可以输入的字符有小写字母、空格和 .&#xff08;英文句号&#xff09;&#xff0c;输入字符后&#xff0c;光标也会跟…

c语言小练pintia11-20

11.计算平均分已知某位学生的数学、英语和计算机课程的成绩分别是87分、72分和93分&#xff0c;求该生3门课程的平均成绩&#xff08;结果按整型输出&#xff09;。输入格式&#xff1a;本题无输入输出格式&#xff1a;按照下列格式输出结果&#xff1a;math 87, eng 72, com…

深耕地市区县市场,新华三智行中国走新路

2022年就这样结束了&#xff0c;但是企业数字化的进程从未结束。回顾这一年&#xff0c;对于任何企业而言&#xff0c;数字化优先的战略仍然在继续。不仅如此&#xff0c;数字化走向地市区县市场&#xff0c;带来了更多的机遇和发展&#xff0c;让我们看到了中国的数字经济还有…

Flurry iOS端调研和使用

Flurry iOS端调研使用 flurry官方资料较少&#xff0c;且只有英文文档没有代码demo。公司项目确定要用Flurry&#xff0c;所以深入调研&#xff0c;顺便记录过程。有需要的小伙伴也可以顺便参考 一.创建应用拿api_key 官网&#xff1a;https://www.flurry.com/ 用邮箱去官网…

【目标检测】55、YOLOv8 | YOLOv5 团队 Ultralytics 再次出手,又实现了 SOTA

文章目录一、YOLO 系列算法的简单回顾二、YOLOv8 简介2.1 安装和简单使用2.2 Ultralytics HUB2.2.1 Upload Dataset2.3 YOLOv8 主要改动三、YOLOv8 细节详述论文&#xff1a;暂无 官方文档&#xff1a;https://docs.ultralytics.com/ 代码&#xff1a;https://github.com/ult…

【算法数据结构初阶篇】:链表问题

一、反转单双链表 一、数据结构图 二、代码演示 public class Code01_ReverseList {public static class Node {public int value;public Node next;public Node(int data) {value data;}}public static class DoubleNode {public int value;public DoubleNode last;public …

Spring Cloud Gateway从注册中心自动注册配置路由信息

环境信息Spring Boot&#xff1a;2.0.8.RELEASESpring Boot内置的tomcat&#xff1a;tomcat-embed-core 8.5.37Spring Cloud Gateway&#xff1a;2.0.4.RELEASENacos&#xff1a;2.0.4.RELEASE需求Spring Cloud Gateway注册到注册中心&#xff08;这里是Nacos&#xff0c;其它注…

Spring学习系列(二)

Spring_特殊值的注入问题和各种类型的自动装配1.set两种方式的区别第4中赋值方式&#xff1a;自动装配&#xff08;只适用于ref类型&#xff09;使用注解定义bean1.set两种方式的区别 &#xff08;1&#xff09;把值写到value属性里面&#xff0c;必须加引号&#xff0c;写到子…

【学习】计算机系统硬件和数据结构

学习内容描述&#xff1a; 1、CPU包含哪些部分&#xff1f; 2、数据结构基础知识。 重点知识&#xff1a; 1、CPU(中央处理器&#xff0c;Central Processing Unit) 主要包括运算器、控制器两大部件&#xff1b;内部结构包含控制单元、运算单元、存储单元和时钟等几个主要部…

虚拟直播(虚拟场景直播)要怎么做?

阿酷TONY / 2022-11-21 / 长沙 绿幕抠像 虚拟场景&#xff08;三维场景&#xff09;实时渲染&#xff0c;来一场虚拟直播。 附案例效果&#xff1a;PC端案例、移动端案例效果。 目录 1. 绿幕虚拟直播间 2. 虚拟场景(炫酷舞台) 3. 案例&#xff1a;PC端 4. 案例&#xff1a…

光纤内窥镜物镜光学设计

光纤内窥镜物镜光学设计 工作原理 典型的光纤传像束内窥镜主要由前置物镜、光纤传像束、目镜/耦接镜、 探测器等组成&#xff0c;如图1所示。通过物镜把目标成像于光纤传像束的前端面上&#xff0c;该端面上的图像被离散分布的大量光纤采样&#xff0c;每根光纤都有良好的光学…

[极客大挑战 2019]Upload

目录 解题步骤 常见的绕过思路 解题步骤 直接上传shell 回显&#xff1a;Not image! bp抓包 修改类型 Content-Type: application/octet-stream改为Content-Type: image/jpg 回显&#xff1a;NOT&#xff01;php! 修改后缀为phtml 回显&#xff1a;NO! HACKER! your file inc…

SAP MM 物料分类账的启用配置

一、前言 物料账就是一本账&#xff0c;管理物料的数量和价值。 通常物料有两种计价方法&#xff1a; 移动平均价V&#xff08;移动加权平均&#xff09; 标准价S 移动平均价的优点&#xff1a;能够及时响应市场原材料价格的波动。 价差科目&#xff08;总账科目&#xff09;…

MyBatis-Plus基本操作

依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.3</version> </dependency>基础操作 DAO层 public interface UserMapper extends BaseMapper<User…

nohup + 命令实现后台不挂断地运行程序

nohup&#xff1a; nohup&#xff1a;不挂断地运行程序&#xff0c;就是即便关闭终端的窗口&#xff0c;程序还会继续执行。 $ nohup python merge_reasons.py可以看到终端仍在被占用&#xff0c;同级目录下生成了一个nohup.out文件&#xff0c;本来输出到终端的信息&#xf…

python人工智能数据算法(下)

文章目录差分法逼近微分背景引入差分法简介差分的不同形式及其代码实现蒙特卡罗方法背景引入蒙特卡罗方法原理蒙特卡罗方法应用计算圆周率计算定积分梯度下降算法算法简介方向导数与梯度梯度下降基于梯度下降算法的线性回归算法总结差分法逼近微分 背景引入 几乎所有的机器学…

我收集的PDF电子书

刚出来&#xff0c;要整理一下自己的资源了&#xff0c;好多都没有了&#xff0c;需要下载的自行联系niunanniunan.net 目录 软件工程 构建之法&#xff08;第1版&#xff09; 实现领域驱动设计 领域驱动设计&#xff1a;软件核心复杂性应对之道 人月神话 算法 算法基础…

C语言文件操作(一)

我们之前写程序&#xff0c;得到运行结果&#xff0c;退出运行&#xff0c;运行结果就不见了&#xff0c;因为运行的结果放到了内存中&#xff0c;退出程序的时候数据就会消失&#xff0c;等下一次运行又要重新输入数据&#xff0c;这样就显得很麻烦。那么我们如何保存之前的运…