使用jdbc连接数据库,查询表名和字段名,后端实现

业务场景:

我使用的是SSM框架,前端是layui.用户需要在表单上填写数据库连接信息(ip地址,端口号,用户名,密码,数据库名),还需要填写表名和字段名.其中表名是在用户填写完数据库连接信息之后,点击表名和字段名的文本框之后触发方法,前端传给我数据库链接信息,我使用jdbc查询到之后,返回给前端的一个范围,用户在这个范围中选(可以打字,但是只能在我给的范围之内).字段名则是点击文本框之后,前端传给我数据库链接信息以及之前选择好的表名之后我返回的字段的范围.

效果大致如layui这个带搜索的选择框:

具体实现:

首先,使用jdbc要有对应的包(用maven的就在pom里面加配置,没用maven的就下载jar包到项目中),不细说这个了~

导包信息

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.servlet.jsp.jstl.sql.Result;
import javax.servlet.jsp.jstl.sql.ResultSupport;

有三个方法,都是写在一个controller中的,也可以将连接数据库的方法放进工具类里

连接数据库的方法:

这个方法中有几点要注意

(1)rs还有connection在方法结束后要关闭,调用close()方法之前要判断是否为null,不然会报错.如果不关闭会造成资源浪费,还可能会造成异常(具体什么后果没试过,因为我都有关闭...).因此在finally里面再次判断并关闭资源是很有必要的.

(2)先使用的后关闭(先使用的conncetion,然后使用的rs,所以先关闭rs).

(3)本来一开始是想传rs到另一个方法中的,但是关闭了rs或者connection之后,rs就为空了,数据是传不过去的.因此在这个方法中将rs转换成Result类型再传.

/**
	 * 连接数据库,返回Result
	 * @return
	 */
	public Result jdbcGetResult(String url,String user,String password,String sql) {
		
		Connection connection=null;
		String driver="com.mysql.jdbc.Driver";
		ResultSet rs=null;
		Result result=null;
		try {
			//加载驱动程序
			Class.forName(driver);
			connection=DriverManager.getConnection(url, user, password);
			if(!connection.isClosed()) {
				System.out.println("Succeeded connecting to the Database!");
			}
			//2.创建statement类对象,用来执行SQL语句
			Statement statement = connection.createStatement();
			//3.ResultSet类,用来存放获取的结果集
			rs = statement.executeQuery(sql);
			result=ResultSupport.toResult(rs);
			rs.close();
			connection.close();
		} catch(ClassNotFoundException e) {   
			//数据库驱动类异常处理
			e.printStackTrace();   
			return null;
		} catch(SQLException e) {
			//数据库连接失败异常处理
			e.printStackTrace();  
			return null;
		}catch (Exception e) {
			e.printStackTrace();
			return null;
		}finally{
			try {
				if (rs!=null) {
					rs.close();
				}
				if (connection!=null) {
					connection.close();
				}
			} catch (Exception e2) {
				e2.printStackTrace();
				return null;
			}
		}
		return result;
		
	}

查询表名的方法

@RequestMapping("/getTableNames")
	@ResponseBody
	public Object getTableNames(HttpServletRequest request) {
		Map<String, Object> retMap=new HashMap<>();
		
		//获取连接数据库的信息
		String ip=request.getParameter("ip");
		String port=request.getParameter("port");
		String dbName=request.getParameter("dbName");
		String url="jdbc:mysql://"+ip+":"+port+"/"+dbName+"?useUnicode=true&characterEncoding=UTF-8&useSSL=false";
		String userName=request.getParameter("userName");
		String password=request.getParameter("password");
		
		//连接数据库,获取结果集
		String sql = "select table_name from information_schema.tables where table_schema='"+dbName+"'";
		Result result=jdbcGetResult(url, userName, password, sql);
		if (result==null) {
			retMap.put("isSuccess", 0);
			retMap.put("msg", "查询不到数据");
			return retMap;
		}
		
		//处理结果集,封装数据
		List<String> tableNameList=new ArrayList<>();//存储表名
		try {
			//遍历
			if(result.getRowCount()!=0){
		        for(int i=0;i<result.getRowCount();i++){
		        	String tableName=(String) result.getRowsByIndex()[i][0];
					tableNameList.add(tableName);
		        }
			}
			retMap.put("isSuccess", 1);
			retMap.put("tableNameList", tableNameList);
		} catch (Exception e) {
			e.printStackTrace();
			retMap.put("isSuccess", 0);
			retMap.put("msg", "遍历结果集时出错");
		}
		
		return retMap;
	}

查询字段名的方法

和查询表名的方法差不多

@RequestMapping("/getColumnNames")
	@ResponseBody
	public Object getColumnNames(HttpServletRequest request) {
		Map<String, Object> retMap=new HashMap<>();
		
		//获取连接数据库的信息
		String ip=request.getParameter("ip");
		String port=request.getParameter("port");
		String dbName=request.getParameter("dbName");
		String url="jdbc:mysql://"+ip+":"+port+"/"+dbName+"?useUnicode=true&characterEncoding=UTF-8&useSSL=false";
		String userName=request.getParameter("userName");
		String password=request.getParameter("password");
		String tableName=request.getParameter("tableName");
		
		//连接数据库,获取结果集
		String sql = "select column_name from Information_schema.columns  where table_Name='"+tableName+"' and TABLE_SCHEMA='"+dbName+"'";
		Result result=jdbcGetResult(url, userName, password, sql);
		if (result==null) {
			retMap.put("isSuccess", 0);
			retMap.put("msg", "查询不到数据");
			return retMap;
		}
		
		//处理结果集,封装数据
		List<String> columnNameList=new ArrayList<>();//存储表名
		try {
			//遍历
			if(result.getRowCount()!=0){
		        for(int i=0;i<result.getRowCount();i++){
		        	String columnName=(String) result.getRowsByIndex()[i][0];
		        	columnNameList.add(columnName);
		        }
			}
			retMap.put("isSuccess", 1);
			retMap.put("columnNameList", columnNameList);
		} catch (Exception e) {
			e.printStackTrace();
			retMap.put("isSuccess", 0);
			retMap.put("msg", "遍历结果集时出错");
		}
		
		return retMap;
	}

题外话:

有个疑问,数据库的各种信息需不需要在传输的时候进行加密解密,以保证信息安全?

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值