You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					643 lines
				
				21 KiB
			
		
		
			
		
	
	
					643 lines
				
				21 KiB
			| 
											3 years ago
										 | package com.ynxbd.common.config.db;
 | ||
|  | 
 | ||
|  | import com.alibaba.druid.filter.Filter;
 | ||
|  | import com.alibaba.druid.filter.stat.StatFilter;
 | ||
|  | import com.alibaba.druid.pool.DruidDataSource;
 | ||
|  | import com.alibaba.druid.wall.WallConfig;
 | ||
|  | import com.alibaba.druid.wall.WallFilter;
 | ||
|  | import com.ynxbd.common.helper.ProperHelper;
 | ||
|  | import com.ynxbd.common.helper.common.ErrorHelper;
 | ||
|  | import lombok.extern.slf4j.Slf4j;
 | ||
|  | import org.apache.commons.beanutils.BeanUtils;
 | ||
|  | import org.apache.commons.beanutils.BeanUtilsBean;
 | ||
|  | import org.apache.commons.lang3.ObjectUtils;
 | ||
|  | 
 | ||
|  | import java.lang.reflect.Field;
 | ||
|  | import java.sql.*;
 | ||
|  | import java.util.ArrayList;
 | ||
|  | import java.util.List;
 | ||
|  | import java.util.Map;
 | ||
|  | 
 | ||
|  | 
 | ||
|  | @Slf4j
 | ||
|  | public class DataBase {
 | ||
|  | 
 | ||
|  |     @FunctionalInterface
 | ||
|  |     public interface IPS {
 | ||
|  |         void setParams(PreparedStatement ps) throws SQLException;
 | ||
|  |     }
 | ||
|  | 
 | ||
|  |     static {
 | ||
|  |         // 解决BigDecimal类型转化报错
 | ||
|  |         BeanUtilsBean.getInstance().getConvertUtils().register(false, false, 0);
 | ||
|  |         dataSource = init();
 | ||
|  |     }
 | ||
|  | 
 | ||
|  |     private static DruidDataSource dataSource;
 | ||
|  | 
 | ||
|  |     protected synchronized static ProperHelper getConfig() {
 | ||
|  |         return new ProperHelper().read("druid-config.properties");
 | ||
|  |     }
 | ||
|  | 
 | ||
|  |     private static synchronized DruidDataSource init() {
 | ||
|  |         if (dataSource != null) {
 | ||
|  |             return dataSource;
 | ||
|  |         }
 | ||
|  |         final DruidDataSource dataSource = new DruidDataSource();
 | ||
|  |         try {
 | ||
|  |             ProperHelper config = getConfig();
 | ||
|  |             dataSource.setDriverClassName(config.getString("master.driverClassName"));
 | ||
|  |             dataSource.setUrl(config.getString("master.jdbcUrl"));
 | ||
|  |             dataSource.setUsername(config.getString("master.username"));
 | ||
|  |             dataSource.setPassword(config.getString("master.password"));
 | ||
|  |             // 连接池配置
 | ||
|  |             Integer min = config.getInteger("master.minIdle");
 | ||
|  |             if (min != null) {
 | ||
|  |                 dataSource.setMinIdle(min);
 | ||
|  |             }
 | ||
|  |             Integer max = config.getInteger("master.maxActive");
 | ||
|  |             if (max != null) {
 | ||
|  |                 dataSource.setMaxActive(max);
 | ||
|  |             }
 | ||
|  |             Integer initialSize = config.getInteger("master.initialSize");
 | ||
|  |             if (initialSize != null) {
 | ||
|  |                 dataSource.setInitialSize(initialSize);
 | ||
|  |             }
 | ||
|  |             dataSource.setMaxWait(60 * 1000); // 60s
 | ||
|  |             // 异步初始化连接
 | ||
|  | //            dataSource.addDataSourceProperty("serverTimezone", ZoneId.systemDefault());
 | ||
|  |             dataSource.setAsyncInit(true);
 | ||
|  |             dataSource.setValidationQuery("SELECT 1");
 | ||
|  |             // 安全性
 | ||
|  |             dataSource.setTestWhileIdle(true);
 | ||
|  |             dataSource.setTestOnBorrow(false);
 | ||
|  |             dataSource.setTestOnReturn(false);
 | ||
|  |             // 打开PSCache,并且指定每个连接上PSCache的大小
 | ||
|  |             dataSource.setPoolPreparedStatements(true);
 | ||
|  |             dataSource.setMaxPoolPreparedStatementPerConnectionSize(120);
 | ||
|  |             // 连接泄露检查
 | ||
|  |             dataSource.setRemoveAbandonedTimeoutMillis(300000);
 | ||
|  |             // 关闭连接时输出错误日志,这样出现连接泄露时可以通过错误日志定位忘记关闭连接的位置
 | ||
|  |             dataSource.setLogAbandoned(true);
 | ||
|  |             dataSource.setMinEvictableIdleTimeMillis(300000);
 | ||
|  |             // 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
 | ||
|  |             dataSource.setTimeBetweenConnectErrorMillis(60000);
 | ||
|  | 
 | ||
|  |             dataSource.setFilters("stat,wall");
 | ||
|  |             // statFilter----------------------------
 | ||
|  |             StatFilter statFilter = new StatFilter();
 | ||
|  |             statFilter.setDbType("mysql");
 | ||
|  |             statFilter.setLogSlowSql(true);
 | ||
|  |             statFilter.setSlowSqlMillis(3000);
 | ||
|  | 
 | ||
|  |             WallConfig wallConfig = new WallConfig();
 | ||
|  |             // 允许执行多条语句
 | ||
|  |             wallConfig.setMultiStatementAllow(true);
 | ||
|  |             wallConfig.setNoneBaseStatementAllow(true);
 | ||
|  | 
 | ||
|  |             // 禁止创建表
 | ||
|  |             wallConfig.setCreateTableAllow(false);
 | ||
|  |             // 禁止修改表
 | ||
|  |             wallConfig.setDropTableAllow(false);
 | ||
|  |             // 禁止执行Alter Table语句
 | ||
|  |             wallConfig.setAlterTableAllow(false);
 | ||
|  | 
 | ||
|  |             // wallFilter-----------------------------
 | ||
|  |             WallFilter wallFilter = new WallFilter();
 | ||
|  |             wallFilter.setDbType("mysql");
 | ||
|  |             wallFilter.setConfig(wallConfig);
 | ||
|  | 
 | ||
|  |             List<Filter> filters = new ArrayList<>();
 | ||
|  |             filters.add(statFilter);
 | ||
|  |             filters.add(wallFilter);
 | ||
|  |             dataSource.setProxyFilters(filters);
 | ||
|  |         } catch (SQLException e) {
 | ||
|  |             e.printStackTrace();
 | ||
|  |         }
 | ||
|  |         return dataSource;
 | ||
|  |     }
 | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * 获取连接
 | ||
|  |      */
 | ||
|  |     public static Connection getConnection() {
 | ||
|  |         Connection conn = null;
 | ||
|  |         try {
 | ||
|  |             if (dataSource == null) {
 | ||
|  |                 dataSource = init();
 | ||
|  |             }
 | ||
|  |             conn = dataSource.getConnection();
 | ||
|  |         } catch (SQLException e) {
 | ||
|  |             log.error("MySQL数据库连接失败!{}, {}", dataSource.getUrl(), e.getMessage());
 | ||
|  |             if (dataSource != null) {
 | ||
|  |                 dataSource.close();
 | ||
|  |                 dataSource = null;
 | ||
|  |             }
 | ||
|  |         }
 | ||
|  |         return conn;
 | ||
|  |     }
 | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * prepareStatement 赋值查询
 | ||
|  |      *
 | ||
|  |      * @param clazz 集合类型
 | ||
|  |      * @param ips   设置占位符数据
 | ||
|  |      * @param <T>   泛型
 | ||
|  |      * @return 集合
 | ||
|  |      */
 | ||
|  |     public static <T> List<T> select(String sql, Class<T> clazz, IPS ips) {
 | ||
|  |         return select(getConnection(), sql, clazz, ips);
 | ||
|  |     }
 | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * 拼接sql语句查询
 | ||
|  |      *
 | ||
|  |      * @param sql   SQL语句
 | ||
|  |      * @param clazz 集合类型
 | ||
|  |      * @param <T>   泛型
 | ||
|  |      * @return 泛型集合
 | ||
|  |      */
 | ||
|  |     public static <T> List<T> select(String sql, Class<T> clazz) {
 | ||
|  |         return select(getConnection(), sql, clazz, null);
 | ||
|  |     }
 | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * 拼接sql语句查询
 | ||
|  |      *
 | ||
|  |      * @param sql   SQL语句
 | ||
|  |      * @param clazz 集合类型
 | ||
|  |      * @param <T>   泛型
 | ||
|  |      * @return 泛型集合
 | ||
|  |      */
 | ||
|  |     public static <T> T selectOne(String sql, Class<T> clazz, IPS ips) {
 | ||
|  |         List<T> dataList = select(getConnection(), sql, clazz, ips);
 | ||
|  |         int size = dataList.size();
 | ||
|  |         if (size == 1) {
 | ||
|  |             return dataList.get(0);
 | ||
|  |         }
 | ||
|  |         if (size > 1) {
 | ||
|  |             throw new RuntimeException("select one but fount " + size);
 | ||
|  |         }
 | ||
|  |         return null;
 | ||
|  |     }
 | ||
|  | 
 | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * [私有]查询方法封装
 | ||
|  |      *
 | ||
|  |      * @param conn  连接
 | ||
|  |      * @param sql   sql语句
 | ||
|  |      * @param clazz 类
 | ||
|  |      * @param ips   ips
 | ||
|  |      */
 | ||
|  |     protected static <T> List<T> select(Connection conn, String sql, Class<T> clazz, IPS ips) {
 | ||
|  |         List<T> list = new ArrayList<>();
 | ||
|  |         if (ips == null) {
 | ||
|  |             Statement stmt = null;
 | ||
|  |             ResultSet rs = null;
 | ||
|  |             try {
 | ||
|  |                 stmt = conn.createStatement();
 | ||
|  |                 rs = stmt.executeQuery(sql);
 | ||
|  |                 list = executeSelect(clazz, rs);
 | ||
|  |             } catch (Exception e) {
 | ||
|  |                 ErrorHelper.println(e);
 | ||
|  |             } finally {
 | ||
|  |                 close(rs, stmt, conn);
 | ||
|  |             }
 | ||
|  |         } else {
 | ||
|  |             PreparedStatement ps = null;
 | ||
|  |             ResultSet rs = null;
 | ||
|  |             try {
 | ||
|  |                 ps = conn.prepareStatement(sql);
 | ||
|  |                 ips.setParams(ps);
 | ||
|  |                 rs = ps.executeQuery();
 | ||
|  |                 list = executeSelect(clazz, rs);
 | ||
|  |             } catch (Exception e) {
 | ||
|  |                 ErrorHelper.println(e);
 | ||
|  |             } finally {
 | ||
|  |                 close(rs, ps, conn);
 | ||
|  |             }
 | ||
|  |         }
 | ||
|  |         return list;
 | ||
|  |     }
 | ||
|  | 
 | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * 核心-执行查询
 | ||
|  |      *
 | ||
|  |      * @param clazz 类型
 | ||
|  |      * @param rs    rs
 | ||
|  |      * @return 集合
 | ||
|  |      */
 | ||
|  |     private static <T> List<T> executeSelect(Class<T> clazz, ResultSet rs) throws Exception {
 | ||
|  |         List<T> list = new ArrayList<>();
 | ||
|  |         Field[] fields = clazz.getDeclaredFields();
 | ||
|  | 
 | ||
|  |         Class<? super T> superclass = clazz.getSuperclass();
 | ||
|  |         Field[] superFields = {};
 | ||
|  |         if (superclass != null) {
 | ||
|  |             superFields = superclass.getDeclaredFields();
 | ||
|  |         }
 | ||
|  |         T bean;
 | ||
|  |         ResultSetMetaData rmd;
 | ||
|  |         String colName;
 | ||
|  |         Object value;
 | ||
|  |         Class<?> valClazz;
 | ||
|  |         boolean isBreak;
 | ||
|  |         while (rs.next()) {
 | ||
|  |             bean = clazz.newInstance();
 | ||
|  |             rmd = rs.getMetaData();
 | ||
|  |             for (int i = 1; i <= rmd.getColumnCount(); i++) {
 | ||
|  |                 colName = rmd.getColumnLabel(i).toLowerCase();
 | ||
|  |                 value = rs.getObject(i);
 | ||
|  |                 if (value == null) {
 | ||
|  |                     continue;
 | ||
|  |                 }
 | ||
|  |                 valClazz = value.getClass();
 | ||
|  |                 isBreak = false;
 | ||
|  |                 for (Field f : fields) {
 | ||
|  |                     f.setAccessible(true);
 | ||
|  |                     if (f.getName().toLowerCase().equals(colName)) {
 | ||
|  |                         isBreak = true;
 | ||
|  |                         if (java.time.LocalDateTime.class == valClazz && java.time.LocalDateTime.class != f.getType()) {
 | ||
|  |                             BeanUtils.setProperty(bean, f.getName(), rs.getTimestamp(i));
 | ||
|  |                         } else {
 | ||
|  |                             BeanUtils.setProperty(bean, f.getName(), value);
 | ||
|  |                         }
 | ||
|  |                         break;
 | ||
|  |                     }
 | ||
|  |                 }
 | ||
|  | 
 | ||
|  |                 if (isBreak) {
 | ||
|  |                     continue;
 | ||
|  |                 }
 | ||
|  | 
 | ||
|  |                 for (Field f : superFields) {
 | ||
|  |                     f.setAccessible(true);
 | ||
|  |                     if (f.getName().toLowerCase().equals(colName)) {
 | ||
|  |                         if (java.time.LocalDateTime.class == valClazz && java.time.LocalDateTime.class != f.getType()) {
 | ||
|  |                             BeanUtils.setProperty(bean, f.getName(), rs.getTimestamp(i));
 | ||
|  |                         } else {
 | ||
|  |                             BeanUtils.setProperty(bean, f.getName(), value);
 | ||
|  |                         }
 | ||
|  |                         break;
 | ||
|  |                     }
 | ||
|  |                 }
 | ||
|  |             }
 | ||
|  |             list.add(bean);
 | ||
|  |         }
 | ||
|  |         return list;
 | ||
|  |     }
 | ||
|  | 
 | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * 查询count
 | ||
|  |      *
 | ||
|  |      * @param sql SQL语句
 | ||
|  |      * @param ips 通过匿名函数设定占位符,可为空
 | ||
|  |      * @return clazz类型的数据
 | ||
|  |      */
 | ||
|  |     public static int selectCount(String sql, IPS ips) {
 | ||
|  |         int count = 0;
 | ||
|  |         Connection conn = getConnection();
 | ||
|  |         PreparedStatement ps = null;
 | ||
|  |         ResultSet rs = null;
 | ||
|  |         try {
 | ||
|  |             ps = conn.prepareStatement(sql);
 | ||
|  |             if (ips != null) ips.setParams(ps);
 | ||
|  |             rs = ps.executeQuery();
 | ||
|  |             if (rs.next()) {
 | ||
|  |                 count = rs.getInt(1);
 | ||
|  |             }
 | ||
|  |         } catch (Exception e) {
 | ||
|  |             ErrorHelper.println(e);
 | ||
|  |         } finally {
 | ||
|  |             close(rs, ps, conn);
 | ||
|  |         }
 | ||
|  |         return count;
 | ||
|  |     }
 | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * 查询某列
 | ||
|  |      *
 | ||
|  |      * @param sql   SQL语句
 | ||
|  |      * @param clazz 指定查询的数据的类型
 | ||
|  |      * @param ips   通过匿名函数设定占位符,可为空
 | ||
|  |      * @return clazz类型的数据
 | ||
|  |      */
 | ||
|  |     public static <T> T selectByColumn(String sql, Class<T> clazz, IPS ips) {
 | ||
|  |         Connection conn = getConnection();
 | ||
|  |         PreparedStatement ps = null;
 | ||
|  |         ResultSet rs = null;
 | ||
|  |         T value = null;
 | ||
|  |         try {
 | ||
|  |             ps = conn.prepareStatement(sql);
 | ||
|  |             if (ips != null) ips.setParams(ps);
 | ||
|  |             rs = ps.executeQuery();
 | ||
|  |             if (rs.next()) {
 | ||
|  |                 value = rs.getObject(1, clazz);
 | ||
|  |             }
 | ||
|  |         } catch (Exception e) {
 | ||
|  |             ErrorHelper.println(e);
 | ||
|  |         } finally {
 | ||
|  |             close(rs, ps, conn);
 | ||
|  |         }
 | ||
|  |         return value;
 | ||
|  |     }
 | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * 查询单个数据,主要用于count等单个字段的查询
 | ||
|  |      *
 | ||
|  |      * @param sql   SQL语句
 | ||
|  |      * @param clazz 指定查询的数据的类型
 | ||
|  |      * @return clazz类型的数据
 | ||
|  |      */
 | ||
|  |     public static <T> T selectByColumn(String sql, Class<T> clazz) {
 | ||
|  |         return selectByColumn(sql, clazz, null);
 | ||
|  |     }
 | ||
|  | 
 | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * 添加成功后返回自增ID
 | ||
|  |      *
 | ||
|  |      * @param sql SQL语句
 | ||
|  |      * @param ips ips
 | ||
|  |      * @return 自增ID
 | ||
|  |      */
 | ||
|  |     public static int insertGetId(String sql, IPS ips) {
 | ||
|  |         Connection conn = null;
 | ||
|  |         PreparedStatement ps = null;
 | ||
|  |         ResultSet rs = null;
 | ||
|  |         int id = 0;
 | ||
|  |         try {
 | ||
|  |             conn = getConnection();
 | ||
|  |             ps = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
 | ||
|  |             if (ips != null) ips.setParams(ps);
 | ||
|  |             ps.executeUpdate();
 | ||
|  | 
 | ||
|  |             rs = ps.getGeneratedKeys();
 | ||
|  |             if (rs.next()) {
 | ||
|  |                 id = rs.getInt(1);
 | ||
|  |             }
 | ||
|  |             ps.clearBatch();
 | ||
|  |         } catch (SQLException e) {
 | ||
|  |             ErrorHelper.println(e);
 | ||
|  |             try {
 | ||
|  |                 conn.rollback();
 | ||
|  |             } catch (SQLException err) {
 | ||
|  |                 ErrorHelper.println(err);
 | ||
|  |             }
 | ||
|  |             return 0;
 | ||
|  |         } finally {
 | ||
|  |             close(rs, ps, conn);
 | ||
|  |         }
 | ||
|  |         return id;
 | ||
|  |     }
 | ||
|  | 
 | ||
|  | //    public static void main(String[] args) {
 | ||
|  | //        List<String> testList = new ArrayList<>();
 | ||
|  | //        for (int i = 0; i < 500; i++) {
 | ||
|  | //            testList.add(String.valueOf(i));
 | ||
|  | //        }
 | ||
|  | //        long begTime = System.currentTimeMillis(); // 开始时间
 | ||
|  | //        String sql = "insert into a (a, date, time, dateTime,timesTamp) values(?, now(), now(), now(), now())";
 | ||
|  | //        DataBase.insertBatch(sql, ps -> {
 | ||
|  | //            for (int i = 0; i < testList.size(); i++) {
 | ||
|  | //                if (i == 100) {
 | ||
|  | //                    ps.setString(1, String.valueOf((1 / 0)));
 | ||
|  | //                } else {
 | ||
|  | //                    System.out.println("Add");
 | ||
|  | //                    ps.setString(1, testList.get(i));
 | ||
|  | //                }
 | ||
|  | //                ps.addBatch();
 | ||
|  | //            }
 | ||
|  | //        });
 | ||
|  | //
 | ||
|  | //        long endTime = System.currentTimeMillis(); // 结束时间
 | ||
|  | //        log.info("耗时:{}", ((endTime - begTime) / 1000) + "s(" + (endTime - begTime) + "ms)");
 | ||
|  | //    }
 | ||
|  | 
 | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * 插入数据
 | ||
|  |      *
 | ||
|  |      * @param sql SQL语句
 | ||
|  |      * @param ips 设置占位符数据
 | ||
|  |      * @return 修改成功行数
 | ||
|  |      */
 | ||
|  |     public static int insertBatch(String sql, IPS ips) {
 | ||
|  |         int rows = 0;
 | ||
|  |         try (Connection conn = getConnection(); PreparedStatement ps = conn.prepareStatement(sql)) {
 | ||
|  |             conn.setAutoCommit(false);
 | ||
|  |             if (ips != null) ips.setParams(ps);
 | ||
|  |             rows = ps.executeBatch().length;
 | ||
|  |             ps.clearBatch();
 | ||
|  |             conn.commit();
 | ||
|  |         } catch (Exception e) {
 | ||
|  |             ErrorHelper.println(e);
 | ||
|  |         }
 | ||
|  |         return rows;
 | ||
|  |     }
 | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * 插入数据
 | ||
|  |      *
 | ||
|  |      * @param sql SQL语句
 | ||
|  |      * @param ips 设置占位符数据
 | ||
|  |      * @return 修改成功行数
 | ||
|  |      */
 | ||
|  |     public static int insert(String sql, IPS ips) {
 | ||
|  |         return update(sql, ips);
 | ||
|  |     }
 | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * 插入数据
 | ||
|  |      *
 | ||
|  |      * @param sql SQL语句
 | ||
|  |      * @param ips 设置占位符数据
 | ||
|  |      * @return 修改成功行数
 | ||
|  |      */
 | ||
|  |     public static int delete(String sql, IPS ips) {
 | ||
|  |         return update(sql, ips);
 | ||
|  |     }
 | ||
|  | 
 | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * 增、删、改
 | ||
|  |      *
 | ||
|  |      * @param sql SQL语句
 | ||
|  |      * @param ips 设置占位符数据
 | ||
|  |      * @return 修改成功行数
 | ||
|  |      */
 | ||
|  |     public static int update(String sql, IPS ips) {
 | ||
|  |         int rows = 0;
 | ||
|  |         try (Connection conn = getConnection(); PreparedStatement ps = conn.prepareStatement(sql)) {
 | ||
|  |             if (ips != null) ips.setParams(ps);
 | ||
|  |             rows = ps.executeUpdate();
 | ||
|  |         } catch (Exception e) {
 | ||
|  |             ErrorHelper.println(e);
 | ||
|  |         }
 | ||
|  |         return rows;
 | ||
|  |     }
 | ||
|  | 
 | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * 关闭数据库
 | ||
|  |      *
 | ||
|  |      * @param conn 数据库连接
 | ||
|  |      */
 | ||
|  |     public static void close(Connection conn) {
 | ||
|  |         close(null, null, conn);
 | ||
|  |     }
 | ||
|  | 
 | ||
|  |     public static void close(Statement stat, Connection conn) {
 | ||
|  |         close(null, stat, conn);
 | ||
|  |     }
 | ||
|  | 
 | ||
|  |     public static void close(ResultSet rs, Connection conn) {
 | ||
|  |         close(rs, null, conn);
 | ||
|  |     }
 | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * 关闭连接-先开后关
 | ||
|  |      *
 | ||
|  |      * @param rs   rs
 | ||
|  |      * @param stat ps
 | ||
|  |      * @param conn conn
 | ||
|  |      */
 | ||
|  |     public static void close(ResultSet rs, Statement stat, Connection conn) {
 | ||
|  |         if (rs != null) {
 | ||
|  |             try {
 | ||
|  |                 rs.close();
 | ||
|  |             } catch (SQLException e) {
 | ||
|  |                 ErrorHelper.println(e);
 | ||
|  |             }
 | ||
|  |         }
 | ||
|  | 
 | ||
|  |         if (stat != null) {
 | ||
|  |             try {
 | ||
|  |                 stat.close();
 | ||
|  |             } catch (SQLException e) {
 | ||
|  |                 ErrorHelper.println(e);
 | ||
|  |             }
 | ||
|  |         }
 | ||
|  | 
 | ||
|  |         if (conn != null) {
 | ||
|  |             try {
 | ||
|  |                 conn.close();
 | ||
|  |             } catch (SQLException e) {
 | ||
|  |                 ErrorHelper.println(e);
 | ||
|  |             }
 | ||
|  |         }
 | ||
|  |     }
 | ||
|  | 
 | ||
|  | 
 | ||
|  |     public static int updateBatch(String tableName, Map<String, List<Map<String, Object>>> setCaseList, List<String> ids) {
 | ||
|  |         return updateBatch(tableName, null, setCaseList, null, ids);
 | ||
|  |     }
 | ||
|  | 
 | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * 批量修改
 | ||
|  |      *
 | ||
|  |      * @param tableName     表名
 | ||
|  |      * @param setMap        统一修改的值
 | ||
|  |      * @param setByCaseList 分批修改的值
 | ||
|  |      * @param whereMap      条件
 | ||
|  |      * @param ids           条件集
 | ||
|  |      */
 | ||
|  |     public static int updateBatch(String tableName, Map<String, Object> setMap, Map<String, List<Map<String, Object>>> setByCaseList, Map<String, Object> whereMap, List<String> ids) {
 | ||
|  |         StringBuilder sb = new StringBuilder();
 | ||
|  |         if (tableName == null || "".equals(tableName)) {
 | ||
|  |             return 0;
 | ||
|  |         }
 | ||
|  | 
 | ||
|  |         if (setByCaseList == null || setByCaseList.size() == 0 || ids == null || ids.size() == 0) {
 | ||
|  |             return 0;
 | ||
|  |         }
 | ||
|  | 
 | ||
|  |         sb.append("update ").append(tableName).append(" set ");
 | ||
|  |         int mapIndex = 0;
 | ||
|  |         Object value;
 | ||
|  |         if (setMap != null) {
 | ||
|  |             for (Map.Entry<String, Object> entry : setMap.entrySet()) {
 | ||
|  |                 value = entry.getValue();
 | ||
|  |                 if (value != null && !"now()".equals(value)) {
 | ||
|  |                     value = "'" + value + "'";
 | ||
|  |                 }
 | ||
|  |                 sb.append(entry.getKey()).append("=").append(value);
 | ||
|  |                 if ((mapIndex + 1) != setMap.entrySet().size()) {
 | ||
|  |                     sb.append(",");
 | ||
|  |                 }
 | ||
|  |                 mapIndex++;
 | ||
|  |             }
 | ||
|  |         }
 | ||
|  | 
 | ||
|  | 
 | ||
|  |         if (setMap != null && setMap.entrySet().size() != 0) {
 | ||
|  |             sb.append(",");
 | ||
|  |         }
 | ||
|  | 
 | ||
|  |         mapIndex = 0;
 | ||
|  |         String key;
 | ||
|  |         List<Map<String, Object>> valMapList;
 | ||
|  |         Map<String, Object> valMap;
 | ||
|  |         for (Map.Entry<String, List<Map<String, Object>>> entry : setByCaseList.entrySet()) {
 | ||
|  |             key = entry.getKey();
 | ||
|  |             valMapList = entry.getValue();
 | ||
|  | 
 | ||
|  |             if (ObjectUtils.isEmpty(key) || valMapList == null || valMapList.size() == 0) {
 | ||
|  |                 continue;
 | ||
|  |             }
 | ||
|  |             sb.append(key).append("= case id");
 | ||
|  | 
 | ||
|  |             for (int i = 0; i < valMapList.size(); i++) {
 | ||
|  |                 valMap = valMapList.get(i);
 | ||
|  |                 for (Map.Entry<String, Object> item : valMap.entrySet()) {
 | ||
|  |                     value = item.getValue();
 | ||
|  |                     if (value != null && !"now()".equals(value)) {
 | ||
|  |                         value = "'" + value + "'";
 | ||
|  |                     }
 | ||
|  |                     sb.append(" when ").append(item.getKey()).append(" then ").append(value);
 | ||
|  |                 }
 | ||
|  |                 if ((i + 1) == valMapList.size()) {
 | ||
|  |                     sb.append(" end ");
 | ||
|  |                 }
 | ||
|  |             }
 | ||
|  |             if ((mapIndex + 1) != setByCaseList.entrySet().size()) {
 | ||
|  |                 sb.append(",");
 | ||
|  |             }
 | ||
|  |             mapIndex++;
 | ||
|  |         }
 | ||
|  | 
 | ||
|  | 
 | ||
|  |         mapIndex = 0;
 | ||
|  |         if (whereMap != null) {
 | ||
|  |             for (Map.Entry<String, Object> entry : whereMap.entrySet()) {
 | ||
|  |                 if (mapIndex == 0) {
 | ||
|  |                     sb.append(" where ").append(entry.getKey()).append("='").append(entry.getValue()).append("'");
 | ||
|  |                 } else {
 | ||
|  |                     sb.append(" and ").append(entry.getKey()).append("='").append(entry.getValue()).append("'");
 | ||
|  |                 }
 | ||
|  |                 mapIndex++;
 | ||
|  |             }
 | ||
|  |         }
 | ||
|  | 
 | ||
|  |         sb.append(" ").append(mapIndex == 0 ? "where" : "and").append(" id in (");
 | ||
|  |         for (int i = 0; i < ids.size(); i++) {
 | ||
|  |             sb.append(ids.get(i));
 | ||
|  |             if ((i + 1) != ids.size()) {
 | ||
|  |                 sb.append(",");
 | ||
|  |             }
 | ||
|  |         }
 | ||
|  |         sb.append(")");
 | ||
|  |         String sql = sb.toString();
 | ||
|  |         log.info("sql={}", sql);
 | ||
|  |         if ("".equals(sb.toString())) {
 | ||
|  |             return 0;
 | ||
|  |         }
 | ||
|  |         return update(sql, null);
 | ||
|  |     }
 | ||
|  | 
 | ||
|  | }
 |