8 DAO及其相关实现类

时间:2021-05-30
本文章向大家介绍8 DAO及其相关实现类,主要包括8 DAO及其相关实现类使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

DAO及其相关实现类

//对传入的Class进行修改

public abstract class BaseDAO {
	
	
	public int update(Connection conn,String sql,Object...args) {
		 

		PreparedStatement ps = null;
		try {
			conn = JDBCUtils.getConnection();
			//1.预编译sql语句:返回PreparedStatement的实例
			ps = conn.prepareStatement(sql);
			//2.填充占位符
			for(int i = 0;i < args.length;i++) {
				
				ps.setObject(i + 1, args[i]);
			}
			//3.执行
			ps.executeUpdate();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			
			//修改其为自动提交数据
			//主要针对于数据连接池的使用
			try {
				conn.setAutoCommit(true);
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			//4.资源关闭
			JDBCUtils.closeResource(null, ps);
			
		}
		return 0;
	}
	
	public <T>T getInstance(Connection conn,Class<T> clazz,String sql,Object...args) {
		
		
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			conn = JDBCUtils.getConnection();
			ps = conn.prepareStatement(sql);
			for(int i = 0;i<args.length;i++){
				ps.setObject(i + 1, args[i]);
			}
			
			rs = ps.executeQuery();
			//获取结果集的元数据:ResultSetMetaData
			ResultSetMetaData rsmd = rs.getMetaData();
			//通过ResultSetMetaData获取结果集中的列数
			int columnCount = rsmd.getColumnCount();
			
			if(rs.next()) {
				T t = clazz.newInstance();
				
				for(int i =0;i<columnCount;i++ ) {
					 //处理结果集一行数据中的每一个列
					Object columnValue = rs.getObject(i + 1);
					 //获取列值
					String columnLabel = rsmd.getColumnLabel(i + 1);
					 //给t对象指定的某个属性,赋值为columvalue,通过反射
					Field field = t.getClass().getDeclaredField(columnLabel);
					field.setAccessible(true);
					field.set(t, columnValue);
					
				}
				return t;			
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			JDBCUtils.closeResource(null, ps, rs);
		} 		
		return null;
	}
}


public abstract class BaseDAO<T> {
	
	private Class<T> clazz = null;
	
	{
		/*如同Person类 父类 中有个 eat() 方法中   有个  this.sleep() new Person 调用方法时,这个this是person
		 * Student 子类  继承父类 调用 方法  这个this是Student的
		 * 
		 * 静态代码块不能调用非静态的属性
		 * 
		 * 代码块在构造器前执行,子类构造器中 有super() 加载父类结构 
		 * */
		
		//this 是子类对象  所在类的带泛型的父类
		//获取当前BaseDAO的子类继承的父类中的泛型
		Type genericSuperclass = this.getClass().getGenericSuperclass();	
		ParameterizedType paramType = (ParameterizedType) genericSuperclass;
		
		//获取父类的泛型参数
		Type[] typeArguments = paramType.getActualTypeArguments();
		clazz = (Class<T>) typeArguments[0]; 
	}


	public int update(Connection conn,String sql,Object...args) {
		 

		PreparedStatement ps = null;
		try {
			conn = JDBCUtils.getConnection();
			//1.预编译sql语句:返回PreparedStatement的实例
			ps = conn.prepareStatement(sql);
			//2.填充占位符
			for(int i = 0;i < args.length;i++) {
				
				ps.setObject(i + 1, args[i]);
			}
			//3.执行
			ps.executeUpdate();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			
			//修改其为自动提交数据
			//主要针对于数据连接池的使用
			try {
				conn.setAutoCommit(true);
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			//4.资源关闭
			JDBCUtils.closeResource(null, ps);
			
		}
		return 0;
	}
	
	public T getInstance(Connection conn,String sql,Object...args) {
		
		
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			conn = JDBCUtils.getConnection();
			ps = conn.prepareStatement(sql);
			for(int i = 0;i<args.length;i++){
				ps.setObject(i + 1, args[i]);
			}
			
			rs = ps.executeQuery();
			//获取结果集的元数据:ResultSetMetaData
			ResultSetMetaData rsmd = rs.getMetaData();
			//通过ResultSetMetaData获取结果集中的列数
			int columnCount = rsmd.getColumnCount();
			
			if(rs.next()) {
				T t = clazz.newInstance();
				
				for(int i =0;i<columnCount;i++ ) {
					 //处理结果集一行数据中的每一个列
					Object columnValue = rs.getObject(i + 1);
					 //获取列值
					String columnLabel = rsmd.getColumnLabel(i + 1);
					 //给t对象指定的某个属性,赋值为columvalue,通过反射
					Field field = t.getClass().getDeclaredField(columnLabel);
					field.setAccessible(true);
					field.set(t, columnValue);
					
				}
				return t;			
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			JDBCUtils.closeResource(null, ps, rs);
		} 		
		return null;
	}
	
}

原文地址:https://www.cnblogs.com/flypigggg/p/14828982.html