7.DAO设计模式(尚硅谷笔记)

我们两清 提交于 2019-11-28 11:57:06

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

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!