JAVA JDBC的单表查询通用dao层代码实现

获取数据库连接对象代码实

package com.eduask.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBUtil {
	
	private static Connection conn = null;
	private static String url = "jdbc:mysql://localhost:3306/parttime";//parttime是数据库名字
	private static String driver = "com.mysql.jdbc.Driver";
	
	public static Connection getConnection(){
		
		if (conn == null) {
			try {
				Class.forName(driver);
				conn = DriverManager.getConnection(url,"root","root");//url,用户名,密码
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return conn;
	}	
	public static void main(String[] args) {
		//System.out.println(DBUtil.getConnection()+"dcsv");
	}
}

下面是公共的dao层代码实现

package com.eduask.util;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
/**
 * dao层的通用单表查询语句的方法
 * @author Administrator
 */
public class BasicDao{

	public int runSql(String sql, Object...args){
		//定义查询成功与否的状态变量大于0 表示成功,否则失败
		int flag = -1;
		//获取数据库连接对象
		Connection conn = DBUtil.getConnection();
		try {
			//获取预编译对象
			PreparedStatement ps = conn.prepareStatement(sql);
			//循环给sql中的问号赋值
			for (int i = 0; i < args.length; i++) {
				ps.setObject(i+1, args[i]);
			}
			//执行sql
			flag = ps.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}		
		//返回状态
		return flag;
	}
	
	/**
	 * 该方法是单表查询语句的公共方法
	 * @param sql sql语句
	 * @param t 查询的对象,查询到数据之后会返回该对象的list集合,可以理解为吧查询到的每一条信息存在每一个T对象里面
	 * @param args 要填补占位符的可变参数,允许不传参数
	 * @return 返回的也是list集合,但是如果只返回一个的话,那么就返回只有一个元素的list 
	 */
	public List runQuery(String sql,T t,Object...args){
		//返回t的class
		Class clazz = t.getClass();
		//T job = (T)clazz.newInstance();
		//获取反射对象的属性
		Field [] fsshuxing = clazz.getDeclaredFields();
		//实例化一个数组来存放对象的真实属性
		String [] oshuxing = new String[fsshuxing.length];
		for (int i = 0; i < fsshuxing.length; i++) {//遍历fsshuxing
			//找到全路径最后一次出现.的位置
			int beginIndex = fsshuxing[i].toString().lastIndexOf(".");
			//以上面找到的值为起点截取最后的属性名并存入oshuxing里面
			oshuxing[i] = fsshuxing[i].toString().substring(beginIndex+1);
		}
		/*准备一个List集合来存入接收结果集的每一个对象*/
		List list = new ArrayList<>();
		//获取数据库连接对象
		Connection conn = DBUtil.getConnection();
		try {
			//根据数据库连接对象获取预编译对象
			PreparedStatement ps = conn.prepareStatement(sql);
			for (int i = 0; i < args.length; i++) {
				ps.setObject(i+1, args[i]);//给占位符赋值
			}
			ResultSet rs = ps.executeQuery();//接受结果集
			while(rs.next()){//如果有查询到值则进入循环
				//实例化一个对象
				T ot = (T)clazz.newInstance();
				//这里循环前面准备好的oshuxing数组,也就是传入对象的属性的数组
				for (int i = 0; i < oshuxing.length; i++) {
					//获取到当前属性字段
					Field f = clazz.getDeclaredField(oshuxing[i]);
					//通过反射设置属性权限为可访问
					f.setAccessible(true);
					//给当前属性设值
					f.set(ot, rs.getObject(oshuxing[i]));				
				}
				//一次设值完成之后把对象添加到lsit集合
				list.add(ot);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return list;//返回list集合
	}
	
}
上面代码分别放在两个类里面然后通过其它层调用父类方法即可

例如新建一个Test类来测试,下面是demo

该类是要继承BasicDao的,由于BasicDao是是一个泛型类,所以需要指定泛型的类型,如果不用泛型类的话那就使用非泛型类里面的泛型方法来实现,实现之后Test类要查询数据的时候就直接调用父类的查询或者其他方法来实现,如下面的super.runSql(sql,args),该方法是增删改通用的一个方法,传入sql语句和填补占位符的数组(或则参数列表);runQuery(sql,new Admin(),args) 则是查询的通用方法,都返回一个对象的list集合,参数列表是sql语句,对象实体,站位符对应的值。

package com.eduask.daoImpl;

import java.util.List;

import com.eduask.entity.Admin;
import com.eduask.util.BasicDao;

public class Test extends BasicDao{
	
	/**
	 * 更新Admin
	 * @param admin
	 * @return
	 */
	public int updateAdmin(Admin newAdmin) {

		String sql = "update admin set password = ?,number = ?,sid = ? where aid = ?";
		
		Object [] args = {newAdmin.getPassword(),newAdmin.getNumber(),newAdmin.getSid(),newAdmin.getAid()};
		
		return super.runSql(sql, args);
		
	}
	/**
	 * 查询所有Admin
	 * @return
	 */
	public List queryAllAdmin() {

		String sql = "select * from admin order by isdisable desc";
		
		List list = super.runQuery(sql, new Admin());
		
		return list;
	}
	/**
	 * 查询单个Admin
  * @return 实体对象
  **/
	public Admin queryAdmin(String username) {
	
		Admin admin = null;
		
		String sql = "select * from admin where username = ?";
		
		List list = super.runQuery(sql, new Admin(), username);
		int num = list.size();
		//如果查出的list长度大于一则有值取其第一个元素,否则没有值返回null
		admin = num>0?list.get(0):null;
		
		return admin;
	}
	
}



你可能感兴趣的:(maxw_find)