jdbc实现数据库操作的泛用性

    经过半个月自制小工具的倒腾,弄出来一个自认为泛用性还可以的数据库操作类框架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 ;
		}
	}
	
	


	
	

}

你可能感兴趣的:(jdbc实现数据库操作的泛用性)