经过半个月自制小工具的倒腾,弄出来一个自认为泛用性还可以的数据库操作类框架1.0版本(后期如果有需求还会继续更新),配合Java的jtable使用,但是数据库中的表必须设定一个主键,否则就会出现找不到索引的问题,另一个要值得注意的问题是,每次必须调用一个填表函数,将数据库的表填写到面板后,才能进行增删改查的操作,因为作为一个使用者,必须要先得到表,然后才能对表进行操作(站在使用者的角度考虑,而不是开发者的角度),否则会出现字段矢量越界的情况。
此框架根据数据库表中的第一个字段进行查找记录的,因此在设计上,第一个字段的内容不能进行更改。(以下即是源码)
package admin;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Vector;
//数据库连接操作类
public class MySQLconnect {
static final String jdbc_Driver = "com.mysql.jdbc.Driver" ;
static final String DB_URL = "jdbc:mysql://localhost:3306/hello?characterEncoding=utf-8" ; //编码格式为utf8,以防止写入数据库出现乱码
static final String login_Name = "root";
static final String password = "root" ;
private int ColumnCount ; //获取字段数
private Vector ColumnName = new Vector() ; //存储字段名的矢量
private Connection con = null;
private Statement stmt = null;
private ArrayList> SQLTable = new ArrayList>() ;
// public static void main(String[] args) {
// // TODO Auto-generated method stub
// MySQLconnect aMySQLconnect = new MySQLconnect();
// aMySQLconnect.getSQLTable("user",-1,null);
//
// }
//构造器
MySQLconnect() {
try {
try {
Class.forName("com.mysql.jdbc.Driver") ;
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
con = DriverManager.getConnection(DB_URL, login_Name, password) ;
System.out.println("连接成功!!");
}catch (SQLException e) {
// TODO: handle exception
e.printStackTrace();
System.out.println("失败");
}
}
//获取管理员列表验证登录
public boolean isAdministrator(String loginName,String passWord) {
try {
stmt = con.createStatement();
String sql = "SELECT * FROM adminuser" ;
ResultSet re = stmt.executeQuery(sql);
while (re.next()) {
//这个管理员判断可以自行根据自建的管理员表进行修改
System.out.println("账号->"+loginName.equals(re.getString("Administrator")) );
System.out.println("密码->"+passWord.equals(re.getString("password")));
if (loginName.equals(re.getString("Administrator") ) && passWord.equals(re.getString("password")) ) {
System.out.println("登录成功");
//当登录成功的时候就关闭数据库
re.close();
stmt.close();
con.close();
return true ;
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
//每次面板上填好表后必须,清空容器,在外部调用这个函数进行清空
public void initArrayList() {
this.SQLTable.clear();
}
//查找数据库中的表,实现泛用性,参数1:表名 , 参数2:字段索引(传入-1则不启动字段模糊查找功能) , 参数3:具体的值
//返回值是一个动态二维数组
public ArrayList> getSQLTable(String TableName,int ColumunIndex ,String Value) {
try {
stmt = con.createStatement();
String sql ;
//这里需要实现判断是否按照字段查询
if (ColumunIndex != -1 && Value !=null) {
sql = "SELECT * FROM " + TableName + " WHERE " + ColumnName.get(ColumunIndex) +" LIKE "+ "'%"+Value+"%'" ;
}
else {
sql = "SELECT * FROM " + TableName;
}
System.out.println(sql);
ResultSet re = stmt.executeQuery(sql);
ColumnCount = re.getMetaData().getColumnCount() ; //在结果集中获取字段列数
//存储字段名
//防止用户进行反复调用此函数,导致矢量内容不断增加
if (ColumnName.isEmpty()) {
for(int i = 1 ; i <= ColumnCount;i++) {
ColumnName.add(re.getMetaData().getColumnName(i)) ;
}
}else {
ColumnName.removeAllElements();
for(int i = 1 ; i <= ColumnCount;i++) {
ColumnName.add(re.getMetaData().getColumnName(i)) ;
}
}
while(re.next()) {
ArrayList record = new ArrayList();
//获取列数并且遍历储存
for(int i = 1; i <= re.getMetaData().getColumnCount();i++) {
record.add(re.getString(i));
}
//储存一条记录
SQLTable.add(record);
}
re.close();
stmt.close();
//con.close();
return SQLTable;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null ;
}
}
//接收前端面板传来的表和表名,进行update操作,一条记录为主
public void updateOperating(ArrayList record,String TableName) {
//注意从第SQL表的第二个字段开始,第一个字段不能更改,因为第一个字段作为为索引
for (int i = 1; i < ColumnName.size(); i++) {
//组装SQL语句
String sql = "UPDATE "+TableName +
" SET " + ColumnName.get(i) + " ='" +record.get(i)+ "' " +
" WHERE " + ColumnName.get(0) + " ='" +record.get(0) + "' ";
//调试SQL语句是否正确
System.out.println(sql);
try {
//对数据库进行操作
stmt = con.createStatement();
stmt.executeUpdate(sql) ;
System.out.println("更新成功");
stmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("有错误");
}
}
}
//删除一条记录,第一个参数是表名,第二个参数是在mysql表中记录的索引
public boolean deleteOperating(String TableName,String Row) {
//根据主键索引
String sql = "DELETE FROM " + TableName +" WHERE " + ColumnName.firstElement() + " = '" + Row+"'";
//调试输出
System.out.println(sql);
try {
stmt = con.createStatement();
stmt.execute(sql); //这个可行
//stmt.executeQuery(sql); //这个好像不行,会报错
stmt.close();
return true ;
} catch (SQLException e) {
// TODO: handle exception
e.printStackTrace();
return false ;
}
}
//增操作
//参数1:面板上传来的表的记录,一条记录为主
//参数2:表名
public boolean insertOperating(ArrayList Record,String TableName) {
try {
stmt = con.createStatement() ;
StringBuffer sql = new StringBuffer() ;
sql.append("INSERT INTO "+ TableName + " ( ") ;
//组装SQL语句
for(int i = 1 ; i < ColumnName.size();i++) {
//组装字段名
if (i == ColumnName.size()-1) {
sql.append(ColumnName.get(i)+" ") ;
}else {
sql.append(ColumnName.get(i)+", ") ;
}
}
sql.append(" ) VALUES ( " ) ;
//组装具体的值
for(int i = 1 ; i < ColumnName.size(); i++) {
if (i == ColumnName.size()-1) {
sql.append(" '" +Record.get(i)+"' ") ;
}else {
sql.append(" '" +Record.get(i)+"', ") ;
}
}
sql.append(" )") ;
//插入记录
System.out.println(sql.toString());
stmt.execute(sql.toString());
stmt.close();
return true ;
} catch (SQLException e) {
// TODO: handle exception
e.printStackTrace();
return false ;
}
}
}