获取数据库连接对象代码实
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");
}
}
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;
}
}