0基础学习Mybatis系列数据库操作框架——增删改操作

大纲

  • 新增
    • Mapper配置
    • 代码
      • Mapper接口文件
      • 应用
  • 删除
    • 简单方案
      • Mapper配置
      • 代码
    • 高级方案
      • Mapper配置
      • 代码
        • Mapper接口文件
        • 应用
    • 完整代码
  • 修改
    • Mapper配置
    • 代码
      • Mapper接口文件
      • 应用
  • 参考资料

在《0基础学习Mybatis系列数据库操作框架——目录结构》一文中,我们已经搭建了查询操作的框架。在这个基础上,我们将通过本文的学习掌握增、删、改的操作。
为了让数据维度更加丰富,我们给数据库单行数据映射的对象类增加两个变量——info_tint和info_sint,它们分别对应数据库表中对应的项。

package org.example.model;public class AllType {public int getInfo_int() {return info_int;}public void setInfo_int(int info_int) {this.info_int = info_int;}public byte getInfo_tint() {return info_tint;}public void setInfo_tint(byte info_tint) {this.info_tint = info_tint;}public short getInfo_sint() {return info_sint;}public void setInfo_sint(short info_sint) {this.info_sint = info_sint;}private int info_int;private byte info_tint;private short info_sint;
}

新增

INSERT INTO tableName(colomnAName, colomnBName……) VALUES(colomnAValue1, colomnBValue1),(colomnAValue2,colomnBValue2),(colomnAValue3,colomnBValue3)

Mapper配置

新增类型的SQL比较特别,它需要依赖于批量的数据。这样SQL Mapper的XML文件中就无法写死SQL,因为具体有多少VALUES则依赖于运行时的数据,而无法在编写代码时确认。
因为这样的特性,就需要SQL Mapper的XML文件中可以一定一种具有“循环生成”语义的部分。

    <insert id="insertElems">insert into all_type(info_int, info_tint, info_sint) values<foreach item="item" collection="list" separator=",">(#{item.info_int}, #{item.info_tint}, #{item.info_sint})</foreach></insert>

上例中foreach就会循环一个list,然后生成用","分割的一批VALUE值。

代码

Mapper接口文件

在Mapper接口中,我们新增以下方法声明即可。

long insertElems(List<AllType> AllTypeList);

返回值表示成功新增的数据量。

应用

@Testvoid testBatchInsert() {List<AllType> allTypelist= new LinkedList<>();for (byte i = 100; i < 110; i++) {AllType allType = new AllType();allType.setInfo_int(i);allType.setInfo_sint(i);allType.setInfo_tint(i);allTypelist.add(allType);}InputStream in = null;try {in = Resources.getResourceAsStream("mybatis/config/mybatis-config-1.xml");} catch (IOException e) {throw new RuntimeException(e);}SqlSessionFactory sqlSFLocal = new SqlSessionFactoryBuilder().build(in);try (SqlSession s = sqlSFLocal.openSession(true)) {AllTypeMapper all_type_mapper = s.getMapper(AllTypeMapper.class);long count = all_type_mapper.insertElems(allTypelist);System.out.println(count);}}

需要注意的是要给openSession方法传递true,这样autoCommit会被设置,进而代码执行后,数据会真正添加到表中。如果测试时发现代码表达了插入成功(返回了成功条数),但是在表中没有执行的效果(无新增数据),往往就是这个参数没有被设置。后续的删、改操作都要这么设置。

删除

DELETE FROM tableName WHERE condition;

简单方案

Mapper配置

删除的SQL定制性比较强的是condition部分。
一种简单的办法就是针对某种特点的SQL写一条独立的项,比如

    <delete id="deleteElemWhereInfoIntLessThen">delete from all_type where info_int &lt; #{value}</delete>

这样Mapper接口代码中只要新增deleteElemWhereInfoIntLessThen方法,并只传递一个参数——info_int即可。
这儿需要注意的是,<是表达小于号(<)。由于XML中<等字符用于构建结构,我们不能直接使用这些字符,否则机会导致XML解析出错。

### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.builder.BuilderException: Error creating document instance. Cause: org.xml.sax.SAXParseException; lineNumber:

需要替换的字符参考如下:

原符号       <        <=      >       >=       &        '        "
替换符号    &lt;    &lt;=   &gt;    &gt;=   &amp;   &apos;  &quot;

代码

我们只需要在mapper接口中新增如下方法即可。

    long deleteElemWhereInfoIntLessThen(int info_int);

使用方法如下

  AllTypeMapper all_type_mapper = s.getMapper(AllTypeMapper.class);long count = all_type_mapper.deleteElemWhereInfoIntLessThen(103);System.out.println(count);

高级方案

对于value值类型相同的、且condition结构相同的SQL,我们还可以采用如下的方案

Mapper配置

我们让对比的列名、对比符号和值都通过代码来设置。

<delete id="deleteElem">delete from all_type where ${column_name} ${comparison_operator} #{value}
</delete>

代码

Mapper接口文件

我们只需要在mapper接口中新增如下方法即可。

long deleteElem(@Param("column_name") String column_name, @Param("comparison_operator") String comparison_operator, @Param("value") int value);
应用
count = all_type_mapper.deleteElem("info_int", "<",105);
count = all_type_mapper.deleteElem("info_int", ">",106);

完整代码

    @Testvoid testDelete() {InputStream in = null;try {in = Resources.getResourceAsStream("mybatis/config/mybatis-config-1.xml");} catch (IOException e) {throw new RuntimeException(e);}SqlSessionFactory sqlSFLocal = new SqlSessionFactoryBuilder().build(in);try (SqlSession s = sqlSFLocal.openSession(true)) {AllTypeMapper all_type_mapper = s.getMapper(AllTypeMapper.class);long count = all_type_mapper.deleteElemWhereInfoIntLessThen(103);System.out.println(count);count = all_type_mapper.deleteElem("info_int", "<",105);System.out.println(count);count = all_type_mapper.deleteElem("info_int", ">",106);System.out.println(count);}}

修改

UPDATE tableName SET colomnAName = valueA, colomnBName = valueB where condition

比较复杂的condition我们已经在“删除”环节见过。当前我们将重心放在SET部分。
如果不存在数据库内部计算的场景,比如SET some=some+1,则需要更新的数据都来源于代码。我们只要给这条语句传递一个Java数据对象即可。

Mapper配置

<update id="updateElems">update all_type set info_tint = #{info_tint}, info_sint = #{info_sint} where info_int &gt; #{info_int}
</update>

注意这儿的占位符都是Java对象类AllType中字段名。

代码

Mapper接口文件

    long updateElems(AllType item);

应用

    @Testvoid testUpdate() {InputStream in = null;try {in = Resources.getResourceAsStream("mybatis/config/mybatis-config-1.xml");} catch (IOException e) {throw new RuntimeException(e);}SqlSessionFactory sqlSFLocal = new SqlSessionFactoryBuilder().build(in);try (SqlSession s = sqlSFLocal.openSession(true)) {AllTypeMapper all_type_mapper = s.getMapper(AllTypeMapper.class);AllType a = new AllType();a.setInfo_int(105);a.setInfo_tint((byte) 20);a.setInfo_sint((short) 10);long count = all_type_mapper.updateElems(a);System.out.println(count);}}

代码样例见:https://github.com/f304646673/mybatis_demo.git

参考资料

  • https://mybatis.org/mybatis-3/zh_CN/configuration.html
  • https://mybatis.org/mybatis-3/zh_CN/sqlmap-xml.html

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

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

相关文章

绿色wordpress外贸建站模板

绿色wordpress外贸建站模板 https://www.mymoban.com/wordpress/6.html

【JavaScript编程】encodeURI和encodeURIComponent的区别

一、encodeURI encodeURI函数主要用于编码整个URL。当URL中包含非ASCII字符、空格或其他在URL中有特殊意义的字符时&#xff0c;可以使用encodeURI进行编码。下面是一个使用encodeURI的例子&#xff1a; // 假设有一个URL var url "https://www.example.com/index.html?…

Oracle控制文件管理

控制文件作用&#xff1a;记录了数据库的结构和行为&#xff0c;有多少个数据文件&#xff0c;日志文件及其位置名称&#xff0c;状态&#xff0c;维护数据库的一致性&#xff0c;即记录了数据库的启动SCN号和终止SCN号。 控制文件的位置和个数记录在参数文件中&#xff0c;通…

C语言什么是局部变量?

一、问题 C程序中的变量有局部变量和全局变量&#xff0c;那么什么是局部变量呢&#xff1f; 二、解答 局部变量也称为内部变量&#xff0c;即在函数内部定义的变量。它只在本函数范围内有效&#xff0c;在函数外是不能使⽤该变量的。例如&#xff1a; int f1(int a) {int b,…

Android 窗口那些事儿

目录 1. &#x1f4c2; 前言 你&#xff0c;是否有过这些疑问&#xff1f; 2. &#x1f531; Window 2.1 认识 Window 的几个阶段 1&#xff09;阶段一&#xff1a;Window 约等于 Activity 2&#xff09;阶段二&#xff1a;Window 约等于 View 3&#xff09;阶段三&…

基于深度学习的危险物品检测系统(网页版+YOLOv8/v7/v6/v5代码+训练数据集)

摘要&#xff1a;本文详细介绍基于YOLOv8/v7/v6/v5的危险物品检测技术。主要采用YOLOv8技术并整合了YOLOv7、YOLOv6、YOLOv5的算法&#xff0c;进行了细致的性能指标对比分析。博客详细介绍了国内外在危险物品检测方面的研究现状、数据集处理方法、算法原理、模型构建与训练代码…

Git 实战教程

Git 是一款强大的分布式版本控制系统&#xff0c;广泛用于团队协作与项目管理。本文将为你提供一份 Git 的实战教程&#xff0c;通过实例演示 Git 的基本用法和高级特性&#xff0c;帮助你快速上手 Git。 一、Git 基础 安装 Git 首先&#xff0c;你需要在你的计算机上安装 G…

保健品wordpress外贸模板

保健品wordpress外贸模板 健康保养保健品wordpress外贸模板&#xff0c;做大健康行业的企业官方网站模板。 https://www.jianzhanpress.com/?p3514

蓝桥杯刷题第八天(dp专题)

这道题有点像小学奥数题&#xff0c;解题的关键主要是&#xff1a; 有2种走法固走到第i级阶梯&#xff0c;可以通过计算走到第i-1级和第i-2级的走法和&#xff0c;可以初始化走到第1级楼梯和走到第2级楼梯。分别为f[1]1;f[2]1(11)1(2)2.然后就可以循环遍历到后面的状态。 f[i…

XenCenter 2024 创建一个虚拟机

前言 实现&#xff0c;创建一个虚拟机&#xff0c;内存&#xff0c;cpu&#xff0c;磁盘&#xff0c;名称&#xff0c;网卡&#xff0c;配置 Xen Center 2024 download 创建虚拟机 选择系统类型 定义虚拟机名称 选择ISO镜像库 选择主服务器 分配虚拟机内存&#xff0c;cpu资源…

观察和配置MAC地址表

目录 原理概述 实验目的 实验内容 实验拓扑 ​编辑1&#xff0e;基本配置 2.观察正常状态时的MAC地址表 4.配置静态MAC地址表项 原理概述 MAC 地址表是交换机的一个核心组成部分&#xff0c;交换机主要是根据 MAC 地址表来进行帧的转发的。交换机对帧的转发操作行为一共有…

[Python学习篇] Python变量

变量的作用 计算机的存储分为内存储器即内存&#xff0c;外存储器即硬盘&#xff0c;程序运行代码在内存中运行&#xff0c;内存可以理解为一块一块的存储地址&#xff0c;变量就是给某一块内存地址起的一个名字&#xff0c;变量的值就存储在这块内存中&#xff0c;通过变量名称…

OpenHarmony实战:轻量带屏解决方案之恒玄芯片移植案例

本文章基于恒玄科技 BES2600W 芯片的欧智通 Multi-modal V200Z-R 开发板&#xff0c;进行轻量带屏开发板的标准移植&#xff0c;开发了智能开关面板样例&#xff0c;同时实现了 ace_engine_lite、arkui_ui_lite、aafwk_lite、appexecfwk_lite、HDF 等部件基于 OpenHarmony Lite…

集成电路企业tapeout,如何保证机台数据准确、完整、高效地采集?

Tapeout即流片&#xff0c;集成电路行业中将CDS最终版电路图提交给半导体制造厂商进行物理生产的过程。在芯片设计与制造的流程中&#xff0c;Tapeout是非常重要的阶段&#xff0c;包括了布局&#xff08;Layout&#xff09;、连线&#xff08;Routing&#xff09;、分析&#…

Linux下使用vim文本编辑器

linux自带vi编辑器&#xff0c;使用升级版vim输入命令 sudo apt install vim 1.文件操作 vim 文件名&#xff1a;打开文件2.命令行模式 &#xff1a;进入命令行 q 退出 q! 退出不保存 wq 保存退出3.三种模式…

Linux 线程互斥、互斥量、可重入与线程安全

目录 一、线程互斥 1、回顾相关概念 2、抢票场景分析代码 多个线程同时操作全局变量 产生原因 如何解决 二、互斥量 1、概念 2、初始化互斥量&#xff1a; 方法1&#xff1a;静态分配 方法2&#xff1a;动态分配 3、销毁互斥量&#xff1a; 4、加锁和解锁 示例抢…

企业如何设计和实施有效的网络安全演练?

现实世界中&#xff0c;武装部队一直利用兵棋推演进行实战化训练&#xff0c;为潜在的军事冲突做准备。随着当今的数字化转型&#xff0c;同样的概念正在以网络安全演习的形式在组织中得到应用&#xff0c;很多企业每年都会基于合理的网络攻击场景和事件响应做一些测试和模拟。…

redis-BitMap(位图)使用方法

一&#xff0c;BitMap介绍 使用位存储&#xff0c;信息状态只有 0 和 1 Bitmap是一串连续的2进制数字&#xff08;0或1&#xff09;&#xff0c;每一位所在的位置为偏移(offset)&#xff0c;在bitmap上可执行AND,OR,XOR,NOT以及其它位操作。 二 &#xff0c;应用场景 签到统计…

金字塔建设之谜

金字塔是梯形分层的&#xff0c;又称作层级金字塔。它是一种高大的角锥体建筑物&#xff0c;底座四方形&#xff0c;每个侧面是三角形&#xff0c;样子就像汉字的“金”字&#xff0c;所以我们叫它“金字塔”。 但实际上目前在中国、美洲多地都发现了金字塔型结构的墓穴。但是…

鸿蒙南向开发案例:【智能养花机】

样例简介 智能养花机通过感知花卉、盆栽等植宠生长环境的温度、湿度信息&#xff0c;适时为它们补充水分。在连接网络后&#xff0c;配合数字管家应用&#xff0c;用户可远程进行浇水操作。用户还可在应用中设定日程&#xff0c;有计划的按日、按周进行浇水。在日程中用户可添…