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工具类一样你们觉得那个工具类更好用呢?