- 浏览: 104126 次
文章分类
最新评论
design项目:1、额外数据库连接功能
当前博客描述内容的代码,均在 design 项目中。
design 项目下载地址:https://github.com/wenhaoran/design
额外数据库连接功能,并不是 启动项目 访问数据库连接 配置的连接池。而是,在项目中,需要额外使用其他数据库连接的配置。
额外的数据源,是需要启动design 项目后,在页面上配置的,如图下:
目前只支持 oracle 和 mysql , sqlserver 还没有增加代码支持。
连接数据库 的util 类代码,如图下:
sqlserver 连接数据库,需要自己 增加 代码支持。
页面配置完成后,会保存新的 数据库连接信息,到 desgin项目数据库中 desgin_db 表,
因此,之后的所有操作,均会通过 util类DBUtil,DBUtil 完整代码如下:
package cn.digitalpublishing.util.sql; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import cn.digitalpublishing.po.design.DataObject; import cn.digitalpublishing.po.design.DeDBConnect; import cn.digitalpublishing.po.design.DesignTable; import cn.digitalpublishing.po.design.DesignTableColumn; import cn.digitalpublishing.po.imp.ImportRoleDetail; public class DBUtil { private static DBUtil db; private DBUtil() { } private static synchronized DBUtil get() { if (db == null) { db = new DBUtil(); } return db; } public static Connection getConnect(DeDBConnect dbconn){ try { String type = dbconn.getType(); String driver ="",url=""; Connection conn = null; if(type.equals("mysql")){ driver = "com.mysql.jdbc.Driver"; url ="jdbc:mysql://"+dbconn.getAddress()+":"+dbconn.getPort()+"/"+dbconn.getDbname()+"?characterEncoding=utf8"; conn = getConnection(driver,url,dbconn.getUsername(),dbconn.getPassword()); }else if(type.equals("oracle")){ driver = "oracle.jdbc.driver.OracleDriver";//jdbc:oracle:thin:@127.0.0.1:1521:orcl url ="jdbc:oracle:thin:@"+dbconn.getAddress()+":"+dbconn.getPort()+":"+dbconn.getDbname();//+"?characterEncoding=utf8" conn = getConnection(driver,url,dbconn.getUsername(),dbconn.getPassword()); } return conn; } catch (Exception e) { e.printStackTrace(); return null; } } public static Connection getConnection(String driver,String url ,String name ,String pwd){ try{ Class.forName(driver); Connection conn=DriverManager.getConnection(url,name,pwd);//获取连接对象 return conn; }catch(ClassNotFoundException e){ e.printStackTrace(); return null; }catch(SQLException e){ e.printStackTrace(); return null; } } //批量执行sql public static void executeSqls(String[] sqls,DeDBConnect dbconn)throws Exception{ Connection conn = getConnect(dbconn); Statement stmt = (Statement) conn.createStatement(); for (int i = 0; i < sqls.length; i++) { stmt.execute(sqls[i]+";"); } if (!conn.isClosed()) { conn.close(); } } public static void executeSql(DeDBConnect dbconn,String sql)throws Exception{ Connection conn = getConnect(dbconn); Statement stmt = (Statement) conn.createStatement(); stmt.execute(sql); if (!conn.isClosed()) { conn.close(); } } public static Map<String, String> executeSqlgetValueReturn(DeDBConnect dbconn, String tableName,String id,List<ImportRoleDetail> keyDetail)throws Exception{ Connection conn = getConnect(dbconn); Map<String, String> returnKey = new HashMap<String, String>(); String sql = "select * from "+tableName + " where id ='"+id+"';"; Statement stmt = (Statement) conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ResultSet rs = stmt.executeQuery(sql); while (rs.next()) { for(ImportRoleDetail detail:keyDetail){ returnKey.put(detail.getId(), rs.getString(detail.getColumnId())); } } return returnKey; } public static void executeSql(DeDBConnect dbconn,String sql,String[] params)throws Exception{ Connection conn = getConnect(dbconn); //,Statement.RETURN_GENERATED_KEYS PreparedStatement pstmt = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS); // 如果使用静态的SQL,则不需要动态插入参数 for(int i =0;i<params.length;i++){ pstmt.setString(i+1, params[i]); } pstmt.executeUpdate(); if (!conn.isClosed()) { conn.close(); } } public static List<Map<String, Object>> execute(DeDBConnect db,String sql)throws Exception { Connection conn = getConnect(db); Statement stmt = (Statement) conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ResultSet rs = stmt.executeQuery(sql); List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); ResultSetMetaData md = (ResultSetMetaData) rs.getMetaData(); int columnCount = md.getColumnCount(); while (rs.next()) { Map<String, Object> rowData = new HashMap<String, Object>(); for (int i = 1; i <= columnCount; i++) { rowData.put(md.getColumnName(i), rs.getObject(i)); } list.add(rowData); } return list; } public static List<String> executeSqlReturnColumnList(DeDBConnect db,String sql)throws Exception { Connection conn = getConnect(db); Statement stmt = (Statement) conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ResultSet rs = stmt.executeQuery(sql); List<String> columnList = new ArrayList<String>(); ResultSetMetaData rsmd = rs.getMetaData(); int count = rsmd.getColumnCount(); for(int i=1;i<count+1;i++){ String name = rsmd.getColumnName(i); columnList.add(name); } return columnList; } public static List<DesignTable> getTableList(DeDBConnect db) throws Exception{ List<DesignTable> designList = new ArrayList<DesignTable>(); Connection conn = getConnect(db); String sql = ""; if(db.getType().equals("mysql")){ sql = "SELECT t.table_name AS name,t.TABLE_COMMENT AS comments FROM information_schema.`TABLES` t WHERE t.TABLE_SCHEMA = (select database()) ORDER BY t.TABLE_NAME"; }else if(db.getType().equals("oracle")){ sql = "select TBCOMM.table_name as name ,TBCOMM.comments as comments from user_tables tb ,user_tab_comments tbcomm where TB.table_name = TBCOMM.table_name"; } Statement stmt = (Statement) conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ResultSet rs = stmt.executeQuery(sql); while (rs.next()) { DesignTable table = new DesignTable(); table.setTableName(rs.getString("name")); table.setComments(rs.getString("comments")); designList.add(table); } return designList; } public static List<DesignTableColumn> getColumnList(DesignTable table) throws Exception{ List<DesignTableColumn> columnList = new ArrayList<DesignTableColumn>(); Connection conn = getConnect(table.getDbconn()); String sql = ""; if("mysql".equals(table.getDbconn().getType())){ sql = createSqlByMysql(table.getTableName()); }else if("oracle".equals(table.getDbconn().getType())){ sql = createSqlByOracle(table.getTableName()); } Statement stmt = (Statement) conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ResultSet rs = stmt.executeQuery(sql); while (rs.next()) { DesignTableColumn column = new DesignTableColumn(); column.setId(rs.getString("name")); column.setName(rs.getString("name")); column.setComments(rs.getString("comments")); column.setType(rs.getString("type")); column.setJavaField(underline2Camel(rs.getString("name"),true)); column.setJavaType(javaType(rs.getString("type"))); columnList.add(column); } return columnList; } public static Map<String, DesignTableColumn> getColumnMap(DesignTable table)throws Exception { Map<String, DesignTableColumn> columnMap = new HashMap<String, DesignTableColumn>(); Connection conn = getConnect(table.getDbconn()); String sql = ""; if("mysql".equals(table.getDbconn().getType())){ sql = createSqlByMysql(table.getTableName()); }else if("oracle".equals(table.getDbconn().getType())){ sql = createSqlByOracle(table.getTableName()); } Statement stmt = (Statement) conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ResultSet rs = stmt.executeQuery(sql); while (rs.next()) { DesignTableColumn column = new DesignTableColumn(); column.setName(rs.getString("name")); column.setComments(rs.getString("comments")); column.setType(rs.getString("type")); column.setJavaField(underline2Camel(rs.getString("name"),true)); column.setJavaType(javaType(rs.getString("type"))); columnMap.put(rs.getString("name"), column); } return columnMap; } public static boolean tableIsexist(DataObject object)throws Exception{ boolean isExist = false; String sqlType = object.getDbconn().getType(); Connection conn = getConnect(object.getDbconn()); String sql = ""; if(sqlType.equals("mysql")){ sql = "SELECT t.table_name AS name,t.TABLE_COMMENT AS comments FROM information_schema.`TABLES` t WHERE t.TABLE_SCHEMA = (select database()) and t.table_name='"+object.getTableName()+"' ORDER BY t.TABLE_NAME;"; }else if(sqlType.equals("oracle")){ sql = "select table_name as NAME from user_tables where table_name = '"+object.getTableName()+"' ORDER BY table_name"; } Statement stmt = (Statement) conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ResultSet rs = stmt.executeQuery(sql); while (rs.next()) { if(object.getTableName().equals(rs.getString("name"))){ isExist = true; } } return isExist; } public static String getValueByMatch(DeDBConnect dbConn, String table, String name, String code, String matchValue)throws Exception { String value = ""; List<String> valueList = new ArrayList<String>(); Connection conn = getConnect(dbConn); String sql = "select " + code + " from " + table + " where "+ name +" = '"+matchValue+"'"; Statement stmt = (Statement) conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ResultSet rs = stmt.executeQuery(sql); while (rs.next()) { value = rs.getString(code); valueList.add(value); } return value; } public static List<String> searchOneArray(DeDBConnect db, String sql, String column)throws Exception { Connection conn = getConnect(db); Statement stmt = (Statement) conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ResultSet rs = stmt.executeQuery(sql); List<String> valueList = new ArrayList<String>(); while (rs.next()) { String value = rs.getString(column); valueList.add(value); } return valueList; } public static List<Map<String, String>> searchMapList(DeDBConnect db, String sql)throws Exception { Connection conn = getConnect(db); Statement stmt = (Statement) conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ResultSet rs = stmt.executeQuery(sql); List<String> columnList = new ArrayList<String>(); ResultSetMetaData rsmd = rs.getMetaData(); int count = rsmd.getColumnCount(); for(int i=1;i<count+1;i++){ String name = rsmd.getColumnName(i); columnList.add(name); } List<Map<String, String>> searchMapList = new ArrayList<Map<String, String>>(); while (rs.next()) { Map<String,String> map = new HashMap<String,String>(); for(String column :columnList){ String value = rs.getString(column); map.put(column, value); } searchMapList.add(map); } return searchMapList; } private static String createSqlByMysql(String tableName){ String sql = "SELECT " + "t.COLUMN_NAME AS NAME, " + "(CASE WHEN t.IS_NULLABLE = 'YES' THEN '1' ELSE '0' END ) AS isNull," +"(t.ORDINAL_POSITION * 10) AS sort," +"t.COLUMN_COMMENT AS comments," +"t.DATA_TYPE AS type " + "FROM information_schema.`COLUMNS` t " + "WHERE " +" t.TABLE_SCHEMA = (SELECT DATABASE()) AND t.TABLE_NAME = '"+ tableName +"' ORDER BY t.ORDINAL_POSITION"; return sql; } private static String createSqlByOracle(String tableName){ String sql = "select " + "com.column_name as name," + "COM.comments as comments , " + "col.data_type as type " + "from " + "user_col_comments com," + "user_tab_columns col " + "where " + "COL.column_name = COM.column_name " + "and " + "COL.table_name = COM.table_name " + "and " + "COM.table_name= '"+ tableName +"'"; return sql; } // 带下划线的字符串,转 驼峰命名法 eg: db_id ==> dbId public static String underline2Camel(String line,boolean smallCamel){ if(line==null||"".equals(line)){ return ""; } StringBuffer sb=new StringBuffer(); Pattern pattern=Pattern.compile("([A-Za-z\\d]+)(_)?"); Matcher matcher=pattern.matcher(line); while(matcher.find()){ String word=matcher.group(); sb.append(smallCamel&&matcher.start()==0?Character.toLowerCase(word.charAt(0)):Character.toUpperCase(word.charAt(0))); int index=word.lastIndexOf('_'); if(index>0){ sb.append(word.substring(1, index).toLowerCase()); }else{ sb.append(word.substring(1).toLowerCase()); } } return sb.toString(); } public static String javaType(String dbtype){ String javatype="String"; if(dbtype.equals("varchar")){ javatype = "String"; } if(dbtype.equals("text")){ javatype = "String"; } if(dbtype.equals("datetime")){ javatype = "Date"; } if(dbtype.equals("decimal")){ javatype = "Integer"; } if(dbtype.equals("int")){ javatype = "Integer"; } if(dbtype.equals("integer")){ javatype = "Integer"; } return javatype; } }其中基本功能包括:
1、测试某个数据库是否可以连接。
2、获取某个数据库的所有表信息。
3、获取某个表的所有字段信息。
4、获取某个表的所有记录。
5、获取某个表的某条记录。
等等
其他的一系列操作。
操作 数据库连接的 controller 是 :DBConnectController
欢迎下载完整代码:https://github.com/wenhaoran/design
相关推荐
2. **配置环境**:在使用HibernateTools之前,需要配置好项目的环境,包括Hibernate配置文件(configuration file)的设置,指定数据库连接信息、映射文件路径、POJO生成规则等。 3. **生成POJO及映射文件**:通过...
- `src/main/resources`:存放资源配置文件,如application.properties或yaml,数据库连接配置、视图模板等 - `src/main/webapp`:存放静态资源,如HTML、CSS、JavaScript文件 - `src/main/webapp/WEB-INF`:存放...
- PostgreSQL:功能强大的开源对象关系型数据库系统。 - **实践操作**:根据实际需求选择合适的数据库管理系统进行操作练习。 #### 六、获取教程资源 - **在线资源**:通过搜索引擎寻找免费的在线教程和视频课程...
《从新手到专家:数据库设计入门》一书由Clare Churcher撰写,Stéphane Faroult作序,于2007年1月由Apress出版社出版。本书聚焦于数据库设计的基础与进阶知识,旨在帮助读者从零基础起步,逐步成长为专业的数据库...
- SQLite集成:在Qt中,可以使用QSqlDatabase模块直接连接和操作SQLite数据库,无需额外安装数据库服务器。 - SQL查询:通过QSqlQuery或其他相关类,执行CRUD(创建、读取、更新、删除)操作。 - 数据模型:Qt...
- **用PowerDesigner生成数据库**:完成数据源配置后,PowerDesigner提供数据库生成功能,根据物理数据模型自动生成SQL Server数据库。 #### 三、常见问题及解决方法 在使用PowerDesigner创建物理数据模型并生成至...
##### 2.1 数据库连接方法 1 1. **启动 iReport**:打开 iReport 工具,进入主页面。 2. **选择 JDBC 连接**:点击数据库连接图标后,选择 JDBC Connection,然后点击 Next。 3. **填写连接信息**:输入相应的...
在Java中,单例模式常用于资源管理,例如数据库连接池。 3. **观察者模式**(Observer Pattern):定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在...
3. `Electronic Symbols.ddt`, `Flowchart.ddt`, `GUI design 1.ddt`:这些文件可能包含了额外的图形符号库,用户可以利用这些图形构建更复杂的图表,比如电子工程符号用于专业领域的建模,流程图符号用于表示业务...
- 应用场景:当需要控制资源的唯一访问,例如线程池、数据库连接等。 6. 适配器(Adapter): - 目的:使不兼容的接口能够协同工作。 - 应用场景:当有现有的类需要使用,但其接口不符合需求时。 7. 桥接...
这种模式在需要控制资源访问或管理共享状态时非常有用,如数据库连接池或缓存管理。 3. **观察者模式**:观察者模式定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知...
3. 方案3(SNO, CNAME, G)和SD(SNO, SDEPT, MN)将学生和系部信息分开,但可能需要额外的连接操作来获取完整信息。 4. 方案4(SNO, CNAME, G),SD(SNO, SDEPT)和SM(SNO, MN)将学生、系部和负责人进一步分离,...
- **配置DBProfile**:使用数据库画板配置数据库配置文件(DBProfile),该配置文件包含了数据库连接的所有必要信息。 - **管理数据源**:包括添加、删除数据源以及管理DBProfile。 **3. 数据库操作** - **创建和...
3. 配置文件:application.properties或application.yml,用于配置SpringBoot的各种属性,如数据库连接信息、服务器端口等。 4. 页面模板:如果使用了Thymeleaf或Freemarker等模板引擎,会有HTML页面模板,负责展示...
在Android中,单例常用于管理应用程序范围内的资源,如网络连接或数据库连接。 其次,工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的最佳方式。在Android开发中,工厂模式可以用于创建...
- **设置开发环境**: 安装Go语言,克隆项目,配置数据库连接,并运行`go build`或`go run main.go`启动项目。 - **测试**: 项目可能包含测试用例,通过`go test`命令执行单元测试确保代码质量。 - **贡献代码**: ...
在PHP中,单例模式常用于控制数据库连接、缓存管理等需要唯一实例的场景。 2. **工厂模式**:提供一个创建对象的接口,但让子类决定实例化哪一个类。这使得系统能够在不修改代码的情况下,插入新的产品类型。 3. *...
单例模式常用于控制资源的共享,如数据库连接、日志记录器等。 3. 观察者模式(Observer Pattern): 观察者模式定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并...