【MyBatis】2、MyBatis 的动态 SQL 和增删改操作

news2024/11/27 8:20:46

目录

  • 一、添加
    • (1) 基本插入
    • (2) 设置新插入记录的主键(id)★
  • 二、更新
  • 三、删除
  • 四、动态 SQL
    • (1) if 标签
    • (2) where 标签
    • (3) foreach 标签
  • 五、起别名
  • 六、sql 标签
  • 七、在 MyBatis 中集成 druid 连接池

一、添加

(1) 基本插入

<mapper namespace="student">
    <insert id="insert" parameterType="com.pojo.po.Student">
        INSERT INTO student(name, money) VALUES (#{name}, #{money})
    </insert>
</mapper>
public class TestStudent {
    @Test
    public void testInsert() {
        try (SqlSession sqlSession = MyBatisUtil.openSession(true)) {
            Student student = new Student();
            student.setName("鹿晗");
            student.setMoney(100L);
            sqlSession.insert("student.insert", student);
        }
    }
}

注意:openSession() 的参数默认值是 false(不自动提交事务)

(2) 设置新插入记录的主键(id)★

🌼 设置新插入记录的主键(id)到参数对象中

<mapper namespace="student">
    <insert id="insert2" parameterType="com.pojo.po.Student">
        INSERT INTO student(name, money) VALUES (#{name}, #{money})

        <!-- resultType 需要和参数对象的主键的属性名的类型一样 -->
        <!-- keyProperty 是属性名, 不是字段名 -->
        <!-- order="AFTER" 插入语句执行完毕后才查询 -->
        <selectKey resultType="long" keyProperty="id" order="AFTER">
            SELECT LAST_INSERT_ID()
        </selectKey>
    </insert>
</mapper>

二、更新

<mapper namespace="student">
    <update id="update" parameterType="com.pojo.po.Student">
        UPDATE student SET money = #{money} WHERE name = #{name}
    </update>
</mapper>

三、删除

<mapper namespace="student">
    <delete id="delete">
        DELETE FROM student WHERE id in ${ids}
    </delete>
</mapper>
public class TestStudent {

    @Test
    public void testDelete() {
        try (SqlSession sqlSession = MyBatisUtil.openSession(true)) {

            String ids = "(4, 9, 6)";

            sqlSession.insert("student.delete", ids);
        }
    }
    
}

四、动态 SQL

动态 SQL 官方文档:https://mybatis.org/mybatis-3/zh/dynamic-sql.html

(1) if 标签

<mapper namespace="student">
    <select id="dynamicSQL" resultType="com.pojo.po.Student">
        SELECT
        *
        FROM
        student
        WHERE 1 = 1
        <if test="id != null and id > 0">
            AND id > #{id}
        </if>

        <if test="money != null">
            AND money > #{money}
        </if>

        <if test="name != null">
            AND NAME LIKE #{name}
        </if>
    </select>
</mapper>
public class TestStudent {

    @Test
    public void dynamicSql() {
        try (SqlSession sqlSession = MyBatisUtil.openSession(true)) {

            HashMap<String, Object> pMap = new HashMap<>();
            pMap.put("id", 3);
            pMap.put("name", "%杰%");
            // pMap.put("money", 5555);

            List<Student> list = sqlSession.selectList("student.dynamicSQL", pMap);

            for (Student student : list) {
                System.out.println("dynamicSql student = " + student);
            }
        }
    }

}

(2) where 标签

<mapper namespace="student">
    <select id="dynamicSQL" resultType="com.pojo.po.Student">
        SELECT
        *
        FROM
        student
        <where>
            <if test="id != null and id > 0">
                id > #{id}
            </if>

            <if test="money != null">
                AND money > #{money}
            </if>

            <if test="name != null">
                AND NAME LIKE #{name}
            </if>
        </where>
    </select>
</mapper>

(3) foreach 标签

☆ 批量插入:

在这里插入图片描述

<mapper namespace="student">
    <insert id="batchInsert1" parameterType="List">
        INSERT INTO student (name, money) VALUES
        <foreach collection="list" item="item" separator=",">
            (#{item.name}, #{item.money})
        </foreach>
    </insert>
</mapper>

💦 批量添加的执行效率比多次单个添加的执行效率要高,但是无法获取到新插入的记录的主键
💦 可以使用 useGeneratedKeys 获取新插入的记录的主键。
💦 假如要添加的记录的字段特别多, 批量添加操作生成的 SQL 语句字符串可能会特别长,SQL 语句的长度可能会超过数据库的限制 【分批插入
💦 如果传进来的参数是 List 类型,collection 的属性值为 list 就可以遍历这个 List
💦 如果传进来的参数是数组collection 的属性值为 array 就可以遍历这个数组


☆ 批量删除:

在这里插入图片描述

<mapper namespace="student">
    <delete id="batchDelete1" parameterType="List">
        DELETE FROM student
        <where>
            id IN (
                <foreach collection="list"
                         separator=","
                         item="item">
                    #{item}
                </foreach>
            )
        </where>
    </delete>
</mapper>
<mapper namespace="student">
    <delete id="batchDelete2">
        DELETE FROM student
        <where>
            id IN
            <foreach collection="array"
                     separator=","
                     open="("
                     close=")"
                     item="item">
                #{item}
            </foreach>
        </where>
    </delete>
</mapper>

五、起别名

在这里插入图片描述

在这里插入图片描述

<typeAliases> 标签写在 mybatis-config.xml 核心配置文件的configuration 标签中
● 写在 <settings> 标签的后面
● 用于设置类型的别名(不区分大小写)

六、sql 标签

<mapper namespace="student">
    <!-- 有抽取公共 SQL 语句的作用 -->
    <sql id="sqlListAll">
        SELECT * FROM student
    </sql>

    <resultMap id="resultMapStudent" type="com.pojo.po.Student">
        <id property="id" column="id"/>
        <result property="createTime" column="create_time"/>
    </resultMap>
    <select id="list" resultMap="resultMapStudent">
        <include refid="sqlListAll"/>
    </select>

    <select id="getById" resultType="com.pojo.po.Student">
        <include refid="sqlListAll"/>
        WHERE id = #{id}
    </select>

    <select id="listByIdAndMoney" resultType="com.pojo.po.Student">
        <include refid="sqlListAll"/>
        WHERE id &lt; #{id} OR money >= #{money}
    </select>

    <select id="getByName" resultType="com.pojo.po.Student">
        <include refid="sqlListAll"/>
        WHERE name LIKE #{name}
    </select>

    <select id="dynamicSQL" resultType="com.pojo.po.Student">
        <include refid="sqlListAll"/>
        <where>
            <if test="id != null and id > 0">
                id > #{id}
            </if>

            <if test="money != null">
                AND money > #{money}
            </if>

            <if test="name != null">
                AND NAME LIKE #{name}
            </if>
        </where>
    </select>

</mapper>

七、在 MyBatis 中集成 druid 连接池

① 引入 Maven 依赖

  <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.1.2</version>
  </dependency>

② 创建连接池工厂类并继承 PooledDataSourceFactoryUnpooledDataSourceFactory;在连接池工厂类的构造方法中设置数据源 dataSource 为 Druid 的数据源实例

/**
 * MyBatis 中集成 Druid 数据库连接池
 */
public class DruidDataSourceFactory extends PooledDataSourceFactory {
    public DruidDataSourceFactory() {
        this.dataSource = new DruidDataSource();
    }
}

③ 在 mybatis-config.xml 文件中配置 Druid 数据源

  <environments default="development">
      <environment id="development">
          <transactionManager type="JDBC"/>
          <dataSource type="com.common.DruidDataSourceFactory">
              <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
              <property name="url"
                        value="jdbc:mysql://localhost:3306/study_mb?useUnicode=true&amp;characterEncoding=utf8"/>
              <property name="username" value="root"/>
              <property name="password" value="root"/>
              <property name="initialSize" value="5"/>
              <property name="maxActive" value="10"/>
              <property name="maxWait" value="5000"/>
          </dataSource>
      </environment>
</environments>

把 druid 数据库连接池的配置放在 druid.properties 文件中

dev.driverClassName=com.mysql.jdbc.Driver
dev.url=jdbc:mysql://localhost:3306/study_mb?useUnicode=true&characterEncoding=utf8
dev.username=root
dev.password=root
dev.initialSize=5
dev.maxActive=10
dev.maxWait=5000

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

<environment id="development">
     <!--采用JDBC的事务管理方法-->
     <transactionManager type="JDBC"/>
     <!--采取druid数据库连接池管理连接-->
     <dataSource type="com.common.DruidDataSourceFactory">
         <property name="driverClassName" value="${dev.driverClassName}"/>
         <property name="url" value="${dev.url}"/>
         <property name="username" value="${dev.username}"/>
         <property name="password" value="${dev.password}"/>
         <property name="initialSize" value="${dev.initialSize}"/>
         <property name="maxActive" value="${dev.maxActive}"/>
         <property name="maxWait" value="${dev.maxWait}"/>
     </dataSource>
</environment>

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

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

相关文章

qtcanpool 知 99:常见问题

文章目录 前言问题构建 fancydemo 报链接库错误 后语 前言 qtcanpool 是根据 qtcreator 整理出的一套通用的工程管理模板&#xff0c;同时集成一些常见的库和插件。就像 qtcanpool 名字一样&#xff0c;它是一个 qt 池&#xff0c;用户可以从中汲取所需。 对于初次使用 qtcan…

iPad触屏笔哪个牌子好用?平替电容笔推荐

电容笔可以说是人手必备的数码产品&#xff0c;市面上的电容笔品牌数不胜数&#xff0c;很多人都快赶不上它的步伐了&#xff0c;新品的大批量上升&#xff0c;说明市场上的电容笔的需求量日益扩大&#xff0c;越来越多人在学习上、办公上等使用&#xff0c;作为资深的电容笔发…

Kafka重平衡rebalance是什么

重平衡 背景&#xff1a; 假如你是一家公司的老板&#xff0c;手下有三名员工张三、李四、王五&#xff0c;现在你有三项工作A、B、C&#xff0c;正好安排给三人。 过了一个月后&#xff0c;员工王五离开了公司。这个时候只剩下两名员工&#xff0c;你只能把原先王五安排的…

每日学术速递6.3

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Reconstructing the Minds Eye: fMRI-to-Image with Contrastive Learning and Diffusion Priors 标题&#xff1a;重建心灵之眼&#xff1a;fMRI-to-Image with Contrastive lear…

反向ajax实现

在过去的几年中&#xff0c;web开发已经发生了很大的变化。现如今&#xff0c;我们期望的是能够通过web快速、动态地访问应用。在这一新的文章系列中&#xff0c;我们学习如何使用反 向Ajax&#xff08;Reverse Ajax&#xff09;技术来开发事件驱动的web应用&#xff0c;以此来…

【Android开发基础】更新\修改Adapter适配器数据(例:聊天功能等)

文章目录 一、引言二、解决方案1、需求一2、需求二&#xff08;1&#xff09;普通方法&#xff08;2&#xff09;观察者模式&#xff08;推荐&#xff09; 一、引言 描述&#xff1a;如何在主线程&#xff08;Activity/Fragment&#xff09;UI中修改子线程&#xff08;Adapter…

小白可以看懂的「GraphQL」,GraphQL到底是啥样

GraphQL是一种用于API的查询语言&#xff0c;可以在服务端定义GraphQL Schema&#xff0c;客户端可以向服务端发送GraphQL请求&#xff0c;服务端执行GraphQL查询&#xff0c;并将结果作为JSON返回给客户端。 下面是一个使用golang实现GraphQL的示例&#xff0c;首先需要安装g…

Ajax请求与浏览器缓存

在现代Web应用程序中&#xff0c;前端代码充斥着大量的Ajax请求&#xff0c;如果对于Ajax请求可以使用浏览器缓存&#xff0c;那么可以显著地减少网络请求&#xff0c;提高程序响应速度。 1. Ajax Request 使用jQuery框架可以很方便的进行Ajax请求&#xff0c;示例代码如下&a…

RISC-V 学习篇之特权架构下的中断异常处理

RISC-V 学习篇之特权架构下的中断异常处理 控制流和Trap特权架构简单的嵌入式系统的机器模式机器模式下的异常处理mtvec&#xff08;Machine Trap-Vector Base-Address&#xff09;mepc&#xff08;Machine Exception Program Counter)mcause&#xff08;Machine Cause&#xf…

Erlang/OTP 26 正式发布

导读Erlang 是一种通用的并发函数式程序设计语言。Erlang 也可以指 Erlang/OTP 的通称&#xff0c;开源电信平台 (OTP) 是 Erlang 的常用执行环境及一系列标准组件。 Erlang/OTP 26.0 已正式发布。这是一个重要版本更新&#xff0c;包含许多新特性、改进和不兼容的变化。 主要…

C++11右值

C11右值 类型与值类别左值纯右值将亡值内置类型类类型 左值引用和右值引用内置类型右值引用&#xff1a;具有右值引用自身为左值。右值引用与函数重载函数返回值 自定义类型右值引用构造函数的隐式转换右值引用与函数重载类类型作为函数的返回值 右值引用与函数模板泛化版本&am…

Java005——idea编写和运行第一个Java程序HelloWorld

1、首相需要了解什么是IDE&#xff08;集成开发环境&#xff09;&#xff1f; 2、了解Java有哪些主流的开发工具&#xff1f; 一、创建一个文件夹用来存放Java项目 二、创建一个空项目 点击idea首页新建项目按钮 创建一个空项目 这样空项目就创建好了 三、在空项目中新建一…

leetcode 数据库题 584,585,586,595,596,601,602,607,608,610

leetcode 数据库题 第三弹 584. 寻找用户推荐人585. 2016年的投资586. 订单最多的客户595. 大的国家596. 超过5名学生的课601. 体育馆的人流量602. 好友申请 II &#xff1a;谁有最多的好友607. 销售员608. 树节点610. 判断三角形小结 584. 寻找用户推荐人 https://leetcode.cn…

<数据结构>NO7.二叉树(附Oj练习题)

&#x1f447;二叉树的完整代码在&#x1f447; syseptember的gitee仓库&#xff1a;二叉树https://gitee.com/syseptember/data-structure/tree/1513789167062c75dc172366199ce7a6b0577cc7/BinaryTree2/BinaryTree2 目录 树的概念及结构 0x01.树的概念 0x02.树的相关概念 …

快速定位接口问题,JMeter方法论,跨线程组接口关联测试!

目录 【前言】 【步骤】 1. 准备工作 2. 创建线程组 3. 创建HTTP请求 4. 添加正则表达式提取器 5. 添加HTTP请求关联控制器 6. 设置断言和验证器 7. 运行测试 【代码】 【结论】 【前言】 在进行接口测试时&#xff0c;接口之间的关联经常是我们需要重点测试的点之…

如何手写网络协议栈

哈喽&#xff0c;我是子牙&#xff0c;一个很卷的硬核男人。喜欢研究底层&#xff0c;聚焦做那些大家想学没地方学的课程&#xff1a;手写操作系统、手写虚拟机、手写编程语言…目前做了两门课&#xff1a;手写OS、手写JVM 今天想跟大家聊一个黑科技&#xff1a;手写网络协议栈…

Python的编码规范

目录 1、每个 import 语句只导入一个模块&#xff0c;尽量避免一次导入多个模块&#xff0c; 2、不要在行尾添加分号&#xff0c;也不要用分号将两条命令放在同一行&#xff0c; 3、建议每行不超过 80 个字符&#xff0c; 4、使用必要的空行可以增加代码的可读性 5、通常情…

让百万大学生崩溃的在线OJ,如何破局?

目录 一、在线OJ的的原理 二、在线OJ的使用规则 三、注意事项 1.关于作弊 2.如何防止作弊 3.输入输出格式 4.换行问题 四、经典在线OJ坑人题目以及博主被坑经历 五、提交不成功及解决方法 六、如何得心应手的拿下OJ系统 七、在线OJ的骗分技巧 在线OJ&#xff08;Onl…

OpenGL简介

1.简介 一般它被认为是一个API&#xff0c;包含了一系列可以操作图形、图像的函数。然而&#xff0c;OpenGL本身并不是一个API&#xff0c;它仅仅是一个由Khronos组织制定并维护的规范(Specification)。OpenGL规范严格规定了每个函数该如何执行&#xff0c;以及它们的输出值。…

为何要用分布式锁Redis实现分布式锁

为何要用分布式锁 一、为什么要使用分布式锁 为了保证一个方法在高并发情况下的同一时间只能被同一个线程执行&#xff0c;在传统单体应用单机部署的情况下&#xff0c;可以使用Java并发处理相关的API(如ReentrantLcok或synchronized)进行互斥控制。但是&#xff0c;随着业务…