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

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

时间:2024-04-02 23:31:26浏览次数:141  
标签:info Mapper tint int sint 增删 Mybatis 操作 type

大纲

《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);

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

应用

@Test
    void 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);

完整代码

    @Test
    void 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);

应用

    @Test
    void 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

标签:info,Mapper,tint,int,sint,增删,Mybatis,操作,type
From: https://blog.csdn.net/breaksoftware/article/details/137297044

相关文章

  • Mybatis流程分享-II 配置处理,构建environment 信息
    序言通过章节一的讨论,我们知道Mybatis内部对于xml的解析过程具体如下:可以看到,在配置文件的解析过程中其会首先调用SqlSessionFactortyBuilder中的build方法,接着再调用XMLConfigBuilder的parse()方法,并最终返回一个Configuraion对象。进一步,又会调用SqlSessionFactortyBuilde......
  • 如何在数据库事务提交成功后进行异步操作
    如何在数据库事务提交成功后进行异步操作转载自:https://segmentfault.com/a/1190000004235193问题业务场景业务需求上经常会有一些边缘操作,比如主流程操作A:用户报名课程操作入库,边缘操作B:发送邮件或短信通知。业务要求操作A操作数据库失败后,事务回滚,那么操作B......
  • 函数的递归操作
    函数自身调用自身的操作,称为函数的递归操作!一般递归存在两个条件:        1.递归的起始值(需要看具体问题)        2.递归的结束条件(一定得有)具体参考以下案例:1.有五个人坐在一起,问第5个人多少岁?他说比第4个人大2岁。  问第4个人岁数。他说比第3个人大......
  • iNeuOS工业互联网操作系统,“低代码”表单开发应用过程(一)
     iNeuOS工业互联网操作系统,“低代码”表单开发应用过程(一) 目      录1.     概述...22.     “低代码”表单开发应用过程...21.  概述    iNeuOS工业互联网操作系统“表单设计”功能经过升级后,能够适用于更多应用场景,从业务上来讲可以扩展设......
  • mybatis-plus使用枚举
    定义枚举类@GetterpublicenumSexEnum{MALE(1,"男"),FEMALE(2,"女");@EnumValue//表示会把这个值存入数据库privateintindex;@JsonValue//json序列化时使用这个属性privateStringname;SexEnum(inti,Stringname){this.in......
  • Java API操作ES
    1、项目搭建Elasticsearch软件是由Java语言开发的,所以也可以通过JavaAPI的方式对Elasticsearch服务进行访问。先IDEA开发工具中创建简单的javaseMaven项目(模块也可),如下:修改pom文件,增加Maven依赖关系如下:<dependencies><dependency><groupId>......
  • 07字符串内置方法_列表的内置方法_列表操作_字典的内置方法
    【一】字符串内置方法【1】find方法name="dreamHello"#默认是从左向右找并且返回当前字符在字符串内部的索引坐标print(name.find('d'))#0#默认只能找一次,找到了就不会再找下去了print(name.find('e'))#2#可以指定寻找的区间print(name.find('e',5,-1))#7......
  • ZCMU操作系统课程实验 - 实验1-Linux的使用
    登录1.打开这个东西2. 在  文件->打开    中打卡机房里VMOS文件里的这个东东 3.然后依次操作下去好了,有红色的选项,我都是选的"Donothing"。完成后就会出现这样一个黑框框。4.让你登录。输入:root。密码:superuser    。注意输入密码的时候,密......
  • 金蝶云星空表单插件:操作子单据体的删除触发父单据体的字段重算
    文章目录金蝶云星空表单插件:操作子单据体的删除触发父单据体的字段重算金蝶云星空表单插件:操作子单据体的删除触发父单据体的字段重算publicoverridevoidAfterDeleteRow(AfterDeleteRowEventArgse){base.AfterDeleteRow(e);if(e.EntityKey.Equals(as......
  • 非关系型数据库——Redis基本操作
    目录一、Redis数据库常用命令1.Set——存放数据 2.Get——获取数据3.Keys——获取符合条件的键值4.Exists——判断键值是否存在5.Del——删除指定键值6.Type——获取键值对应的类型7.Rename——对已有键值重命名(覆盖)8.Renamenx——对已有键值重命名(不覆盖)9.Dbsize—......