| package com.zy.ints.erp; | 
|   | 
| import com.baomidou.mybatisplus.annotations.TableField; | 
| import com.baomidou.mybatisplus.annotations.TableName; | 
| import com.core.common.Cools; | 
| import lombok.extern.slf4j.Slf4j; | 
| import org.springframework.beans.factory.annotation.Autowired; | 
| import org.springframework.stereotype.Service; | 
|   | 
| import java.io.ByteArrayInputStream; | 
| import java.io.ByteArrayOutputStream; | 
| import java.io.ObjectInputStream; | 
| import java.io.ObjectOutputStream; | 
| import java.lang.reflect.Field; | 
| import java.lang.reflect.Modifier; | 
| import java.sql.*; | 
| import java.util.ArrayList; | 
| import java.util.HashMap; | 
| import java.util.List; | 
| import java.util.Map; | 
|   | 
| /** | 
|  * 简单持久层框架 | 
|  * Created by vincent on 2020/11/26 | 
|  */ | 
| @Slf4j | 
| @Service | 
| public class ErpSqlServer { | 
|   | 
|     // 数据库连接 | 
| //    private Connection conn; | 
|     // 创建预编译语句对象,一般都是用这个而不用Statement | 
|     private PreparedStatement pstm = null; | 
|     // 创建一个结果集对象 | 
|     private ResultSet rs = null; | 
|   | 
|     @Autowired | 
|     private ErpDbProperties erpDbProperties; | 
|   | 
|     /*****************************************************************************/ | 
|     /**********************************   封装   **********************************/ | 
|     /*****************************************************************************/ | 
|   | 
|     /** | 
|      * 查询 | 
|      */ | 
|     public <T> List<T> select(String sql, Class<T> cls) { | 
|         List<Map<String, Object>> result = executeQuery(sql); | 
|         List<T> list = new ArrayList<>(); | 
|         if (null != result) { | 
|             for (Map<String, Object> entity : result) { | 
|                 list.add(Cools.conver(entity, cls)); | 
|             } | 
|         } | 
|         return list; | 
|     } | 
|   | 
|   | 
|     /** | 
|      * 扫描所有实力类属性里的TableField注解,并将里面的值作为column | 
|      * | 
|      * @param cls | 
|      * @param <T> | 
|      * @return | 
|      */ | 
|     public <T> String selectFrontPart(Class<T> cls) { | 
|         String tableName = cls.getDeclaredAnnotation(TableName.class).value(); | 
|         List<HashMap<String, String>> columnAndField = new ArrayList<>(); | 
|         String sql = "SELECT "; | 
|         if (Cools.isEmpty(tableName)) { | 
|             return null; | 
|         } | 
|         Field[] allFields = Cools.getAllFields(cls); | 
|         for (Field f : allFields) { | 
|             if (Modifier.isFinal(f.getModifiers()) | 
|                     || Modifier.isStatic(f.getModifiers()) | 
|                     || Modifier.isTransient(f.getModifiers())) { | 
|                 continue; | 
|             } | 
|             String column = null; | 
|             if (f.isAnnotationPresent(TableField.class)) { | 
|                 column = f.getAnnotation(TableField.class).value(); | 
|             } | 
|             if (Cools.isEmpty(column)) { | 
|                 column = f.getName(); | 
|             } | 
|             String name = f.getName(); | 
|             HashMap<String, String> container = new HashMap<>(); | 
|             container.put(column, name); | 
|             columnAndField.add(container); | 
|         } | 
|         for (int i = 0; i < columnAndField.size(); i++) { | 
|             HashMap<String, String> stringStringHashMap = columnAndField.get(i); | 
|             if (i == columnAndField.size() - 1) { | 
|                 for (String s : stringStringHashMap.keySet()) { | 
|                     sql = sql + s + " AS " + stringStringHashMap.get(s); | 
|                 } | 
|             } else { | 
|                 for (String s : stringStringHashMap.keySet()) { | 
|                     sql = sql + s + " AS " + stringStringHashMap.get(s) + ", "; | 
|                 } | 
|             } | 
|         } | 
|         sql = sql + " FROM " + tableName; | 
|         return sql; | 
|     } | 
|   | 
|     public String addWhere(String sql, Map<String, String> condition) { | 
|         int conditionSize = 1; | 
|         sql = sql + " WHERE "; | 
|         for (String s : condition.keySet()) { | 
|             if (conditionSize == condition.keySet().size()) { | 
|                 sql = sql + s + " = " + condition.get(s); | 
|             } else { | 
|                 sql = sql + s + " = " + condition.get(s) + " and "; | 
|             } | 
|             conditionSize = conditionSize + 1; | 
|         } | 
|         return sql; | 
|     } | 
|   | 
|     /** | 
|      * map的键是列名, 值等同于值 | 
|      * key: id, value: 1 等同于 WHERE id = 1 | 
|      * 如果要查询字符串需要自行加上'' | 
|      * key:name, value: 'zhs'等同于 WHERE name = 'zhs' | 
|      * | 
|      * @param cls | 
|      * @param condition | 
|      * @param <T> | 
|      * @return | 
|      */ | 
|     public <T> List<T> selectList(Class<T> cls, Map<String, String> condition) { | 
|         String sql = selectFrontPart(cls); | 
|         String finalSQL = addWhere(sql, condition); | 
|         return select(finalSQL, cls); | 
|     } | 
|   | 
|     public <T> List<T> selectAll(Class<T> cls) { | 
|         String sql = selectFrontPart(cls); | 
|         return select(sql, cls); | 
|     } | 
|   | 
|     public List<Map<String, Object>> select(String sql) { | 
|         return executeQuery(sql); | 
|     } | 
|   | 
|     /** | 
|      * 修改 | 
|      */ | 
|     public int update(String sql) { | 
|         return executeUpdate(sql); | 
|     } | 
|   | 
|     public <T> int delete(Class<T> cls, Map<String, String> condition) { | 
|         String tableName = cls.getDeclaredAnnotation(TableName.class).value(); | 
|         if (Cools.isEmpty(tableName)) { | 
|             return 0; | 
|         } | 
|         String sql = "DELETE FROM " + tableName; | 
|         String finalSQL = addWhere(sql, condition); | 
|         return executeUpdate(finalSQL); | 
|     } | 
|   | 
|     public <T> int insert(Class<T> cls, Map<String, Object> condition) { | 
|         String tableName = cls.getDeclaredAnnotation(TableName.class).value(); | 
|         if (Cools.isEmpty(tableName)) { | 
|             return 0; | 
|         } | 
|         String sql = "INSERT INTO " + tableName + " ("; | 
|         int conditionSize = 1; | 
|         for (String s : condition.keySet()) { | 
|             if (conditionSize == condition.keySet().size()) { | 
|                 sql = sql + s + ")"; | 
|             } else { | 
|                 sql = sql + s + ","; | 
|             } | 
|             conditionSize = conditionSize + 1; | 
|         } | 
|         sql = sql + " VALUES("; | 
|         int valuesSize = 1; | 
|         for (String s : condition.keySet()) { | 
|             if (valuesSize == condition.keySet().size()) { | 
|   | 
|                 sql = sql + condition.get(s) + ")"; | 
|             } else { | 
|                 sql = sql + condition.get(s) + ","; | 
|             } | 
|             valuesSize = valuesSize + 1; | 
|         } | 
|   | 
|         return executeUpdate(sql); | 
|     } | 
|   | 
|   | 
|     /*****************************************************************************/ | 
|     /*********************************   核心层   *********************************/ | 
|     /*****************************************************************************/ | 
|   | 
|   | 
|     private List<Map<String, Object>> executeQuery(String sql) { | 
|         Connection conn = null; | 
|         try { | 
|             conn = getConn(); | 
|             pstm = conn.prepareStatement(sql); | 
|             rs = pstm.executeQuery(); | 
| //            List<Map<String, Object>> maps = convertList(rs); | 
|             return convertList(rs); | 
|         } catch (Exception e) { | 
|             e.printStackTrace(); | 
|             return null; | 
|         } finally { | 
|             release(); | 
|             if (conn != null) { | 
|                 try { | 
|                     conn.close(); | 
|                     conn = null; | 
|                 } catch (SQLException e) { | 
|                     e.printStackTrace(); | 
|                 } | 
|             } | 
|         } | 
|     } | 
|   | 
|     public Number executeQueryCount(String sql, String column) { | 
|         Number value = 0; | 
|         Connection conn = null; | 
|         try { | 
|             conn = getConn(); | 
|             pstm = conn.prepareStatement(sql); | 
|             rs = pstm.executeQuery(); | 
| //            ResultSetMetaData metaData = rs.getMetaData(); | 
|             while (rs.next()) { | 
|                 value = (Number) rs.getInt(column); | 
|             } | 
|             return value; | 
|         } catch (Exception e) { | 
|             e.printStackTrace(); | 
|             return 0; | 
|         } finally { | 
|             release(); | 
|             if (conn != null) { | 
|                 try { | 
|                     conn.close(); | 
|                     conn = null; | 
|                 } catch (SQLException e) { | 
|                     e.printStackTrace(); | 
|                 } | 
|             } | 
|         } | 
|     } | 
|   | 
|     private int executeUpdate(String sql) { | 
|         Connection conn = null; | 
|         try { | 
|             conn = getConn(); | 
|             if (null != conn) { | 
|                 pstm = conn.prepareStatement(sql); | 
|             } else { | 
|                 log.error("更新ERP中间表失败===>>数据库连接conn为空"); | 
|                 log.error("更新ERP中间表失败===>>" + sql); | 
|             } | 
|             return pstm.executeUpdate(); | 
|         } catch (Exception e) { | 
|             e.printStackTrace(); | 
|             log.error("更新ERP中间表失败===>>" + sql); | 
|             log.error("更新ERP中间表失败===>>" + e); | 
|             return 0; | 
|         } finally { | 
|             release(); | 
|             if (conn != null) { | 
|                 try { | 
|                     conn.close(); | 
|                     conn = null; | 
|                 } catch (SQLException e) { | 
|                     e.printStackTrace(); | 
|                 } | 
|             } | 
|         } | 
|     } | 
|   | 
|     private static List<Map<String, Object>> convertList(ResultSet rs) throws SQLException { | 
|         List<Map<String, Object>> list = new ArrayList<>(); | 
|         ResultSetMetaData md = rs.getMetaData(); | 
|         int columnCount = md.getColumnCount(); | 
|         while (rs.next()) { | 
|             Map<String, Object> rowData = new HashMap<>(); | 
|             for (int i = 1; i <= columnCount; i++) { | 
|                 rowData.put(md.getColumnName(i), rs.getObject(i)); | 
|             } | 
|             list.add(rowData); | 
|         } | 
|         return list; | 
|     } | 
|   | 
|     //synchronized | 
|     public Connection getConn() throws SQLException { | 
|         Connection conn = null; | 
|         try { | 
|             Class.forName(erpDbProperties.getDriver_class_name()).newInstance(); | 
|             conn = DriverManager.getConnection(erpDbProperties.getUrl(), erpDbProperties.getUsername(), erpDbProperties.getPassword()); | 
|         } catch (Exception e) { | 
|             log.error("获取ERP数据库连接失败"); | 
|             e.printStackTrace(); | 
|             throw new RuntimeException("获取ERP数据库连接失败"); | 
|         } | 
|         return conn; | 
| //        if (null == this.conn || this.conn.isClosed()) { | 
| //            try { | 
| //                Class.forName(erpDbProperties.getDriver_class_name()).newInstance(); | 
| //                this.conn = DriverManager.getConnection(erpDbProperties.getUr(), erpDbProperties.getUsername(), erpDbProperties.getPassword()); | 
| //            } catch (Exception e) { | 
| //                log.error("获取ERP数据库连接失败"); | 
| //                e.printStackTrace(); | 
| //                throw new RuntimeException("获取ERP数据库连接失败"); | 
| //            } | 
| //        } | 
| //        return this.conn; | 
|     } | 
|   | 
|     private void release() { | 
|         if (rs != null) { | 
|             try { | 
|                 rs.close(); | 
|             } catch (SQLException e) { | 
|                 e.printStackTrace(); | 
|             } | 
|         } | 
|         if (pstm != null) { | 
|             try { | 
|                 pstm.close(); | 
|             } catch (SQLException e) { | 
|                 e.printStackTrace(); | 
|             } | 
|         } | 
| //        if (conn != null) { | 
| //            try { | 
| //                conn.close(); | 
| //                conn = null; | 
| //            } catch (SQLException e) { | 
| //                e.printStackTrace(); | 
| //            } | 
| //        } | 
|     } | 
|   | 
|     /** | 
|      * 深拷贝 | 
|      */ | 
|     public ArrayList deepClone(List list) throws Exception { | 
|         // 序列化 | 
|         ByteArrayOutputStream bos = new ByteArrayOutputStream(); | 
|         ObjectOutputStream oos = new ObjectOutputStream(bos); | 
|   | 
|         oos.writeObject(list); | 
|   | 
|         // 反序列化 | 
|         ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); | 
|         ObjectInputStream ois = new ObjectInputStream(bis); | 
|   | 
|         return (ArrayList) ois.readObject(); | 
|     } | 
|   | 
| } |