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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 【MyBatis】2、MyBatis 的动态 SQL 和增删改操作


一、添加

(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>
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
12天前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
1月前
|
SQL Java 数据库连接
mybatis使用四:dao接口参数与mapper 接口中SQL的对应和对应方式的总结,MyBatis的parameterType传入参数类型
这篇文章是关于MyBatis中DAO接口参数与Mapper接口中SQL的对应关系,以及如何使用parameterType传入参数类型的详细总结。
30 10
|
2月前
|
SQL XML Java
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
文章介绍了MyBatis中动态SQL的用法,包括if、choose、where、set和trim标签,以及foreach标签的详细使用。通过实际代码示例,展示了如何根据条件动态构建查询、更新和批量插入操作的SQL语句。
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
|
3月前
|
SQL Java 数据库连接
Mybatis系列之 Error parsing SQL Mapper Configuration. Could not find resource com/zyz/mybatis/mapper/
文章讲述了在使用Mybatis时遇到的资源文件找不到的问题,并提供了通过修改Maven配置来解决资源文件编译到target目录下的方法。
Mybatis系列之 Error parsing SQL Mapper Configuration. Could not find resource com/zyz/mybatis/mapper/
|
2月前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
44 1
|
3月前
|
SQL Java 数据库连接
Mybatis系列之 动态SQL
文章详细介绍了Mybatis中的动态SQL用法,包括`<if>`、`<choose>`、`<when>`、`<otherwise>`、`<trim>`和`<foreach>`等元素的应用,并通过实际代码示例展示了如何根据不同条件动态生成SQL语句。
|
3月前
|
SQL Java 关系型数据库
SpringBoot 系列之 MyBatis输出SQL日志
这篇文章介绍了如何在SpringBoot项目中通过MyBatis配置输出SQL日志,具体方法是在`application.yml`或`application.properties`中设置MyBatis的日志实现为`org.apache.ibatis.logging.stdout.StdOutImpl`来直接在控制台打印SQL日志。
SpringBoot 系列之 MyBatis输出SQL日志
|
3月前
|
SQL 关系型数据库 MySQL
解决:Mybatis-plus向数据库插入数据的时候 报You have an error in your SQL syntax
该博客文章讨论了在使用Mybatis-Plus向数据库插入数据时遇到的一个常见问题:SQL语法错误。作者发现错误是由于数据库字段中使用了MySQL的关键字,导致SQL语句执行失败。解决方法是将这些关键字替换为其他字段名称,以避免语法错误。文章通过截图展示了具体的操作步骤。
|
4月前
|
SQL Java 数据库连接
mybatis动态SQL常用语法总结
MyBatis 使用 OGNL 表达式语言处理动态SQL,如 `if` 标签进行条件判断,`choose`、`when`、`otherwise` 实现多条件选择,`where`、`set` 管理SQL关键字,`trim` 提供通用修剪功能,`foreach` 遍历集合数据。`sql` 和 `include` 用于代码重用,`selectKey` 处理插入后的返回值。参数传递支持匿名、具名、列表、Map、Java Bean和JSON方式。注意SQL转义及使用合适的jdbcType映射Java类型。
89 7
|
5月前
|
SQL XML Java
MyBatis第四课动态SQL
MyBatis第四课动态SQL