JDBC第五天之DAO

什么是DAO,有什么用?

 封装了针对于数据表的通用的操作
 DAO:data(base) access object

比如说你要你要插入一个新的用户..那么.在DAO中我们只需要提供一个insertUser(User user)这一个方法就可以了..具体的操作是在DAO中实现的...
那么对于要调用DAO的时候.我们只要知道insertUser(User)是用来插入一个新的用户...而不需要知道是如何实现的..

怎么使用???

第一步:数据库中有一张表

第二步:源代码中有一个实体类

第三步:源代码中有一个dao接口

第四步:源代码中有一个dao接口的实现类

第五步:实体类中实现具体的关于数据的增删改查。

package DAO;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.junit.Test;

import Bean.Customer;
import JDBCutil.JDBCconn;

/*
 * 封装了针对于数据表的通用的操作
 *DAO:data(base) access object
 *
 * */
//因为不会造他的对象,而是用他里面声明的方法,虽然没有抽象方法
public abstract class BaseDao {
	// 通用增删改---version 2.0(考虑上事务)
	public int updateInfo(Connection conn, String sql, Object... args) {

		PreparedStatement p1 = null;
		try {
			// 1.预编译sql语句,返回PreparedStatement的实例
			p1 = conn.prepareStatement(sql);
			// 2.填充占位符接下来具体的增删改操作循环,此时你有多少个参数就执行多少次,所以是args.length
			for (int i = 0; i < args.length; i++) {
				// 注意前面的参数是对应数据库中的哪个字段,而索引是从1开始的,所以是i+1,而后面的是java中的数组所以是i
				p1.setObject(i + 1, args[i]);
			}
			// 3.执行
			return p1.executeUpdate();

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			// 4.关闭资源
		} finally {
			try {
				if (p1 != null)
					p1.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			// 不能在此关闭链接,因为链接一关闭,就会自动提交数据,所以要再具体操作完成之后统一关闭链接
//			conn.close();

		}
		return 0;
	}

//通用查询2.0版本 考虑上事务 查询单条
	public <E> E querySimple(Connection conn, Class<E> clazz, String sql, Object... args){
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			ps = conn.prepareStatement(sql);
			for (int i = 0; i < args.length; i++) {
				ps.setObject(i + 1, args[i]);
			}
			rs = ps.executeQuery();
			ResultSetMetaData data = rs.getMetaData();
			int columnCount = data.getColumnCount();
			if (rs.next()) {
				E e = clazz.newInstance();
				for (int i = 0; i < columnCount; i++) {
					Object columnValue = rs.getObject(i + 1);
					String columnLabel = data.getColumnLabel(i + 1);

					Field field = clazz.getDeclaredField(columnLabel);
					field.setAccessible(true);
					field.set(e, columnValue);
				}
				return e;
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 不能在此关闭链接,因为链接一关闭,就会自动提交数据,所以要再具体操作完成之后统一关闭链接
//			conn.close();
			JDBCconn.closeResource(null, ps, rs);
		}
		return null;
	}

	// 查询多条考虑上事务的版本
	public <E> List<E> queryMultiple(Connection conn, Class<E> clazz, String sql, Object... args) {
		// 1.获取4个基本信息并获取链接
		ResultSet rs = null;
		PreparedStatement ps = null;
		try {
			ps = conn.prepareStatement(sql);
			for (int i = 0; i < args.length; i++) {
				ps.setObject(i + 1, args[i]);
			}
			// 执行并返回结果集
			rs = ps.executeQuery();
			// 通过结果集的元数据,获取列数
			ResultSetMetaData data = rs.getMetaData();
			// 获取数据库的总共的字段名字的个数
			int count = data.getColumnCount();
			// 创建存放数据的对应<E>类型的集合
			List<E> list = new ArrayList<>();
			// 由于是多条 故不用if 而用while
			while (rs.next()) {
				// 通过运行时类的实例创建<E>的对象
				E e = clazz.newInstance();
				for (int i = 0; i < count; i++) {
					// 获取对应 比如id,name等在数据库的值
					Object columnValue = rs.getObject(i + 1);
					// 获取数据库中的字段起了别名的名字
					String columnName = data.getColumnLabel(i + 1);
					// 通过反射将结果集中的数据赋值给对应的属性
					Field field = clazz.getDeclaredField(columnName);
					field.setAccessible(true);
					field.set(e, columnValue);
				}
				// 当for结束时 将一个对象塞进去集合
				list.add(e);
			}
			// 当循环结束时,返回整个集合
			return list;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 不能在此关闭链接,因为链接一关闭,就会自动提交数据,所以要再具体操作完成之后统一关闭链接
//			conn.close();
			JDBCconn.closeResource(null, ps, rs);
		}
		return null;
	}
	//针对分组函数的通用查询
	public <E> E getValue(Connection conn,String sql,Object...args)  {
		PreparedStatement ps=null;
		ResultSet rs=null;
		try {
			ps = conn.prepareStatement(sql);
			for(int i = 0;i<args.length;i++) {
				ps.setObject(i+1, args[i]);
			}
			rs = ps.executeQuery();
			if(rs.next()) {
			      Object object = rs.getObject(1);
			      return (E) object;
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {			
			JDBCconn.closeResource(null, ps, rs);
		}
		return null;
		
	}

}

package DAO;

import java.sql.Connection;
import java.sql.Date;
import java.util.List;


import java.sql.Date;
import Bean.Customer;

/*
 * 此接口用于规范针对customer表的常用擦欧总
 *  
 * 
 * */
public interface CustomerDAO {
	/**
	 * 将cust对象添加到数据库中
	 * @param coll
	 * @param cust
	 */
  void insert(Connection conn,Customer cust);
  
  /**
   * 根据id删除表中记录
   * @param coll
   * @param id
   */
  void deleteById(Connection conn,int id);
  /**
   * 针对于内存中的id将要修改的对象的值去修改数据库中指定的记录
   * @param coll
   * @param cust
   */
  void update(Connection conn,Customer cust,int id);
  /**
   * 根据id返回数据库中的一条记录
   * @param coll
   * @param id
 * @return 
   */
  Customer getCustomerById(Connection conn,int id);
  /**
   * 获取cust表中所有的记录
   * @param conn
   * @return
   */
  List <Customer> getAllData(Connection conn);
  /**
   * 返回数据表中数据的条目数;
   * @param conn
   * @return
   */
  Long getCount(Connection conn);
  
  /**
   * 返回表中最大的生日
   * @param conn
   * @return
   */
  Date getMaxBirth(Connection conn);
}
package DAO;


import java.sql.Connection;
import java.sql.Date;
import java.util.List;



import JDBCutil.JDBCconn;

import Bean.Customer;

public class CustmerImpl extends BaseDao implements CustomerDAO {
   
	@Override
	public void insert(Connection conn, Customer cust) {
		String sql = "insert into customers (id,name,email,birth) values(?,?,?,?)";
		updateInfo(conn, sql, cust.getId(),cust.getName(),cust.getEmail(),cust.getBirth());
	}

	@Override
	public void deleteById(Connection conn, int id) {
		String sql = "delete from customers where id = ?";
		updateInfo(conn,sql,id);
		
	}

	@Override
	public void update(Connection conn, Customer cust,int id) {
		String sql = "update customers set id=?,name=?,email=?,birth=? where id=?";
		updateInfo(conn, sql, cust.getId(),cust.getName(),cust.getEmail(),cust.getBirth(),id);
		
	}


	

	@Override
	public Customer getCustomerById(Connection conn, int id)  {
		String sql = "select id,name,email,birth from customers where id = ?";
		Customer customer = querySimple(conn,Customer.class, sql, id);
	    return customer;
	}

	@Override
	public List<Customer> getAllData(Connection conn) {
		String sql = "select id,name,email,birth from customers";
		List<Customer> list = queryMultiple(conn, Customer.class, sql);
		return list;
	}

	@Override
	public Long getCount(Connection conn) {
		String sql = "select count(*) from customers";
		 
		return getValue(conn,sql);
	}

	@Override
	public Date getMaxBirth(Connection conn) {
		String sql = "select Max(birth) from customers ";
		Date value = getValue(conn, sql);
		return value;
	}


	

	
	

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hyong~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值