栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JDBC第五天之DAO

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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;


//因为不会造他的对象,而是用他里面声明的方法,虽然没有抽象方法
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 querySimple(Connection conn, Class 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  List queryMultiple(Connection conn, Class 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();
			// 创建存放数据的对应类型的集合
			List list = new ArrayList<>();
			// 由于是多条 故不用if 而用while
			while (rs.next()) {
				// 通过运行时类的实例创建的对象
				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 getValue(Connection conn,String sql,Object...args)  {
		PreparedStatement ps=null;
		ResultSet rs=null;
		try {
			ps = conn.prepareStatement(sql);
			for(int i = 0;i

package DAO;

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


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


public interface CustomerDAO {
	
  void insert(Connection conn,Customer cust);
  
  
  void deleteById(Connection conn,int id);
  
  void update(Connection conn,Customer cust,int id);
  
  Customer getCustomerById(Connection conn,int id);
  
  List  getAllData(Connection conn);
  
  Long getCount(Connection conn);
  
  
  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 getAllData(Connection conn) {
		String sql = "select id,name,email,birth from customers";
		List 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;
	}


	

	
	

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/310715.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号