新学了一个jdbc的工具类
DBUtils是java编程中的数据库操作实用工具,小巧简单实用。
DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码。
l QueryRunner中提供对sql语句操作的API.
l ResultSetHandler接口,用于定义select操作后,怎样封装结果集.
l DbUtils类,它就是一个工具类,定义了关闭资源与事务处理的方法
QueryRunner的两个方法
l update(Connection conn, Stringsql, Object... params) ,用来完成表数据的增加、删除、更新操作
l query(Connection conn, Stringsql, ResultSetHandler<T> rsh, Object... params) ,用来完成表数据的查询操作
//连接可以new QueryRunner时赋值 之后调用uadate和qury
1.1.1 ResultSetHandler结果集处理类
运用新学的这个工具类重新写了BaseDao这个工具类 但是感觉这样有点画蛇添足的感觉,应用QueryRunner已经觉得很方便了。如果加上反射的haunt 感觉会让这个类变得很奇葩。写了半天觉得这样还是很糟糕的感觉 。虽然解决了之前的查询之后的赋值问题。
package dao;
import java.lang.reflect.Field;
import java.nio.channels.SelectableChannel;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import annotation.ID;
import annotation.Table;
import entity.Emp;
import tools.ConnectionTool;
import tools.JDBCUtils;
import tools.SqlTool;
public class BaseDao {
private QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
/**
* 得到表名
*
* @param obj
* @return
*/
private static <T> String getTableName(T obj) {
Class<?> clazz = obj.getClass();
Table table = clazz.getAnnotation(Table.class);// 根据注解类型获得注解
if (table == null) {
return clazz.getSimpleName();
} else {
return table.value();// 根据注解值设置表名
}
}
/**
* 得到主键
*
* @param obj
* @return
*/
private static <T> Field getKey(T obj) {
Class<?> clazz = obj.getClass();
Field[] fs = clazz.getDeclaredFields();
Field id = null;
for (int i = 0; i < fs.length; i++) {
fs[i].setAccessible(true);
if (fs[i].getDeclaredAnnotation(ID.class) != null) {
id = fs[i];
break;
}
}
if (id == null) {
id = fs[0];
}
return id;
}
/**
* 插入一个记录
*
* @param obj
* @throws SQLException
*/
protected int insertObject(Object obj) throws SQLException {
// QueryRunner qr=new QueryRunner();
Class<?> clazz = obj.getClass();
String sql = SqlTool.makeSqlNew(clazz);
// System.out.println(sql);
Field[] fs = clazz.getDeclaredFields();
Object[] params = new Object[fs.length];
for (int i = 0; i < fs.length; i++) {
fs[i].setAccessible(true);
try {
params[i] = fs[i].get(obj);
} catch (IllegalArgumentException | IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return qr.update(sql, params);
}
/**
* 查找全部
*
* @param t
* @return List
*/
@SuppressWarnings("unchecked")
protected <T> List<T> selectAll(T t) {
// QueryRunner qr=new QueryRunner();
Class<?> clazz = t.getClass();
List<T> list = new ArrayList<>();
String sql = "select * from " + clazz.getSimpleName();
try {
list = qr.query(sql, new BeanListHandler<T>((Class<T>) t.getClass()));
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}
/**
* 通过主键查找记录
*
* @param obj
* @return
*/
@SuppressWarnings("unchecked")
protected <T> T selectObjectByID(T obj) {
// QueryRunner qr=new QueryRunner();
StringBuilder sb = new StringBuilder("select * from ");
T t = null;
sb.append(getTableName(obj));
// 获得所有属性 在里面找的有ID注解的属性
sb.append(" where " + getKey(obj).getName() + " = ?");
System.out.println(sb.toString());
try {
t = qr.query(sb.toString(), new BeanHandler<T>((Class<T>) obj.getClass()), getKey(obj).get(obj));
} catch (IllegalArgumentException | IllegalAccessException | SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return t;
}
/**
* 给定ids主键查询
*
* @param obj
* @param ids
* @return
*/
@SuppressWarnings("unchecked")
protected <T> List<T> selectObjectByIDs(T obj, int ids[]) {
List<T> list = new ArrayList<>();
StringBuilder sb = new StringBuilder("select * from ");
T t = null;
sb.append(getTableName(obj));
Field id = getKey(obj);
sb.append(" where " + id.getName().toString() + " in ");
String s = "(";
for (int a : ids) {
s = s + a + ",";
}
s = s.substring(0, s.length() - 1) + ")";
sb.append(s);
// System.out.println(sb.toString());
// QueryRunner qr=new QueryRunner();
try {
list = qr.query(sb.toString(), new BeanListHandler<T>((Class<T>) obj.getClass()));
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}
/**
* 根据sql语句查询 返回map
*
* @param sql
* @return
*/
protected List<Map<String, Object>> selectBySql(String sql) {
List<Map<String, Object>> list = new ArrayList<>();
try {
list = qr.query(sql, new MapListHandler());
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}
/**
* 通过主键修改
*
* @param obj
* @return
*/
protected <T> int updateById(T obj) {
int flag = 0;
Class<?> clazz = obj.getClass();
String sql = SqlTool.makeSqlUpdate(clazz);
// System.out.println(sql);
Field[] fs = clazz.getDeclaredFields();
Object[] params = new Object[fs.length + 1];
int i;
for (i = 0; i < fs.length; i++) {
fs[i].setAccessible(true);
try {
params[i] = fs[i].get(obj);
} catch (IllegalArgumentException | IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
params[i] = getKey(obj).get(obj);
flag = qr.update(sql, params);
} catch (SQLException | IllegalArgumentException | IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return flag;
}
/**
* 通过sql语句修改
*
* @param obj
* @param sql
* @return
*/
protected <T> int updateBySql(String sql) {
int flag = 0;
try {
flag = qr.update(sql);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return flag;
}
/**
* 根据指定的id删除
*
* @param obj
* @return
*/
protected <T> int deleteById(T obj) {
Field id = getKey(obj);
try {
String sql = "delete from " + getTableName(obj) + " where " + id.getName() + " = ?";
System.out.println(sql);
return qr.update(sql, id.get(obj));
} catch (IllegalArgumentException | IllegalAccessException | SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return 0;
}
}