2 Star 1 Fork 0

李翔/sql-gen-tools

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

sql代码生成工具

业务背景

痛点1

业务甩几万甚至几十万数据,要我们确定库内是否有该数据。在没有数仓场景下我们只能使用sql去线上库查,但需要避免大批量查询打爆线上库或者库工具只支持有限的查询。因此该工具支持使用mybatis-plus的api批量生成sql。

痛点2

业务说这几十万数据,库内有的需要订正成逻辑删除状态,且每次只有删除60条才能避免对数据库照成影响,且该数量庞大,就需要工具生成。

例如我们需要生成以下格式sql

update test_table 
set is_delete=1 
where (
    (姓名 = '张三' and gender = '男' and focus = '无' and age = '33') 
    or (姓名 = '李四' and gender = '男' and focus = '好对象' and age = '23') 
    or (姓名 = '王妹妹' and gender = '女' and focus = '特别关注' and age = '22')
    。。。
    以下省略60or
    。。。
)

使用方法

继承com.fg.generaltor.BaseGeneralGenerator,核心方法均在该类里面。将实现类注入spring容器,重写process方法,内部可以使用generalTableMapper调用mybatis-plus的api,即可生成sql脚本,你也可以封装成web接口。

样例类:

  • com.fg.generaltor.SimpleTestGenerator
  • com.fg.generaltor.TestGenerator

你可以自己运行一次,即可通过样例类生成其对应的sql脚本尝鲜。

默认输出sql文件位置

默认输出文件位置在当前jar包目录下,如果你是idea运行的,路径如下:target/classes/fileName.sql

输入图片说明

例:com.fg.generaltor.TestGenerator。

import cn.hutool.core.text.csv.CsvUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.fg.entity.GeneralTable;
import org.springframework.stereotype.Component;
import org.springframework.util.ResourceUtils;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.BiConsumer;
import java.util.stream.Collectors;

/**
 * @author: 王富贵
 * @description: 测试sql生成器
 * @createTime: 2024年04月20日 23:31:41
 */
@Component
public class TestGenerator extends BaseGenerator {
    @Override
    protected void setTableName() {
        super.setTableName("我是动态表哦");
    }

    @Override
    public void process() {
        // 测试1

        // 设置每批数量
        setBatchCount(3);
        setOutPutFileName("TestGenerator");
        setTableName("test_generator_table_name");

        List<Map<String, String>> userMapsList;
        try {
            userMapsList = CsvUtil.getReader().readMapList(new FileReader(ResourceUtils.getFile("classpath:test.csv")));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        /*  目标格式
            update test_table set is_delete = 1
            where (
            (id = '1003' and 姓名 = '张三' and gender = '男' and focus = '无' and age = '33')
            or (id = '2006' and 姓名 = '李四' and gender = '男' and focus = '好对象' and age = '23')
            or (id = '3009' and 姓名 = '王妹妹' and gender = '女' and focus = '特别关注' and age = '22')
            )
         */
        batchUpdate(userMapsList,
                new BiConsumer<UpdateWrapper<GeneralTable>, List<Map<String, String>>>() {
                    @Override
                    public void accept(UpdateWrapper<GeneralTable> updateWrapper, List<Map<String, String>> maps) {
                        updateWrapper.set("is_delete", 1);
                    }
                },
                new BiConsumer<UpdateWrapper<GeneralTable>, Map<String, String>>() {
                    @Override
                    public void accept(UpdateWrapper<GeneralTable> updateWrapper, Map<String, String> stringStringMap) {
                        updateWrapper.or(updateWrapperTmp -> updateWrapperTmp.allEq(stringStringMap));
                    }
                });
        /*  目标格式
            select id,name,age,email from test_table where (id in (1003,2006,3009))
         */
        batchSelect(userMapsList,
                new BiConsumer<QueryWrapper<GeneralTable>, List<Map<String, String>>>() {
                    @Override
                    public void accept(QueryWrapper<GeneralTable> queryWrapper, List<Map<String, String>> maps) {
                        List<Long> ids = maps.stream()
                                .map(map -> map.get("id")) // 提取每个 Map 对象的 id 值
                                .filter(id -> id != null && id.matches("\\d+")) // 过滤非空且符合数字格式的 id
                                .map(Long::parseLong) // 将字符串 id 转换为 Long 类型
                                .collect(Collectors.toList()); // 收集成一个 List<Long>
                        queryWrapper.in("id", ids);
                    }
                },
                (BiConsumer<QueryWrapper<GeneralTable>, Map<String, String>>) (queryWrapper, userMaps) -> {
                }
        );


        /**
         * 测试2
         */
        // 设置每批数量
        setBatchCount(60);
        try {
            userMapsList = CsvUtil.getReader().readMapList(new FileReader(ResourceUtils.getFile("classpath:test.csv")));
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        }
        batchUpdate(userMapsList,
                new BiConsumer<UpdateWrapper<GeneralTable>, List<Map<String, String>>>() {
                    @Override
                    public void accept(UpdateWrapper<GeneralTable> updateWrapper, List<Map<String, String>> maps) {
                        updateWrapper.set("is_delete", 1);
                    }
                },
                new BiConsumer<UpdateWrapper<GeneralTable>, Map<String, String>>() {
                    @Override
                    public void accept(UpdateWrapper<GeneralTable> updateWrapper, Map<String, String> stringStringMap) {
                        updateWrapper.or(updateWrapperTmp -> updateWrapperTmp.allEq(stringStringMap));
                    }
                });

        /**
         * 测试3
         */
        // 动态表名实现表名变更
        setTableName("tools");
        QueryWrapper<GeneralTable> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("id", 1).eq("email_name", "li");
        generalTableMapper.delete(queryWrapper);

        /**
         * 测试4
         */
        UpdateWrapper<GeneralTable> updateWrapper = new UpdateWrapper<>();
        ArrayList<Integer> ids = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            ids.add(i);
        }
        updateWrapper.in("id", ids);
        updateWrapper.set("name", "富??贵");
        generalTableMapper.update(updateWrapper);
    }
}

空文件

简介

生成sql脚本项目 展开 收起
Java
取消

发行版

暂无发行版

贡献者

全部

近期动态

不能加载更多了
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/lmlx66/sql-gen-tools.git
git@gitee.com:lmlx66/sql-gen-tools.git
lmlx66
sql-gen-tools
sql-gen-tools
master

搜索帮助