DAO:Data Access Object
是访问数据信息的类,包含了对数据的增删改查,而不包含任何业务相关的信息。
DAO可以被子类继承或直接使用。
实现功能的模块化,有利于代码的维护和升级。
使用JDBC编写DAO可能包含的方法:
void update(String sql,Object ... args);
<T>T get(Class<T> clazz,String sql,Object ... args);
<T>List<T> getForList(Class<T> clazz,String sql,Object ... args);
<E>E getForValue(String sql,Object ... args);
在JavaEE中,Java类的属性通过getter,setter来定义。操作Java的属性有一个工具包:beanutils。beanutils工具包需要借助logging工具包。
BeanUtils.getProperty(object,属性);
BeanUtils.setProperty(object,属性,值);
package jdbc;
import java.lang.reflect.InvocationTargetException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.beanutils.BeanUtils;
import jdbc.JDBCTools;
public class DAO {
public static void update(String sql,Object...args) {
Connection connection=null;
Statement statement=null;
PreparedStatement preparedStatement=null;
try {
connection=JDBCTools.getConnection();
preparedStatement=connection.prepareStatement(sql);
for(int i=0;i<args.length;i++) {
preparedStatement.setObject(i, args[i]);
}
preparedStatement.executeUpdate(sql);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCTools.release(null,preparedStatement,connection);
}
}
public static <T>T get(Class<T> clazz,String sql,Object ... args){
List<T> result=getForList(clazz,sql,args);
if(result.size()>0) {
return result.get(0);
}
return null;
}
public static <T>List<T> getForList(Class<T> clazz,String sql,Object ... args){
Connection connection=null;
PreparedStatement preparedStatement=null;
ResultSet resultSet=null;
List<T> list=null;
try {
connection=JDBCTools.getConnection();
preparedStatement=connection.prepareStatement(sql);
for(int i=0;i<args.length;i++) {
preparedStatement.setObject(i, args[i]);
}
resultSet=preparedStatement.executeQuery();
//把结果集变为map的集合,每一个map表示一个对象
List<Map<String,Object>>maps=handleResultSetToMapList(resultSet);
//把map的集合变为clazz类型的对象集合。
list=transfterMapListToBeanList(clazz, maps);
}catch(Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCTools.release(resultSet,preparedStatement,connection);
}
return list;
}
//优化,得到结果集的列名集
public static List<String> getColumnLabels(ResultSet resultSet) throws SQLException{
List<String>labels=new ArrayList();
ResultSetMetaData rsmd=resultSet.getMetaData();
for(int i=0;i<rsmd.getColumnCount();i++) {
labels.add(rsmd.getColumnLabel(i+1));
}
return labels;
}
//处理结果集,把结果集变为map的集合,每一个map表示一个对象
public static List<Map<String,Object>> handleResultSetToMapList(ResultSet resultSet) throws SQLException{
List<Map<String,Object>>maps=new ArrayList();
List<String> columnLabels=getColumnLabels(resultSet);//优化,得到结果集的列名集
Map<String,Object>map=null;
//3.处理ResultSet,使用while循环
while(resultSet.next()) {
map=new HashMap<>();
//4.处理结果集,利用ResultSetMetaData填充对应Map对象
for(String columnLabel:columnLabels) {
Object columnValue=resultSet.getObject(columnLabel);
map.put(columnLabel, columnValue);
}
maps.add(map);
}
return maps;
}
public static <T> List<T> transfterMapListToBeanList(Class<T> clazz,List<Map<String,Object>>maps)
throws InstantiationException, IllegalAccessException, InvocationTargetException{
List<T> list=null;
T object=null;
if(maps.size()>0) {
for(Map<String,Object>map:maps) {
for(Map.Entry<String, Object> entry:map.entrySet()) {
object=clazz.newInstance();
String fieldName=entry.getKey();
Object value=entry.getValue();
BeanUtils.setProperty(object, fieldName, value);
//ReflectionUtils.setFieldValue(entity,fieldName, value);//利用反射
}
list.add(object);
}
}
return list;
}
//返回某条记录的某一个字段的值,或一个统计的值。
public static <E>E getForValue(String sql,Object ... args){
Connection connection=null;
PreparedStatement preparedStatement=null;
ResultSet resultSet=null;
try {
connection=JDBCTools.getConnection();
preparedStatement=connection.prepareStatement(sql);
for(int i=0;i<args.length;i++) {
preparedStatement.setObject(i+1, args[i]);
}
resultSet=preparedStatement.executeQuery();
if(resultSet.next()) {
return (E)resultSet.getObject(1);
}
}catch(Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCTools.release(resultSet, preparedStatement, connection);
}
return null;
}
}
来源:CSDN
作者:Asher_S
链接:https://blog.csdn.net/Asher_S/article/details/90261333