JDBC
通用的操作于数据库的类分为两大类:
1. 查询
public class BaseDao<T> {
/*
* 查询
* 返回值:List<User>
* 参数:sql,参数Object[] args,Class cls
*/
public List<T> query(String sql,Object[] args,Class<T> cls){
List<T> list=new ArrayList(); //把获取到的所有对象放进list中返回
Connection conn=null;
PreparedStatement state=null;
ResultSet result=null;
try {
conn=DBUtils.getConnection();
state=conn.prepareStatement(sql);
//循环遍历参数数组,给sql中的?赋值
if(args!=null){
for(int i=0;i<args.length;i++){
state.setObject(1+i,args[i]);
}
}
//执行
result=state.executeQuery();
//获取结果集的元信息对象
ResultSetMetaData rsmd=result.getMetaData();
//获取字段个数
int count=rsmd.getColumnCount();
//循环一次是一条数据,果结果集中存在一条数据,就是一个对象
while(result.next()){
//1.创建对象
T obj=cls.newInstance();
//2.获取对象的每一个属性
for(int i=1;i<=count;i++){
//获取字段值
Object value=result.getObject(i);
//获取字段名字
String columnName=rsmd.getColumnLabel(i);
System.out.println(columnName);
//获取对象的属每一个性值
Field field=cls.getDeclaredField(columnName);
//私有的属性放开权限
field.setAccessible(true);
//给属性赋值
field.set(obj, value);
field.setAccessible(false);
}
//3.把对象装进集合
list.add(obj);
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
2.更新
/*
* 通用的更新操作
* 返回值: 成功|失败
* 参数: String sql
* ???参数值 Object数组
*/
public boolean update(String sql,Object[] args){
boolean flag=false;
Connection conn=null;
PreparedStatement state=null;
try {
conn=DBUtils.getConnection();
state=conn.prepareStatement(sql);
//sql中的站位赋值
if(args!=null){
for(int i=0;i<args.length;i++){
state.setObject(1+i,args[i]);
}
}
int row=state.executeUpdate();
if(row>0){
System.out.println("操作成功");
flag=true;
}else{
System.out.println("操作失败");
}
} catch (SQLException e) {
e.printStackTrace();
} finally{
DBUtils.close(state, conn);
}
return flag;
}
}
测试类
public class TestQuery {
public static void main(String[] args) {
BaseDao<User> base=new BaseDao();
String sql="select uname \"uname\",pwd \"pwd\" from tb_user";
List<User> ls=base.query(sql, null, User.class);
System.out.println(ls);
}
}
对于java中的doublt在数据库中会自动转换成BigDecimal的问题;
public List<T> query(String sql,Object[] args,Class<T> cls){
List<T> list=new ArrayList(); //把获取到的所有对象放进list中返回
Connection conn=null;
PreparedStatement state=null;
ResultSet result=null;
try {
conn=DBUtils.getConnection();
state=conn.prepareStatement(sql);
//循环遍历参数数组,给sql中的?赋值
if(args!=null){
for(int i=0;i<args.length;i++){
state.setObject(1+i,args[i]);
}
}
//执行
result=state.executeQuery();
//获取结果集的元信息对象
ResultSetMetaData rsmd=result.getMetaData();
//获取字段个数
int count=rsmd.getColumnCount();
//循环一次是一条数据,果结果集中存在一条数据,就是一个对象
while(result.next()){
//1.创建对象
T obj=cls.newInstance();
//2.获取对象的每一个属性
for(int i=1;i<=count;i++){
//获取字段名字
String columnName=rsmd.getColumnLabel(i);
//获取对象的属每一个性值
Field field=cls.getDeclaredField(columnName);
//私有的属性放开权限
field.setAccessible(true);
String fieldType=field.getType().getName();
// if("java.lang.Double".equals(fieldType)){
// Double d=result.getDouble(i);
// field.set(obj, d);
// }else if("java.lang.Integer".equals(fieldType)){
// Integer in=result.getInt(i);
// field.set(obj, in);
// }else{
//获取字段值
Object value=result.getObject(i);
System.out.println(value.getClass().getTypeName());
//给属性赋值
field.set(obj, value);
// }
field.setAccessible(false);
}
//3.把对象装进集合
list.add(obj);
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}