jdbc中首次了解DAO及其子类

news/2024/8/25 14:14:22

DAO: data(base) access object用于与数据库进行交互

1.实体类Customer.java

package loey.java1.bean;

import java.sql.Date;

/*
 * ORM编程思想  (object relational mapping)
 * 一个数据表对应一个java类
 * 表中的一条记录对应java类的一个对象
 * 表中的一个字段对应java类的一个属性
 * 
 */
public class Customer {
	
	private int id;
	private String name;
	private String email;
	private Date birth;
	public Customer() {
		super();
	}
	public Customer(int id, String name, String email, Date birth) {
		super();
		this.id = id;
		this.name = name;
		this.email = email;
		this.birth = birth;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public Date getBirth() {
		return birth;
	}
	public void setBirth(Date birth) {
		this.birth = birth;
	}
	@Override
	public String toString() {
		return "Customer [id=" + id + ", name=" + name + ", email=" + email + ", birth=" + birth + "]";
	}
	
	
	
}

2.BaseDAO.java

/*
 * DAO: data(base) access object
 * 封装了针对于数据表的通用的操作
 */
public abstract class BaseDAO<T> {
	
	private Class<T> clazz = null;
	
//	public BaseDAO(){
//		
//	}
	
	{	
		//获取当前BaseDAO的子类继承的父类中的泛型
		Type genericSuperclass = this.getClass().getGenericSuperclass();
		ParameterizedType paramType = (ParameterizedType) genericSuperclass;
		
		Type[] typeArguments = paramType.getActualTypeArguments();//获取了父类的泛型参数
		clazz = (Class<T>) typeArguments[0];//泛型的第一个参数
		
	}
	
	
	// 通用的增删改操作---version 2.0 (考虑上事务
	public int update(Connection conn, String sql, Object... args) {// sql中占位符的个数与可变形参的长度相同!
		PreparedStatement ps = null;
		try {
			// 1.预编译sql语句,返回PreparedStatement的实例
			ps = conn.prepareStatement(sql);
			// 2.填充占位符
			for (int i = 0; i < args.length; i++) {
				ps.setObject(i + 1, args[i]);// 小心参数声明错误!!
			}
			// 3.执行
			return ps.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 4.资源的关闭
			JDBCUtils.closeResource(null, ps);

		}
		return 0;

	}

	// 通用的查询操作,用于返回数据表中的一条记录(version 2.0:考虑上事务
	public T getInstance(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();
			// 获取结果集的元数据 :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 columValue = rs.getObject(i + 1);

					// 获取每个列的列名
					// String columnName = rsmd.getColumnName(i + 1);
					String columnLabel = rsmd.getColumnLabel(i + 1);

					// 给t对象指定的columnName属性,赋值为columValue:通过反射
					Field field = clazz.getDeclaredField(columnLabel);
					field.setAccessible(true);
					field.set(t, columValue);
				}
				return t;
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtils.closeResource(null, ps, rs);

		}

		return null;
	}
	// 通用的查询操作,用于返回数据表中的多条记录构成的集合(version 2.0:考虑上事务
	public List<T> getForList(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();
			// 获取结果集的元数据 :ResultSetMetaData
			ResultSetMetaData rsmd = rs.getMetaData();
			// 通过ResultSetMetaData获取结果集中的列数
			int columnCount = rsmd.getColumnCount();
			// 创建集合对象
			ArrayList<T> list = new ArrayList<T>();
			while (rs.next()) {
				T t = clazz.newInstance();
				// 处理结果集一行数据中的每一个列:给t对象指定的属性赋值
				for (int i = 0; i < columnCount; i++) {
					// 获取列值
					Object columValue = rs.getObject(i + 1);

					// 获取每个列的列名
					// String columnName = rsmd.getColumnName(i + 1);
					String columnLabel = rsmd.getColumnLabel(i + 1);

					// 给t对象指定的columnName属性,赋值为columValue:通过反射
					Field field = clazz.getDeclaredField(columnLabel);
					field.setAccessible(true);
					field.set(t, columValue);
				}
				list.add(t);
			}

			return list;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtils.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()){
				return (E) rs.getObject(1);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			JDBCUtils.closeResource(null, ps, rs);
			
		}
		return null;
		
	}	
}

3.CustomerDAO.java

/*
 * 此接口用于规范针对于customers表的常用操作
 */
public interface CustomerDAO {
	/**
	 * 
	 * @Description 将cust对象添加到数据库中
	 * @author shkstart
	 * @date 上午11:00:27
	 * @param conn
	 * @param cust
	 */
	void insert(Connection conn,Customer cust);
	/**
	 * 
	 * @Description 针对指定的id,删除表中的一条记录
	 * @author shkstart
	 * @date 上午11:01:07
	 * @param conn
	 * @param id
	 */
	void deleteById(Connection conn,int id);
	/**
	 * 
	 * @Description 针对内存中的cust对象,去修改数据表中指定的记录
	 * @author shkstart
	 * @date 上午11:02:14
	 * @param conn
	 * @param cust
	 */
	void update(Connection conn,Customer cust);
	/**
	 * 
	 * @Description 针对指定的id查询得到对应的Customer对象
	 * @author shkstart
	 * @date 上午11:02:59
	 * @param conn
	 * @param id
	 */
	Customer getCustomerById(Connection conn,int id);
	/**
	 * 
	 * @Description 查询表中的所记录构成的集合
	 * @author shkstart
	 * @date 上午11:03:50
	 * @param conn
	 * @return
	 */
	List<Customer> getAll(Connection conn);
	/**
	 * 
	 * @Description 返回数据表中的数据的条目数
	 * @author shkstart
	 * @date 上午11:04:44
	 * @param conn
	 * @return
	 */
	Long getCount(Connection conn);
	
	/**
	 * 
	 * @Description 返回数据表中最大的生日
	 * @author shkstart
	 * @date 上午11:05:33
	 * @param conn
	 * @return
	 */
	Date getMaxBirth(Connection conn);
	
}	

4.CustomerDAOImpl.java

public class CustomerDAOImpl extends BaseDAO<Customer> implements CustomerDAO{
	

	@Override
	public void insert(Connection conn, Customer cust) {
		String sql = "insert into customers(name,email,birth)values(?,?,?)";
		update(conn, sql,cust.getName(),cust.getEmail(),cust.getBirth());
	}

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

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

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

	@Override
	public List<Customer> getAll(Connection conn) {
		String sql = "select id,name,email,birth from customers";
		List<Customer> list = getForList(conn, 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";
		return getValue(conn, sql);
	}

}

5.测试

package loey.java1.dao.junit;

import loey.DBCUtil.DBCUtil;
import loey.java1.bean.Customer;
import loey.java1.dao.CustomerDAOImpl;
import org.junit.Test;

import java.net.DatagramSocket;
import java.sql.Connection;
import java.sql.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAccessor;
import java.util.List;

public class CustomerDAOImplTest {

    private CustomerDAOImpl dao = new CustomerDAOImpl();

    @Test
    public void testInsert() {
        Connection conn = null;
        try {
            conn = DBCUtil.getConnection();

            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            java.util.Date date = sdf.parse("1992-11-27");
            Customer cust = new Customer(1, "朴灿烈", "pcy@163.com", new Date(date.getTime()));

            dao.insert(conn, cust);

            System.out.println("添加成功!");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBCUtil.close(conn,null,null);
        }
    }

    @Test
    public void testDeleteById(){
        Connection conn = null;
        try {
            conn = DBCUtil.getConnection();

            int id = 24;
            dao.deleteById(conn,id);

            System.out.println("删除成功");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBCUtil.close(conn,null,null);
        }
    }

    @Test
    public void testUpade(){
        Connection conn = null;
        try {
            conn = DBCUtil.getConnection();

            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            java.util.Date date = sdf.parse("1992-04-06");
            Customer cust = new Customer(23,"边伯贤","bbx@163.com",new Date(date.getTime()));

            dao.update(conn,cust);

            System.out.println("修改成功");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBCUtil.close(conn,null,null);
        }
    }

    @Test
    public void testGetCustomerById(){

        Connection conn = null;
        try {
            conn = DBCUtil.getConnection();

            int id = 6;
            Customer customer = dao.getCustomerById(conn, id);

            System.out.println(customer);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBCUtil.close(conn,null,null);
        }
    }

    @Test
    public void testGetAll(){
        Connection conn = null;
        try {
            conn = DBCUtil.getConnection();

            int id = 6;
            List<Customer> customers = dao.getAll(conn, id);

          customers.forEach(System.out::println);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBCUtil.close(conn,null,null);
        }
    }

    @Test
    public void testGetCount(){
        Connection conn = null;
        try {
            conn = DBCUtil.getConnection();

            Long count = dao.getCount(conn);

            System.out.println("该表共有" + count + "人");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBCUtil.close(conn,null,null);
        }
    }

    @Test
    public void testGetMaxBirth() {
        Connection conn = null;
        try {
            conn = DBCUtil.getConnection();

            Date maxBirth = dao.getMaxBirth(conn);

            System.out.println("最大的生日为:" + maxBirth);
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            DBCUtil.close(conn, null,null);

        }
    }

}



http://www.niftyadmin.cn/n/2145633.html

相关文章

nginx安装与部署

1:安装工具包 wget、vim和gcc yum install -y wget yum install -y vim-enhanced yum install -y make cmake gcc gcc-c 2:下载nginx安装包 wget http://nginx.org/download/nginx-1.6.2.tar.gz3:安装依赖包 yum install -y pcre pcre-devel yum install -y zlib zlib-devel …

linux运行速度慢怎么解决,Linux运行速度太慢的关键原因全都在这了

导读我们在搞清楚如何加速Linux计算机之前&#xff0c;需要知道哪些方法可以帮助我们找到引导时启动的服务、以更高或更低优先级运行的进程、CPU运行状况、内存是否塞满了过多数据&#xff0c;还要检查交换内存区是否已满。最后&#xff0c;我们还要检查硬盘是否运行正常。可能…

jdbc中的数据库连接池

1.传统连接的问题&#xff1a; 如何解决传统开发中的数据库连接问题:使用数据库连接池 2.使用数据库连接池的好处 资源重用 由于数据库连接得以重用&#xff0c;避免了频繁创建&#xff0c;释放连接引起的大量性能开销。在减少系统消耗 的基础上&#xff0c;另一方面也增加了…

用pm2管理hexo进程

2019独角兽企业重金招聘Python工程师标准>>> 一、在博客根目录下加如下js //run const { exec } require(child_process) exec(hexo server -p 80 & ,(error, stdout, stderr) > {if(error){console.log(exec error: ${error})return}console.log(stdout: $…

linux分配权限根据附加组吗,Linux用户、组和权限管理(一)

Linux是一个Multi-tasks(多任务)、 Multi-Users(多用户)的系统每一个登陆者或使用者都有用户标识、密码(所谓3A)所谓的3A&#xff1a;Authentication(验证机制)Authorization(授权机制)Audition(审计)组的概念&#xff1a;用户组&#xff0c;用户容器&#xff1b;是为了便于用户…

MVVM模式与第一个Vue程序

1.什么是MVVM模式&#xff1f; MVVM&#xff08;Model-View-ViewModel&#xff09;是一种软件架构设计模式&#xff0c;由微软 WPF&#xff08;用于替代 WinForm&#xff0c;以 前就是用这个技术开发桌面应用程序的&#xff09;和 Silverlight&#xff08;类似于 Java Applet&…

azkaban group分组,权限

翻译自&#xff1a;https://azkaban.readthedocs.io/en/latest/userManager.html?highlightgroup 1.job project&#xff0c;名为"e",分享给某人看&#xff0c;下图位置中添加那个人账号即可(可在lmk账号登录&#xff0c;并在 projects>>Personal>>看到…

linux配置文件前面有分号,Linux如何删除以分号开头的文件

Linux删除以破折号开头的文件Windows在批处理文件来删除隐藏属性昨天去打印店打印的材料.结果中毒.所有的文件被隐藏.生成一个一堆快捷键.回来后.我很容易地把它放入Linux机,我想删除这些文件怪. 下面是该过程,遇到的问题. 1.您无法删除-该文件的开头 最初 ...Linux Centos 删除…