package cn.feast.coding.tools; import cn.feast.coding.model.generator.Colunm; import cn.feast.coding.model.generator.DataSource; import cn.feast.coding.model.generator.Table; import com.alibaba.druid.pool.DruidDataSource; import org.apache.commons.lang.StringUtils; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; public class AlibabaDbConnect { private static DruidDataSource dataSource = null; /** * 构造函数完成数据库的连接和连接对象的生成 * * @throws Exception */ public AlibabaDbConnect() { } public static void GetDbConnect(DataSource data) throws Exception { try { if (dataSource == null) { dataSource = new DruidDataSource(); //设置连接参数 dataSource.setUrl(data.getJdbcUrl()); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUsername(data.getJdbcUser()); dataSource.setPassword(data.getJdbcPass()); //配置初始化大小、最小、最大 dataSource.setInitialSize(1); dataSource.setMinIdle(1); dataSource.setMaxActive(20); //连接泄漏监测 dataSource.setRemoveAbandoned(true); dataSource.setRemoveAbandonedTimeout(30); //配置获取连接等待超时的时间 dataSource.setMaxWait(20000); //配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 dataSource.setTimeBetweenEvictionRunsMillis(20000); //防止过期 dataSource.setValidationQuery("SELECT 'x'"); dataSource.setTestWhileIdle(true); dataSource.setTestOnBorrow(true); } } catch (Exception e) { throw e; } } /** * 获取数据库所有数据表名称 * * @param dataSource * @return */ public static List getTables(DataSource dataSource) { List
tables = new ArrayList
(); Table table = null; Connection conn = null; ResultSet rs = null; try { conn = getConnect(dataSource); DatabaseMetaData dbMetaData = conn.getMetaData(); rs = dbMetaData.getTables(null, null, null, new String[]{"TABLE"}); while (rs.next()) { table = new Table(); String tableName = rs.getString("TABLE_NAME"); table.setTableName(tableName); table.setClassName(getClassName(tableName)); tables.add(table); } } catch (Exception e) { e.printStackTrace(); } return tables; } /** * 读取表数据 * * @param dataSource 数据源 * @param tableName 表名 * @return */ public static List readData(DataSource dataSource, String tableName) { List properties = new ArrayList(); Colunm colunm = null; Connection conn = null; ResultSet rs = null; String primaryKey = genFieldName(getPrimaryKey(dataSource, tableName)); try { conn = getConnect(dataSource); DatabaseMetaData dbmd = conn.getMetaData(); rs = dbmd.getColumns(null, null, tableName, null); while (rs.next()) { colunm = new Colunm(); String colunmName = genFieldName(rs.getString("COLUMN_NAME")); colunm.setColunmName(colunmName); colunm.setFiledName(rs.getString("COLUMN_NAME")); if (colunmName.equals(primaryKey)) { colunm.setIsPrimary(1); } else { colunm.setIsPrimary(0); } int dataType = rs.getInt("DATA_TYPE"); //对应的java.sql.Types类型 int columnSize = rs.getInt("COLUMN_SIZE");//列大小 int decimalDigits = rs.getInt("DECIMAL_DIGITS");//小数位数 colunm.setColunmType(JavaType.getType(dataType, columnSize, decimalDigits)); colunm.setShowName(rs.getString("REMARKS")); properties.add(colunm); } } catch (Exception e) { e.printStackTrace(); } return properties; } /** * 获取数据表主键 * * @param dataSource * @param tableName * @return */ public static String getPrimaryKey(DataSource dataSource, String tableName) { Connection conn = null; ResultSet rs = null; String primaryKeyName = ""; try { conn = getConnect(dataSource); rs = conn.getMetaData().getPrimaryKeys(null, null, tableName); if (rs.next()) { primaryKeyName = rs.getString(4); } } catch (Exception e) { e.printStackTrace(); } if (StringUtils.isNotEmpty(primaryKeyName)) { return primaryKeyName; } else { return null; } } /** * 根据表字段名获取java中的字段名 * * @param field 字段名 * @return */ public static String genFieldName(String field) { //处理字段名忽视部分 String[] ignore = Contants.FILED_IGNORE; for (int i = 0; i < ignore.length; i++) { if (field.contains(ignore[i])) { field = field.replace(ignore[i], ""); } } //处理字段名 String result = ""; if (field.contains("_")) { String lowerFeild = field.toLowerCase(); String[] fields = lowerFeild.split("_"); result += fields[0]; if (fields.length > 1) { for (int i = 1; i < fields.length; i++) { result += fields[i].substring(0, 1).toUpperCase() + fields[i].substring(1, fields[i].length()); } } } else { result = field; } return result; } /** * 根据表名获取类名 * * @param tableName 表名 * @return */ public static String getClassName(String tableName) { String result = ""; String lowerFeild = tableName.toLowerCase(); //处理表名 String[] ignore = Contants.TABLE_IGNORE; for (int i = 0; i < ignore.length; i++) { if (lowerFeild.contains(ignore[i])) { lowerFeild = lowerFeild.replace(ignore[i], ""); } } String[] fields = lowerFeild.split("_"); if (fields.length >= 1) { for (int i = 0; i < fields.length; i++) { result += fields[i].substring(0, 1).toUpperCase() + fields[i].substring(1, fields[i].length()); } } return result; } /** * 取得已经构造生成的数据库连接 * * @return 返回数据库连接对象 * @throws Exception */ public static Connection getConnect(DataSource data) throws Exception { Connection con = null; try { GetDbConnect(data); con = dataSource.getConnection(); } catch (Exception e) { throw e; } return con; } }