基于jdbcTemplate 自动sql 生成工具

package com.lining.omni.service;

import com.lining.omni.entity.DcTableEntity;
import com.lining.omni.util.FormatTypeUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;

import java.io.InputStream;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * @Author: chenyuanjie
 * @Date: 2022.1.19
 * @Description:
 */
@Service
@Slf4j
public class DongChaService implements InitializingBean {

    private JdbcTemplate jdbcTemplate = null;

    // 因为在service层所以依赖这个的参数都需要添加这个配置文件 所以这个配置文件先写死
    @Override
    public void afterPropertiesSet() throws Exception {
        Properties properties = new Properties();
        // 使用ClassLoader加载properties配置文件生成对应的输入流
        InputStream in = DongChaService.class.getClassLoader().getResourceAsStream("config/dcData.properties");
        // 使用properties对象加载输入流
        properties.load(in);
        //获取key对应的value值
        String url = properties.getProperty("dcdata.url");
        String username = properties.getProperty("dcdata.username");
        String password = properties.getProperty("dcdata.password");
        String driverClassName = properties.getProperty("dcdata.driverClassName");

        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(driverClassName);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        jdbcTemplate = new JdbcTemplate(dataSource);
    }




    public boolean delete(String table, Map<String, Object> map) {
        if (ObjectUtils.isEmpty(table) || ObjectUtils.isEmpty(map)){
            return false;
        }
        List<DcTableEntity> query = getDcTableEntities(table);
        StringBuffer stringBuffer = new StringBuffer();
        Boolean flag = false;
        stringBuffer.append("delete from ").append(table).append(" where ");
        flag = getaBoolean(map, query, stringBuffer, flag);
        if (flag){
            stringBuffer.append(" 1=1 ");
            String deleteSql = stringBuffer.toString();
            log.info(" deleteSql:{} "+deleteSql);
            jdbcTemplate.update(deleteSql);
            return true;
        }else {
            return false;
        }
    }

    private Boolean getaBoolean(Map<String, Object> map, List<DcTableEntity> query, StringBuffer stringBuffer, Boolean flag) {
        for (Map.Entry<String,Object> entry:map.entrySet()){
            for (DcTableEntity dcTableEntity:query){
                if (dcTableEntity.getColumnName().equals(entry.getKey())){
                    switch (FormatTypeUtils.formatType(dcTableEntity.getDataType())){
                        case "String":
                            if (!ObjectUtils.isEmpty(entry.getValue())){
                                String value = entry.getValue().toString();
                                stringBuffer.append(dcTableEntity.getColumnName()+" = '"+value+"' and ");
                                flag = true;
                            }else {
                                stringBuffer.append(dcTableEntity.getColumnName()+" = '' and ");
                                flag = true;
                            }
                            break;
                        case "Integer":
                            int value = Integer.parseInt("".equals(entry.getValue().toString()) ? "0" : entry.getValue().toString());
                            stringBuffer.append(dcTableEntity.getColumnName()+" = '"+value+"' and ");
                            flag = true;
                            break;
                        case "Double":
                            double doubleValue = Double.parseDouble("".equals(entry.getValue().toString()) ? "0.00" : entry.getValue().toString());
                            stringBuffer.append(dcTableEntity.getColumnName()+" = '"+doubleValue+"' and ");
                            flag = true;
                            break;
                        case "Long":
                            Long longValue = Long.parseLong("".equals(entry.getValue().toString()) ? "0" : entry.getValue().toString());
                            stringBuffer.append(dcTableEntity.getColumnName()+" = '"+longValue+"' and ");
                            flag = true;
                            break;
                        default:
                            if (!ObjectUtils.isEmpty(entry.getValue())){
                                String valueDef = entry.getValue().toString();
                                stringBuffer.append(dcTableEntity.getColumnName()+" = '"+valueDef+"' and ");
                                flag = true;
                            }else{
                                stringBuffer.append(dcTableEntity.getColumnName()+" = '' and ");
                            }
                            break;
                    }
                }
            }
        }
        return flag;
    }

    private List<DcTableEntity> getDcTableEntities(String table) {
        // 查询表结构
        String sql = "select * from information_schema.COLUMNS where TABLE_SCHEMA = (select database()) and TABLE_NAME= '"+table+"'";
        return jdbcTemplate.query(sql, new RowMapper<DcTableEntity>() {
            @Override
            public DcTableEntity mapRow(ResultSet resultSet, int i) throws SQLException {
                DcTableEntity dcTableEntity = new DcTableEntity();
                // 字段名
                dcTableEntity.setColumnName(resultSet.getString("COLUMN_NAME"));
                // 字段类型
                dcTableEntity.setDataType(resultSet.getString("DATA_TYPE"));
                // 是否主键
                dcTableEntity.setColumnKey(resultSet.getString("COLUMN_KEY"));
                return dcTableEntity;
            }
        });
    }

    public boolean insert(String table, Map<String, Object> map) {
        if (ObjectUtils.isEmpty(table) || ObjectUtils.isEmpty(map)){
            return false;
        }
        List<DcTableEntity> query = getDcTableEntities(table);
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append("insert into "+table+" (");
        for (Map.Entry<String,Object> entry:map.entrySet()){
            stringBuffer.append(entry.getKey()).append(",");
        }
        stringBuffer.deleteCharAt(stringBuffer.length()-1);
        stringBuffer.append(" ) ").append("  value ( ");
        for (Map.Entry<String,Object> entry:map.entrySet()) {
            for (DcTableEntity dcTableEntity : query) {
                if (dcTableEntity.getColumnName().equals(entry.getKey())) {
                    switch (FormatTypeUtils.formatType(dcTableEntity.getDataType())){
                        case "String":
                            if (!ObjectUtils.isEmpty(entry.getValue())){
                                String value = entry.getValue().toString();
                                stringBuffer.append("'");
                                stringBuffer.append(value);
                                stringBuffer.append("', ");
                            }else{
                                stringBuffer.append("'");
                                stringBuffer.append("', ");
                            }
                            break;
                        case "Integer":
                            int valueInteger = Integer.parseInt("".equals(entry.getValue().toString()) ? "0" : entry.getValue().toString());
                            stringBuffer.append(valueInteger);
                            stringBuffer.append(", ");
                            break;
                        case "Double":
                            double valueD = Double.parseDouble("".equals(entry.getValue().toString()) ? "0.00" : entry.getValue().toString());
                            stringBuffer.append(valueD);
                            stringBuffer.append(", ");
                            break;
                        case "Long":
                            Long valueL = Long.parseLong("".equals(entry.getValue().toString()) ? "0" : entry.getValue().toString());
                            stringBuffer.append(valueL);
                            stringBuffer.append(", ");
                            break;
                        default:
                            if (!ObjectUtils.isEmpty(entry.getValue())){
                                String valueS = entry.getValue().toString();
                                stringBuffer.append("'");
                                stringBuffer.append(valueS);
                                stringBuffer.append("', ");
                            }else{
                                if (entry.getKey().equals("exec_time")){
                                    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                                    String format = simpleDateFormat.format(new Date());
                                    stringBuffer.append("'");
                                    stringBuffer.append(format);
                                    stringBuffer.append("', ");
                                }else {
                                    stringBuffer.append("'");
                                    stringBuffer.append("', ");
                                }
                            }
                            break;
                    }
                }
            }
        }
        stringBuffer.deleteCharAt(stringBuffer.length()-2);
        stringBuffer.append(" ) ");
        String insertSql = stringBuffer.toString();
        log.info("insertSql :{}",insertSql);
        jdbcTemplate.update(insertSql);
        return true;
    }


    public List<Map<String, Object>> select(List<String> columnNames, String table, Map<String, Object> map) {
        if (ObjectUtils.isEmpty(table) || ObjectUtils.isEmpty(map)){
            return new ArrayList();
        }
        List<DcTableEntity> query = getDcTableEntities(table);
        StringBuffer stringBuffer = new StringBuffer();
        String str = "";
        for (String name : columnNames){
            str = str+name +",";
        }
        String substring = str.substring(0, str.length() - 1);
        stringBuffer.append("select "+substring+" from ").append(table).append(" where ");
        Boolean flag = false;
        flag = getaBoolean(map, query, stringBuffer, flag);
        if (flag){
            stringBuffer.append(" 1=1 ");
            String selectSql = stringBuffer.toString();
            log.info(" selectSql:{} ",selectSql);
            List<Map<String, Object>> maps = jdbcTemplate.queryForList(selectSql);
            return maps;
        }else {
            return new ArrayList();
        }
    }

    public boolean update(String table, Map<String, Object> map) {
        if (ObjectUtils.isEmpty(table) || ObjectUtils.isEmpty(map)){
            return false;
        }
        List<DcTableEntity> query = getDcTableEntities(table);
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append(" update "+table+" set ");
        for (Map.Entry<String,Object> entry:map.entrySet()) {
            for (DcTableEntity dcTableEntity : query) {
                if (dcTableEntity.getColumnName().equals(entry.getKey())) {
                    switch (FormatTypeUtils.formatType(dcTableEntity.getDataType())){
                        case "String":
                            if (!ObjectUtils.isEmpty(entry.getValue())){
                                String value = entry.getValue().toString();
                                stringBuffer.append(entry.getKey()).append(" = ").append("'").append(value).append("'").append(",");
                            }else{
                                stringBuffer.append(entry.getKey()).append(" = ").append("''").append(",");
                            }
                            break;
                        case "Integer":
                            int valuei = Integer.parseInt("".equals(entry.getValue().toString()) ? "0" : entry.getValue().toString());
                            stringBuffer.append(entry.getKey()).append(" = ").append(valuei).append(",");
                            break;
                        case "Double":
                            double valued = Double.parseDouble("".equals(entry.getValue().toString()) ? "0.00" : entry.getValue().toString());
                            stringBuffer.append(entry.getKey()).append(" = ").append(valued).append(",");
                            break;
                        case "Long":
                            Long valueL = Long.parseLong("".equals(entry.getValue().toString()) ? "0" : entry.getValue().toString());
                            stringBuffer.append(entry.getKey()).append(" = ").append(valueL).append(",");
                            break;
                        default:
                            if (!ObjectUtils.isEmpty(entry.getValue())){
                                String valueV = entry.getValue().toString();
                                stringBuffer.append(entry.getKey()).append(" = ").append("'").append(valueV).append("'").append(",");
                            }else {
                                if (entry.getKey().equals("exec_time")){
                                    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                                    String format = simpleDateFormat.format(new Date());
                                    stringBuffer.append(entry.getKey()).append(" = ").append("'"+format+"'").append(",");
                                }else {
                                    stringBuffer.append(entry.getKey()).append(" = ").append("''").append(",");
                                }
                            }
                            break;
                    }
                }
            }
        }
        stringBuffer.deleteCharAt(stringBuffer.length() - 1);
        stringBuffer.append(" where  ");
        Boolean flag = false;
        for (Map.Entry<String,Object> entry:map.entrySet()) {
            for (DcTableEntity dcTableEntity : query) {
                if (dcTableEntity.getColumnName().equals(entry.getKey()) && "PRI".equalsIgnoreCase(dcTableEntity.getColumnKey())) {
                    switch (FormatTypeUtils.formatType(dcTableEntity.getDataType())){
                        case "String":
                            if (!ObjectUtils.isEmpty(entry.getValue())){
                                String value = entry.getValue().toString();
                                stringBuffer.append(dcTableEntity.getColumnName()+" = '"+value+"' and ");
                                flag = true;
                            }else {
                                stringBuffer.append(dcTableEntity.getColumnName()+" = '' and ");
                                flag = true;
                            }
                            break;
                        case "Integer":
                            int value = Integer.parseInt("".equals(entry.getValue().toString()) ? "0" : entry.getValue().toString());
                            stringBuffer.append(dcTableEntity.getColumnName()+" = '"+value+"' and ");
                            flag = true;
                            break;
                        case "Double":
                            double valueDouble = Double.parseDouble("".equals(entry.getValue().toString()) ? "0.00" : entry.getValue().toString());
                            stringBuffer.append(dcTableEntity.getColumnName()+" = '"+valueDouble+"' and ");
                            flag = true;
                            break;
                        case "Long":
                            Long valueLong = Long.parseLong("".equals(entry.getValue().toString()) ? "0" : entry.getValue().toString());
                            stringBuffer.append(dcTableEntity.getColumnName()+" = '"+valueLong+"' and ");
                            flag = true;
                            break;
                        default:
                            if (!ObjectUtils.isEmpty(entry.getValue())){
                                String valueDef = entry.getValue().toString();
                                stringBuffer.append(dcTableEntity.getColumnName()+" = '"+valueDef+"' and ");
                                flag = true;
                            }else {
                                stringBuffer.append(dcTableEntity.getColumnName()+" = '' and ");
                                flag = true;
                            }
                            break;
                    }
                }
            }
        }
        if (flag){
            stringBuffer.append(" 1=1 ");
            String updateSql = stringBuffer.toString();
            log.info("updateSql:{}",updateSql);
            jdbcTemplate.update(updateSql);
            return true;
        }else {
            return false;
        }
    }


}
package com.lining.omni.entity;

import lombok.Data;

@Data
public class DcTableEntity {
    private String tableCatalog;
    private String tableSchema;
    private String tableName;
    private String columnName;
    private Long ordinalPosition;
    private String columnDefault;
    private Boolean isNullanle;
    private String dataType;
    private Long characterMaximumLength;
    private Long characterOctetLength;
    private Long numericPrecision;
    private Long numericScale;
    private String datetimePrecisopm;
    private String characterSetName;
    private String collationName;
    private String columnType;
    private String columnKey;
    private String extra;
    private String privileges;
    private String columnComment;
}
package com.lining.omni.util;

public class FormatTypeUtils {
    // 格式转换
    public static String formatType(String type){
        if (type != null) {
            if (type.startsWith("varchar") || type.startsWith("text")) {
                return "String";
            } else if (type.startsWith("tinyint")) {
                return "int";
            } else if (type.startsWith("int") || type.startsWith("smallint")) {
                return "Integer";
            } else if (type.startsWith("bigint")) {
                return "Long";
            } else if (type.startsWith("decimal")) {
                return "Double";
            } else if (type.startsWith("date") || type.startsWith("datetime")) {
                return "Date";
            } else if (type.equalsIgnoreCase("VARCHAR2") || type.equalsIgnoreCase("char")) {
                return "String";
            } else if (type.equalsIgnoreCase("TIMESTAMP(6)") || type.equalsIgnoreCase("timestamp")) {
                return "Timestamp";
            } else if (type.equalsIgnoreCase("XMLTYPE")) {
                return "String";
            } else {
                return "nontype";
            }
        }else{
            return "";
        }
    }
}

可以生成单表的增删改查 ,多表生成可以自己基于这个自己研究。

调用方式:列出一个吧 messageMap 基本上是要和字段名称对应的 可以自己封装方法变成适用驼峰格式。

 if(flag){
            dongChaService.update(TABLE_NAME,messageMap);
        }else {
            dongChaService.insert(TABLE_NAME,messageMap);
        }

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值