DAO:Data Access Object
Access to information is a class of data, including data on the additions and deletions to change search, and does not include any business-related information.
DAO can be inherited by subclasses or used directly.
Achieve functional modularity, help maintain and upgrade the code.
Write method using JDBC DAO may contain:
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);
In the JavaEE, Java classes, attributes defined by getter, setter. The property has an operating Java toolkit: BeanUtils . beanutils Kit need help logging toolkit.
BeanUtils.getProperty(object,属性);
BeanUtils.setProperty (object, property, value);
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;
}
}