7.DAO design patterns (Silicon Valley, yet notes)

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;
	}
}

 

Published 90 original articles · won praise 48 · views 10000 +

Guess you like

Origin blog.csdn.net/Asher_S/article/details/90261333