28个案例问题分析---027---单表的11个Update接口--MyBatis

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 28个案例问题分析---027---单表的11个Update接口--MyBatis

Mybatis动态SQL

四:总结

一:背景介绍

项目开发中。我们使用的是MyBatis,在MyBatis的xml文件里,两个表的更新功能,写了足足11个更新接口,毫无复用的思想这种方式可以正常的实现功能,但是没有复用,无论是从时间上还是维护性上,都会增加额外的成本。

那么我们该如何解决这个问题呢?如何写出可以复用的语句呢?在下面的例子里我会给大家进行展示 !!


二:前期准备

我们需要准备一个使用MyBatis的maven项目。大家需要提前准备好Mysql数据库


2.1 引入pom依赖

    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <!--mybatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>
        <!--junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

这里我们只需要引入mysql,mybatis,junit测试三个依赖即可,这三个依赖就足够我们对本次讲解进行测试。

2.2 数据库连接文件

引入之后我们要配置一些数据库的连接问题
这里注意将自己数据库机器的ip地址和对应的库名写对,不然无法连接自己的数据库。我这里隐藏了自己的ip地址,大家改成自己的即可。

2.3 MyBatis配置文件

因为我们使用的是普通的maven项目,所以需要写对应的配置文件,进行配置。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<!--configuration mybatis的核心配置文件-->
<configuration>
<!--引入外部配置文件-->
    <properties resource="db.properties"/>
    <!--配置-->
    <settings>
        <!--标准日志工厂设置-->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
<!--显示的开启全局缓存-->
        <setting name="cacheEnabled" value="true"/>
    </settings>
<!--可以给实体类取别名-->
    <typeAliases>
        <!--可以指定一个包名,MyBatis会在包名下面搜索需要的Java Bean-->
        <package name="org.example.pojo"/>
    </typeAliases>
    <!--environments 后面的s表示这是一个复数,可以编写多套环境  default表示默认的环境为development-->
    <environments default="development">
        <!--编写一套环境 名称为configuration-->
        <environment id="development">
            <!--jdbc的事务管理-->
            <transactionManager type="JDBC"/>
            <!--配置数据库相关数据-->
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <!--userSSL是一个按权连接 &amp是一个转移符 等同于and  CharacterEncoding=utf-8可以保证输入数据库的数据不乱码-->
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
<!--绑定接口-->
    <mappers>
        <mapper class="org.example.dao.UserCourseGroupConfigurationMapper"/>
    </mappers>
</configuration>

2.4 MyBatis配置类

编写对应的配置类,让我们的项目在启动的时候读取对应的配置文件。

public class MybatisUtils {
    private  static SqlSessionFactory sqlSessionFactory;
    //静态代码块:一旦初始化就加载
    static{
        try {
            //使用Mybatis第一步:获取sqlSessionFactory对象
            //获取资源,直接读到mybatis-config.xml
            String resource = "mybatis-config.xml";
            //需要用到输入流(InputStream) 把resource类加载进来
            InputStream inputStream = Resources.getResourceAsStream(resource);
            //通过build把输入流加载进来
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static SqlSession getSqlSession() {
        //openSession中有自动commit(提交)事务的方法,加上true就能实现
        return sqlSessionFactory.openSession(true);
    }
}

到这里,我们的基本环境就准备好了,可以进行代码的编写。


三:通用的更新语句

我写了一个通用的更新语句,将这个语句写好之后,我们可以去上文提到的,两张表 11个更新接口其中一个写了9个更新接口的mapper.xml文件,看一看这个通用的mapper能够覆盖到多少个。


3.1 通用update语句

    <update id="updateCourseGroupConfiguration">
            update arpro_user_course_group_configuration
            <trim prefix="SET" suffixOverrides=",">
                <if test="reviseParam.infoId != null">info_id = #{reviseParam.infoId}</if>
                <if test="reviseParam.courseId != null">course_id = #{reviseParam.courseId}</if>
                <if test="reviseParam.classId != null">class_id = #{reviseParam.classId}</if>
                <if test="reviseParam.groupId != null">group_id = #{reviseParam.groupId}</if>
                <if test="reviseParam.type != null">type = #{reviseParam.type}</if>
                <if test="reviseParam.isDelete != null">is_delete = #{reviseParam.isDelete}</if>
                <if test="reviseParam.remark != null">remark = #{reviseParam.remark}</if>
                <if test="reviseParam.isMostLike != null">is_like = #{reviseParam.isLike}</if>
            </trim>
            where is_delete = 0
            <if test="conditionParam.infoId != null"> and info_id = #{conditionParam.infoId}</if>
            <if test="conditionParam.courseId != null">and course_id = #{conditionParam.courseId}</if>
            <if test="conditionParam.classId != null">and class_id = #{conditionParam.classId}</if>
            <if test="conditionParam.groupId != null">and group_id = #{conditionParam.groupId}</if>
            <if test="conditionParam.isMostLike != null">and is_like = #{conditionParam.isLike}</if>
            <if test="conditionParam.type != null">and type = #{conditionParam.type}</if>
    </update>

3.2 可以覆盖的更新接口

    <update id="updateGroupRelationship">
        UPDATE arpro_user_course_group_configuration
        set group_id = #{newGroupId}
        WHERE
            group_id = #{oldGroupId} and
            type = #{type}
    </update>
    <update id="updateGroupIsDelete">
        UPDATE arpro_user_course_group_configuration
        SET is_delete=1
        WHERE class_id = #{classId}
          AND course_id = #{courseId}
    </update>
    <update id="updateGroupIsDeleteByCourseId">
        UPDATE arpro_user_course_group_configuration
        SET is_delete=1
        WHERE  course_id = #{courseId}
    </update>
    <update id="updateGroupRelationshipByClassIdAndCourseId">
        UPDATE arpro_user_course_group_configuration
        set group_id = #{groupCourseModel.newGroupId} ,is_like = #{isLike}
        WHERE
            type = #{groupCourseModel.type} and class_id = #{groupCourseModel.classId} and course_id = #{groupCourseModel.courseId} and info_id =#{groupCourseModel.infoId}
    </update>
        <update id="updateCourseIsLike" parameterType="com.tfjy.arprobackend.model.GroupCourseModel">
        UPDATE arpro_user_course_group_configuration
        set  is_like = #{isLike}
        where group_id = #{groupId} and type = #{type}
    </update>
    <update id="updateUserCourseIsLike">
        UPDATE arpro_user_course_group_configuration
        set  is_like = 1
        where info_id = #{infoId} and type = #{type} and group_id != #{groupId}  and is_delete = 0
    </update>
    <update id="updateUserCourseNotLike">
        UPDATE arpro_user_course_group_configuration
        set  is_like = 0
        where info_id = #{infoId} and type = #{type} and group_id = #{groupId}  and is_delete = 0
    </update>
    <update id="updateGroupRelation">
        UPDATE arpro_user_course_group_configuration
        set group_id = #{newGroupId} ,info_id = #{newInfoId}
        WHERE
            type = 1 and class_id = #{classId} and course_id = #{courseId} and info_id = #{oldInfoId}
    </update>

3.3 暂时无法覆盖到的更新接口

    <update id="updateGroupIsDeleteByUserId">
        update `arpro_user_course_group_configuration` set is_delete =1 WHERE course_id=#{courseAndStudentInfoModel.courseId} AND class_id=#{courseAndStudentInfoModel.classId} AND
        info_id IN
        <foreach item="student" collection="studentList" open="(" separator="," close=")">
            #{student}
        </foreach>
    </update>

3.4 测试方法

    @Test
    public void test(){
        //获取数据库连接
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserCourseGroupConfigurationMapper userCourseGroupConfigurationMapper = sqlSession.getMapper(UserCourseGroupConfigurationMapper.class);
        //进行更新操作
        UserCourseGroupConfigurationPojo reviseParam = new UserCourseGroupConfigurationPojo();
        UserCourseGroupConfigurationPojo conditionParam = new UserCourseGroupConfigurationPojo();
        //假删除某个课的某个班的所有信息
        reviseParam.setIsDelete(1);
        conditionParam.setCourseId(BigInteger.valueOf(223667994));
        conditionParam.setClassId(BigInteger.valueOf(56496292));
        //进行调用
        userCourseGroupConfigurationMapper.updateCourseGroupConfiguration(reviseParam,conditionParam);
    }

3.5 分析

从结果上来看,二者的对比是惊人的。一个通用的更新接口,竟然覆盖了我写的更新的9个接口中的8个。

也就是说,在之前的开发中,造了7个重复的轮子。并且至少多了7处使用这些sql语句的地方,多了7个需要维护的代码。

复用思想多么的重要啊,没有这种思想,写一些重复的代码,不但效率低,时间长,还加大了出错的可能。

四:总结

写代码的时候,一定,一定,一定,要考虑维护的问题,考虑复用的问题。这样我们写出的代码才能不仅可以实现功能,而且还容易维护。

接下来我的文章内还会系统的去总结MyBatis的动态sql的写法,大家有兴趣可以持续关注。


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3天前
|
SQL Java 数据库连接
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
MyBatis-Plus是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。本文讲解了最新版MP的使用教程,包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段等核心功能。
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
|
1月前
|
前端开发 Java Apache
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
本文详细讲解了如何整合Apache Shiro与Spring Boot项目,包括数据库准备、项目配置、实体类、Mapper、Service、Controller的创建和配置,以及Shiro的配置和使用。
288 1
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
|
28天前
|
缓存 Java 数据库连接
使用MyBatis缓存的简单案例
MyBatis 是一种流行的持久层框架,支持自定义 SQL 执行、映射及复杂查询。本文介绍了如何在 Spring Boot 项目中集成 MyBatis 并实现一级和二级缓存,以提高查询性能,减少数据库访问。通过具体的电商系统案例,详细讲解了项目搭建、缓存配置、实体类创建、Mapper 编写、Service 层实现及缓存测试等步骤。
|
1月前
|
SQL Java 数据库连接
mybatis使用四:dao接口参数与mapper 接口中SQL的对应和对应方式的总结,MyBatis的parameterType传入参数类型
这篇文章是关于MyBatis中DAO接口参数与Mapper接口中SQL的对应关系,以及如何使用parameterType传入参数类型的详细总结。
30 10
|
1月前
|
SQL Java 数据库连接
Mybatis的<insert>,<update>,<delete>标签用法
这篇文章详细讲解了Mybatis中<insert>, <update>, <delete>标签的使用方法,并提供了示例代码来展示如何执行数据库的增删改操作。
27 0
|
3月前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
2月前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
44 1
|
3月前
|
XML Java 数据库连接
MyBatis中的接口代理机制及其使用
【8月更文挑战第5天】MyBatis的接口代理机制是其核心功能之一,允许通过定义接口并在运行时生成代理对象来操作数据库。开发者声明一个带有`@Mapper`注解的接口,MyBatis则依据接口方法、映射配置(XML或注解)及数据库信息动态生成代理类。此机制分为四步:创建接口、配置映射文件或使用注解、最后在业务逻辑中注入并使用代理对象。这种方式简化了数据库操作,提高了代码的可读性和可维护性。例如,在电商系统中可通过`OrderMapper`处理订单数据,在社交应用中利用`MessageMapper`管理消息,实现高效且清晰的数据库交互。
|
1月前
|
Java 数据库连接 Maven
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和MyBatis Generator,使用逆向工程来自动生成Java代码,包括实体类、Mapper文件和Example文件,以提高开发效率。
105 2
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
|
1月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
52 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块