JDBC工具类BaseDao与DBUtil的相爱相杀

JDBC工具类BaseDao与DBUtil的相爱相杀

在做java+mysql+JDBC中的案例中,使用JDBC时工具类的辅助必不可少!!!今天我就来说一下工具类DBUtil与BaseDao之间一些细微的关系!

首先先对比一下工具类BaseDao和DBUtil的代码构成把

//这是BaseDao工具类的代码构成

package com.zt.util;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;

/**
 * 数据库操作的工具类
 * 
 *
 */
public class BaseDao {
	Connection conn=null;
	PreparedStatement pstmt=null;
	ResultSet rst=null;
	private static String driver;
	private static String url;
	private static String username;
	private static String password;
	static {
		init();
	}
	public static void init() {
		Properties ps=new Properties();
		InputStream is=BaseDao.class.getClassLoader().getResourceAsStream("database.properties");
		try {
			ps.load(is);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//
		driver= ps.get("driver").toString();
		url= ps.get("url").toString();
		username= ps.get("username").toString();
		password= ps.get("password").toString();
	}
	//得到连接的方法
	public Connection getConn() {
		try {
			//1、加载驱动类
			Class.forName(driver);
			//2、建立连接
			conn=DriverManager.getConnection(url, username, password);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return conn;
	}
	//执行增删改
	public int executeUpdate(String sql,Object...params) {
		//
		try {
			//得到连接
			conn=getConn();
			//创建PreparedStatement
			pstmt= conn.prepareStatement(sql);//预编译
			//给占位符赋值
			if(params!=null) {
				for(int i=0;i<params.length;i++) {
					pstmt.setObject(i+1, params[i]);
				}
			}			
			//执行操作
			return pstmt.executeUpdate();			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
		return 0;		
	}
	
	
	
	//执行查询
	public ResultSet executeQuery(String sql,Object...params) {
		try {
			//得到连接
			conn= getConn();
			//创建PreparedStatement
			pstmt= conn.prepareStatement(sql);
			//给占位符赋值
			if(params!=null) {
				for(int i=0;i<params.length;i++) {
					pstmt.setObject(i+1, params[i]);
				}
			}
			//执行操作
			rst= pstmt.executeQuery();			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return rst;
	}
	
	
	//关闭接口的方法
	public void closeAll() {
		try {
			if(rst!=null) {
				rst.close();
			}
			if(pstmt!=null) {
				pstmt.close();
			}
			if(conn!=null) {
				conn.close();
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}		
	}
}

//这是DBUtil工具类的代码构成

package com.zt.util;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Properties;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;

public class DBUtil {
	Connection conn=null;
	PreparedStatement pstmt=null;
	ResultSet rst=null;
	private static String driver;
	private static String url;
	private static String username;
	private static String password;
	
	static {
		init();
	}
	
	public static void init() {
		Properties ps=new Properties();
		InputStream is=BaseDao.class.getClassLoader().getResourceAsStream("database.properties");
		try {
			ps.load(is);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//
		driver= ps.get("driver").toString();
		url= ps.get("url").toString();
		username= ps.get("username").toString();
		password= ps.get("password").toString();
		
	}
	
	//得到连接的方法
	public Connection getConn() {
		try {
			//1、加载驱动类
			Class.forName(driver);
			//2、建立连接
			conn=DriverManager.getConnection(url, username, password);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return conn;
	}
		
	
	//执行增删改的方法
	public int executeUpdate(String sql,Object...params) {
		QueryRunner qr=new QueryRunner();
	    //
		try {
			return qr.update(getConn(), sql, params);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			closeAll();
		}
		return 0;
	}
	
	//执行查询返回单个对象
	public Object getObject(Class clazz,String sql,Object...params) {
		QueryRunner qr=new QueryRunner();
		conn=getConn();
		try {
			return qr.query(conn, sql, new BeanHandler<>(clazz), params);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			closeAll();
		}
		return null;
	}
		
	
	//执行查询,返回集合
	public List getObjects(Class clazz,String sql,Object...params) {
		QueryRunner qr=new QueryRunner();
		conn=getConn();
		try {
			return qr.query(conn, sql, new BeanListHandler<Class>(clazz), params);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			closeAll();
		}
		return null;
	}
	
	
	//执行查询,返回单个值
	public ResultSet executeQuery(String sql,Object...params) {
		try {
			//得到连接
			conn= getConn();
			//创建PreparedStatement
			pstmt= conn.prepareStatement(sql);
			//给占位符赋值
			if(params!=null) {
				for(int i=0;i<params.length;i++) {
					pstmt.setObject(i+1, params[i]);
				}
			}
			//执行操作
			rst= pstmt.executeQuery();			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return rst;
	}
		
	
	//关闭连接
	public void closeAll() {
		try {
			if(rst!=null) {
				rst.close();
			}
			if(pstmt!=null) {
				pstmt.close();
			}
			if(conn!=null) {
				conn.close();
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}		
	}
}

两个工具类都实现了连接数据库、数据的增删改以及查询的功能,两个工具类连接数据库的方法是一样的,所以在这里就不进行比较了,重点是看一下数据库的增删改查功能!!!
两个工具类数据的增删改查功能代码实现:
BaseDao工具类:
在这里插入图片描述
DBUtil工具类:
在这里插入图片描述
两种工具类数据的查询代码实现:
BaseDao工具类:
在这里插入图片描述
在DBUtil工具类中,查询数据分为三种情况:1.返回单个值、2.返回集合、3.返回对象,而在第二种情况和第三种情况中,两个代码实现极为相识,不同的是,返回集合时,return 使用的方法是BeanListHandler,而在返回单个对象时,return使用的方法是BeanHandler,
所以用DBUtil工具类实现查询时,应该分别使用带不同参数作为返回值的方法
DBUtil查询数据返回单个对象的代码实现:
在这里插入图片描述
DBUtil查询数据返回集合的代码实现:
在这里插入图片描述
DBUtil查询数据返回单个值的代码实现:
在实现返回单个值查询数据的情况下,他和BaseDao的查询方法是一致的。
在这里插入图片描述
虽然表面看起来,BaseDao比DBUtil的代码实现更为简便,但其实不然,当但使用BaseDao工具类时,每次进行查询操作时,都需要循环调用set方法,而在使用DBUtil工具类后,每次执行查询时就不用每次都调用set()方法往数据库取值,只需要一行代码,就可以代替BaseDao工具类查询时的复杂代码实现了,具体对比看代码实现:
BaseDao工具类查询:

package dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import Util.BaseDao;
import dao.PetOwnerDao;
import entity.PetOwner;

public class PetOwnerDaoImpl extends BaseDao implements PetOwnerDao {

	@Override
	public PetOwner login(String name, String password) {
		PetOwner petowner=null;
		String sql="select * from petowner where name=? and password=?";
		ResultSet rs=execute(sql, name,password);
		try {
			if(rs.next()) {
				String uname=rs.getString("name");
				String upassword=rs.getString("password");
				petowner=new PetOwner(uname,upassword);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return petowner;
	}
	//查询宠物主人信息
	@Override
	public List<PetOwner> getAllOwner() {
		List<PetOwner> listPetOwner=new ArrayList<PetOwner>();
		String sql="select * from petowner";
		ResultSet rs=execute(sql);
		try {
			while(rs.next()) {
				int id=rs.getInt(1);
				String name=rs.getString(2);
				PetOwner pt=new PetOwner(id, name);
				listPetOwner.add(pt);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return listPetOwner;
		
	}

}

//使用DBUtil工具类实现查询功能代码实现:
在这里插入图片描述
对比两种不同工具类相同功能的代码实现图可以看出,确实DBUtil工具类相比于BaseDao更胜一筹,前者可以通过继承来实现冗余代码的简化,不过,小星星觉得萝卜青菜,各有所爱把,就像我本人自己更偏爱于BaseDao工具类一样你们觉得那个工具类更好用呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值