我使用的是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 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 tableNameList=new ArrayList<>();//存储表名
try {
//遍历
if(result.getRowCount()!=0){
for(int i=0;i
和查询表名的方法差不多
@RequestMapping("/getColumnNames")
@ResponseBody
public Object getColumnNames(HttpServletRequest request) {
Map 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 columnNameList=new ArrayList<>();//存储表名
try {
//遍历
if(result.getRowCount()!=0){
for(int i=0;i
有个疑问,数据库的各种信息需不需要在传输的时候进行加密解密,以保证信息安全?