`
我是温浩然
  • 浏览: 104128 次
文章分类
社区版块
存档分类
最新评论

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



分享到:
评论

相关推荐

    PowerDesign数据库建模和HibernateTools生成POJO映射文件等.pdf

    2. **配置环境**:在使用HibernateTools之前,需要配置好项目的环境,包括Hibernate配置文件(configuration file)的设置,指定数据库连接信息、映射文件路径、POJO生成规则等。 3. **生成POJO及映射文件**:通过...

    毕设项目:基于SpringBoot+Vue前后端分离型图书管理系统.zip

    - `src/main/resources`:存放资源配置文件,如application.properties或yaml,数据库连接配置、视图模板等 - `src/main/webapp`:存放静态资源,如HTML、CSS、JavaScript文件 - `src/main/webapp/WEB-INF`:存放...

    数据库实战的教程.doc

    - PostgreSQL:功能强大的开源对象关系型数据库系统。 - **实践操作**:根据实际需求选择合适的数据库管理系统进行操作练习。 #### 六、获取教程资源 - **在线资源**:通过搜索引擎寻找免费的在线教程和视频课程...

    Apress.Beginning.Database.Design.From.Novice.to.Professional.Jan.2007.pdf

    《从新手到专家:数据库设计入门》一书由Clare Churcher撰写,Stéphane Faroult作序,于2007年1月由Apress出版社出版。本书聚焦于数据库设计的基础与进阶知识,旨在帮助读者从零基础起步,逐步成长为专业的数据库...

    基于Qt和sqlite的共享雨伞管理系统数据库课设.zip

    - SQLite集成:在Qt中,可以使用QSqlDatabase模块直接连接和操作SQLite数据库,无需额外安装数据库服务器。 - SQL查询:通过QSqlQuery或其他相关类,执行CRUD(创建、读取、更新、删除)操作。 - 数据模型:Qt...

    用PowerDesigner创建物理数据模型并生成数据库到SQL Server 2005

    - **用PowerDesigner生成数据库**:完成数据源配置后,PowerDesigner提供数据库生成功能,根据物理数据模型自动生成SQL Server数据库。 #### 三、常见问题及解决方法 在使用PowerDesigner创建物理数据模型并生成至...

    iReport 4.5 学习笔记

    ##### 2.1 数据库连接方法 1 1. **启动 iReport**:打开 iReport 工具,进入主页面。 2. **选择 JDBC 连接**:点击数据库连接图标后,选择 JDBC Connection,然后点击 Next。 3. **填写连接信息**:输入相应的...

    DesignPattern:这是针对不同设计人员的测试项目

    在Java中,单例模式常用于资源管理,例如数据库连接池。 3. **观察者模式**(Observer Pattern):定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在...

    数据库建模画ER图工具

    3. `Electronic Symbols.ddt`, `Flowchart.ddt`, `GUI design 1.ddt`:这些文件可能包含了额外的图形符号库,用户可以利用这些图形构建更复杂的图表,比如电子工程符号用于专业领域的建模,流程图符号用于表示业务...

    summary of design patterns

    - 应用场景:当需要控制资源的唯一访问,例如线程池、数据库连接等。 6. 适配器(Adapter): - 目的:使不兼容的接口能够协同工作。 - 应用场景:当有现有的类需要使用,但其接口不符合需求时。 7. 桥接...

    Pages from Head First Design Patterns (英文高清版)_part1.rar

    这种模式在需要控制资源访问或管理共享状态时非常有用,如数据库连接池或缓存管理。 3. **观察者模式**:观察者模式定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知...

    南开大学数据库原理课件lecture5-Schema-Design.ppt

    3. 方案3(SNO, CNAME, G)和SD(SNO, SDEPT, MN)将学生和系部信息分开,但可能需要额外的连接操作来获取完整信息。 4. 方案4(SNO, CNAME, G),SD(SNO, SDEPT)和SM(SNO, MN)将学生、系部和负责人进一步分离,...

    pb课程总结

    - **配置DBProfile**:使用数据库画板配置数据库配置文件(DBProfile),该配置文件包含了数据库连接的所有必要信息。 - **管理数据源**:包括添加、删除数据源以及管理DBProfile。 **3. 数据库操作** - **创建和...

    个人博客系统(SpringBoot+Mybatis).zip

    3. 配置文件:application.properties或application.yml,用于配置SpringBoot的各种属性,如数据库连接信息、服务器端口等。 4. 页面模板:如果使用了Thymeleaf或Freemarker等模板引擎,会有HTML页面模板,负责展示...

    DesignPatterns:带有设计模式示例的Android应用程序

    在Android中,单例常用于管理应用程序范围内的资源,如网络连接或数据库连接。 其次,工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的最佳方式。在Android开发中,工厂模式可以用于创建...

    开源项目-dinever-dingo.zip

    - **设置开发环境**: 安装Go语言,克隆项目,配置数据库连接,并运行`go build`或`go run main.go`启动项目。 - **测试**: 项目可能包含测试用例,通过`go test`命令执行单元测试确保代码质量。 - **贡献代码**: ...

    Wrox.Professional.PHP.Design.Patterns.Aug.2009.rar

    在PHP中,单例模式常用于控制数据库连接、缓存管理等需要唯一实例的场景。 2. **工厂模式**:提供一个创建对象的接口,但让子类决定实例化哪一个类。这使得系统能够在不修改代码的情况下,插入新的产品类型。 3. *...

    FOAD-DesignPattern:FOAD-DesignPattern

    单例模式常用于控制资源的共享,如数据库连接、日志记录器等。 3. 观察者模式(Observer Pattern): 观察者模式定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并...

Global site tag (gtag.js) - Google Analytics