1.为什么要封装工具类

在实际JDBC的使用中,存在着大量的重复代码:例如连接数据库、关闭数据库等这些操作!!
急需把传统的JDBC代码进行重构,抽象出一个通用的JDBC工具类!以后连接任何数据库,操作任何表都可以使用这个工具类来简化开发!!!

2.工具类代码

/**
* @author bruceliu
* @time 2019年4月2日上午9:59:27
* @Description JDBC操作的工具类,有一个传统的名字:BaseDao.java , 有些程序喜欢取别的名字: JDBCUtils.java
* Base:基础的
* Dao:数据库访问层
*/
public class BaseDao {

private Connection conn=null; //连接对象
private PreparedStatement ps=null; //执行SQL对象
private ResultSet rs=null; //结果集

/**
* 01-打开数据库连接
*/
private void openConn(){
try {
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/filmdb?useUnicode=true&characterEncoding=utf-8","root", "123");
} catch (Exception e) {
e.printStackTrace();
}
}


/**
* 02-通用的执行增删改的方法
*
* String sql="update stars set name=?,age=?,birthday=?,sex=? where id=?";
* Object[] params={"张三",18,"2010-10-10","男",1};
*
* String sql="insert into stars values (null,?,?,?,?,?,?)";
* Object[] params={"张三",18,"2010-10-10","冬季热","男","34534531534543534543543"};
*
* String sql="delete from stars where id=?";
* Object[] params={2};
*/
public int myexecuteUpdate(String sql,Object[] params){
this.openConn();//打开数据库连接
try {
ps=conn.prepareStatement(sql);
//有参数
if(params!=null){
for (int i = 0; i < params.length; i++) {
ps.setObject(i+1, params[i]);
}
}
return ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally{
this.closConn();//关闭数据库
}
return 0;
}

/**
* 03-通用的执行查询的方法
*
* String sql="select * from stars where age>? and id<?";
* Object[] parms={18,5};
*
* @return
*/
public ResultSet myexecuteQuery(String sql,Object[] parms){
this.openConn();
try {
ps=conn.prepareStatement(sql);
if(parms!=null){
for (int i = 0; i < parms.length; i++) {
ps.setObject(i+1, parms[i]);
}
}
rs=ps.executeQuery();
} catch (Exception e) {
e.printStackTrace();
}finally{
//查询的此处不能提前关闭数据库。不然话结果集合没法遍历
}
return rs;
}


/**
* 03-关闭数据库
*/
protected void closConn(){
try {
if(rs!=null){
rs.close();
}
if(ps!=null){
ps.close();
}
if(conn!=null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}

3.工具类测试

/**
* @author bruceliu
* @time 2019年4月2日上午10:40:05
* @Description 测试工具类 Java中有一个测试工具 单元测试:Junit
*/
public class TestBaseDao extends BaseDao {

/*
* 01-测试新增数据库 表示这个方法是一个测试方法
*/
@Test
public void testAdd() {
String sql = "insert into stars values (null,?,?,?,?,?,?)";
Object[] params = { "张三", 18, "2010-10-10", "冬季热", "男", "345345345433" };
int count = this.myexecuteUpdate(sql, params);
System.out.println(count > 0 ? "新增成功" : "新增失败");
}

/*
* 02-测试更新
*/
@Test
public void testUpdate() {
String sql = "update stars set name=?,age=?,birthday=?,sex=? where id=?";
Object[] params = { "张三", 18, "2010-10-10", "男", 1 };
int count = this.myexecuteUpdate(sql, params);
System.out.println(count > 0 ? "更新成功" : "更新失败");
}

/*
* 03-测试删除
*/
@Test
public void testDelete() {
String sql = "delete from stars where id=?";
Object[] params = { 1 };
int count = this.myexecuteUpdate(sql, params);
System.out.println(count > 0 ? "删除成功" : "删除失败");
}

/*
* 04-测试查询所有
*/
@Test
public void testQueryAll() {
try {
String sql = "select * from stars";
ResultSet rs = this.myexecuteQuery(sql, null); // null表示没有参数
while (rs.next()) {
int id = rs.getInt(1);
String name = rs.getString(2);
int age = rs.getInt(3);
String birthday = rs.getString(4);
String works = rs.getString(5);
String sex = rs.getString(6);
String idcard = rs.getString(7);
System.out.println(id + "\t" + name + "\t" + age + "\t" + birthday + "\t" + works + "\t" + sex + "\t" + idcard);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
this.closConn();
}
}

/*
* 05-带条件查询
*/
@Test
public void testQuery1() {
try {
String sql = "select * from stars where age>=? and id<=?";
Object[] params = { 4, 5 };
ResultSet rs = this.myexecuteQuery(sql, params); // null表示没有参数
while (rs.next()) {
int id = rs.getInt(1);
String name = rs.getString(2);
int age = rs.getInt(3);
String birthday = rs.getString(4);
String works = rs.getString(5);
String sex = rs.getString(6);
String idcard = rs.getString(7);
System.out.println(id + "\t" + name + "\t" + age + "\t" + birthday + "\t" + works + "\t" + sex + "\t" + idcard);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
this.closConn();
}
}
}

4.工具类优化

在src目录下创建jdbc.properties 文件
如果不想使用原来的数据库,需要修改java源码,可以将连接的4个要素配置到配置文件中,然后用java代码来读取配置文件。这样就不需要修改源代码,而仅仅修改配置文件即可,配置文件一般使用.properties文件

4.1.jdbc.properties文件里面的内容

url=jdbc:mysql://127.0.0.1:3306/web10?useUnicode=true&characterEncoding=UTF-8
username=root
password=root
driverName=com.mysql.jdbc.Driver

注意:书写属性的时候,不要书写双引号和空格。

4.2.最终版工具类

静态块中完成的功能:
1、读取外部的配置文件(读取properties)
2、把properties的内容 赋值 到 当前变量 例如 url = prop.getProperty(“url”);
3、加载驱动

/**
* @author bruceliu
* @time 2019年4月2日上午9:59:27
* @Description JDBC操作的工具类,有一个传统的名字:BaseDao.java , 有些程序喜欢取别的名字: JDBCUtils.java
* Base:基础的
* Dao:数据库访问层
*/
public class BaseDao {

private Connection conn=null; //连接对象
private PreparedStatement ps=null; //执行SQL对象
private ResultSet rs=null; //结果集

private static String driverClass;
private static String url;
private static String username;
private static String password;

static{
//静态代码块,性能高,只加载一次!
try {
Properties p=new Properties();
p.load(BaseDao.class.getClassLoader().getResourceAsStream("jdbc.properties"));
driverClass=p.getProperty("driverClass");
url= p.getProperty("url");
username= p.getProperty("username");
password= p.getProperty("password");
Class.forName(driverClass);
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* 01-打开数据库连接
*/
private void openConn(){
try {
conn=DriverManager.getConnection(url,username,password);
} catch (Exception e) {
e.printStackTrace();
}
}


/**
* 02-通用的执行增删改的方法
*
* String sql="update stars set name=?,age=?,birthday=?,sex=? where id=?";
* Object[] params={"张三",18,"2010-10-10","男",1};
*
* String sql="insert into stars values (null,?,?,?,?,?,?)";
* Object[] params={"张三",18,"2010-10-10","冬季热","男","34534531534543534543543"};
*
* String sql="delete from stars where id=?";
* Object[] params={2};
*/
public int myexecuteUpdate(String sql,Object[] params){
this.openConn();//打开数据库连接
try {
ps=conn.prepareStatement(sql);
//有参数
if(params!=null){
for (int i = 0; i < params.length; i++) {
ps.setObject(i+1, params[i]);
}
}
return ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally{
this.closConn();//关闭数据库
}
return 0;
}

/**
* 03-通用的执行查询的方法
*
* String sql="select * from stars where age>? and id<?";
* Object[] parms={18,5};
*
* @return
*/
public ResultSet myexecuteQuery(String sql,Object[] parms){
this.openConn();
try {
ps=conn.prepareStatement(sql);
if(parms!=null){
for (int i = 0; i < parms.length; i++) {
ps.setObject(i+1, parms[i]);
}
}
rs=ps.executeQuery();
} catch (Exception e) {
e.printStackTrace();
}finally{
//查询的此处不能提前关闭数据库。不然话结果集合没法遍历
}
return rs;
}


/**
* 03-关闭数据库
*/
protected void closConn(){
try {
if(rs!=null){
rs.close();
}
if(ps!=null){
ps.close();
}
if(conn!=null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}


}