案例27-单表从9个更新语句调整为2个

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 单表从9个更新语句调整为2个

一:背景介绍

       在项目开发的过程中,我们编写sql语句的时候通常不会考虑到我要编写的sql语句之前是不是有人写过或者是不是可以复用别人的sql语句。而是直接我用了什么业务就直接写一个对应的sql语句。甚至有的时候我们自己写了之后都不清楚了。这样就没有使代码进行复用,也会带来代码带以维护的问题。2eb102e74bf74ccaab7b1bac15ee3084.png

二:思路&方案

       1.编写通用的sql语句,使其满足百分之九十的sql语句。

       2.让代码的复用性更高。减少后期代码的维护成本。

三:过程

1.项目结构

             

d61580b56efd48538190d6e3beb03435.png 

       2.准备一个普通的maven项目,部署好mysql数据库

       3.在项目中引入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>

 4.在db.properties配置文件中添加连接数据库的语句

driver=com.mysql.jdbc.Driver
url=jdbc:mysql:服务器IP:3306/wzill?useSSL=false&;useUnicode=true;CharacterEncoding=UTF-8
username=数据库账号
password=数据库密码

       5.编写MyBitis配置文件

<?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>
      <!--<typeAlias type="com.kuang.pojo.User" alias="User"/>-->
        <!--可以指定一个包名,MyBatis会在包名下面搜索需要的Java Bean-->
        <package name="com.wzl.CommonUse.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="com.wzl.CommonUse.dao.UserMapper"/>
    </mappers>
</configuration>

6.编写Mysql配置类

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

       7.编写通用Update语句

<update id="updateUser">
        update user
        <trim prefix="SET" suffixOverrides=",">
            <if test="userPojo.uid != null">uid = #{userPojo.uid}</if>
            <if test="userPojo.id != null">id = #{userPojo.id}</if>
            <if test="userPojo.name != null">name = #{userPojo.name}</if>
            <if test="userPojo.age != null">age = #{userPojo.age}</if>
            <if test="userPojo.username != null">username = #{userPojo.username}</if>
            <if test="userPojo.password != null">password = #{userPojo.password}</if>
            <if test="userPojo.email != null">email = #{userPojo.email}</if>
            <if test="userPojo.phone != null">phone = #{userPojo.phone}</if>
            <if test="userPojo.addr != null">addr = #{userPojo.addr}</if>
            <if test="userPojo.state != null">state = #{userPojo.state}</if>
        </trim>
        where state = 2
        <if test="conditionParam.addr != null"> and addr = #{conditionParam.addr}</if>
        <if test="conditionParam.phone != null">and phone = #{conditionParam.phone}</if>
        <if test="conditionParam.name != null">and name = #{conditionParam.name}</if>
        <if test="conditionParam.age != null">and age = #{conditionParam.age}</if>
        <if test="conditionParam.username != null">and username = #{conditionParam.username}</if>
        <if test="conditionParam.password != null">and password = #{conditionParam.password}</if>
    </update>

这样我们在编写对于 user表中的数据进行更新的时候只需要这一个通用的语句就可以了。涉及到批量更新的话,还是需要新的sql语句的。相信通过不断的学习,我们也可以把批量的和单独的进行一个代码的复用。

       8.项目启动类

public class Client{
    @Test
    public void test(){
        //获取数据库连接
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        //进行更新操作
        UserPojo UserPojo1 = new UserPojo();
        UserPojo UserPojo2 = new UserPojo();
        //假删除某个课的某个班的所有信息
        UserPojo1.setUsername("223667994");
        UserPojo2.setUsername("bbb");
        //进行调用
        userMapper.updateUser(UserPojo1,UserPojo2);
    }
}

四:总结

       在写代码之前先去看一下项目中是否有类似的业务逻辑,是否有可以复用的代码。来减少我们做无用功。代码的复用对于我们后期对于项目维护的成本非常低。


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
26天前
|
SQL 关系型数据库 MySQL
项目中遇到一张900w的数据表把原先要花费17s执行的SQL优化到300ms经验加100哈哈哈
项目中遇到一张900w的数据表把原先要花费17s执行的SQL优化到300ms经验加100哈哈哈
23 1
|
3月前
|
SQL
幂等修改表增加一列的sql语句
这个 SQL 查询用于修改名为 `t1` 的表,通过添加一个名为 `b` 的新列,并指定数据类型。`IF NOT EXISTS` 子句确保只有在表中不存在该列的情况下才会添加。 在你的查询中,`<数据类型>` 应该被替换为你想要的具体数据类型(例如,INT,VARCHAR等)。以下是使用 INT 数据类型的示例: ```sql ALTER TABLE t1 ADD COLUMN IF NOT EXISTS b INT; ``` 请根据你的需求选择合适的数据类型。这个查询的作用是在表 `t1` 中添加一个名为 `b` 的新列,如果该列尚不存在的话。
|
24天前
|
缓存 关系型数据库 MySQL
MySQL查询优化:提速查询效率的13大秘籍(合理使用索引合并、优化配置参数、使用分区优化性能、避免不必要的排序和group by操作)(下)
MySQL查询优化:提速查询效率的13大秘籍(合理使用索引合并、优化配置参数、使用分区优化性能、避免不必要的排序和group by操作)(下)
|
5月前
|
SQL 关系型数据库 MySQL
sql处理重复的列,更好理清分组和分区
sql处理重复的列,更好理清分组和分区
46 0
|
9月前
|
存储 关系型数据库 MySQL
mysql百万级数量插入、删除、分组、分页、更新语句优化
mysql百万级数量插入、删除、分组、分页、更新语句优化
|
10月前
|
JavaScript 前端开发 API
【项目数据优化三】长列表数据优化
【项目数据优化三】长列表数据优化
91 0
|
SQL Oracle 关系型数据库
【SQL开发实战技巧】系列(八):聊聊如何插入数据时比约束更灵活的限制数据插入以及怎么一个insert语句同时插入多张表
插入数据、阻止对某几列插入的实现、复制表的定义和数据以及注意事项、比创建约束功能更强大!用 WITH CHECK OPTION限制数据录入、如何一个insert将数据同时插入多个表【SQL开发实战技巧】这一系列博主当作复习旧知识来进行写作,毕竟SQL开发在数据分析场景非常重要且基础,面试也会经常问SQL开发和调优经验,相信当我写完这一系列文章,也能再有所收获,未来面对SQL面试也能游刃有余~。但是!ORA - 01723 : 不允许长度为 0 的列。
【SQL开发实战技巧】系列(八):聊聊如何插入数据时比约束更灵活的限制数据插入以及怎么一个insert语句同时插入多张表
|
SQL 数据库管理
【SQL开发实战技巧】系列(九):一个update误把其他列数据更新成空了?Merge改写update!给你五种删除重复数据的写法!
本篇文章讲解的主要内容是:***你有没有经历过一个update把其他列数据清空了、使用merge更新合并记录、删除违反参照完整性的记录、给你五种删除重复数据的写法*** 【SQL开发实战技巧】这一系列博主当作复习旧知识来进行写作,毕竟SQL开发在数据分析场景非常重要且基础,面试也会经常问SQL开发和调优经验,相信当我写完这一系列文章,也能再有所收获,未来面对SQL面试也能游刃有余~。
【SQL开发实战技巧】系列(九):一个update误把其他列数据更新成空了?Merge改写update!给你五种删除重复数据的写法!
|
SQL 关系型数据库 MySQL
[MySQL优化案例]系列 — 索引、提交频率对InnoDB表写入速度的影响
[MySQL优化案例]系列 — 索引、提交频率对InnoDB表写入速度的影响
103 0
[MySQL优化案例]系列 — 索引、提交频率对InnoDB表写入速度的影响