DbUtils框架(这是一个耗时耗力的差事)

前言

为更加简单且高效地使用JDBC,Apache组织提供了数据库操作工具类commons-dbutils。该工具对JDBC进行了封装,可极大地简化JDBC的编码工作量。例如:DbUtils在查询数据时可把结果转换成List,Array,Set等集合,非常便于开发人员操作。

一、DbUtils三大核心体现

1、DbUtils工具类 该类主要用于关闭连接、装载JDBC驱动程序等等
2、ResultSetHandler接口 该接口及其实现类主要用于处理结果集
3、QueryRunner类 该类主要用于增,删,改,查
在这里插入图片描述

二、DbUtils工具类

由于这不是Java自带的工具类,查询比较麻烦,在这里我就仅仅列举最常用的吧,如下所示:

代码如下(DbUtils工具类第一个列举):

public static boolean loadDriver(java.lang.String driverClassName)

该方法用于方装载并注册JDBC驱动程序,如果成功就返回true。使用该方法,不需要捕捉ClassNotFoundException

代码如下(DbUtils工具类第二个列举):

public static void close(Connection conn,Statement stmt, ResultSet rs) throws java.sql.SQLException

该类方法用于关闭Connection、Statement和ResultSet

代码如下(DbUtils工具类第三个列举):

public static void closeQuietly(Connection conn,Statement stmt, ResultSet rs):

该类方法不仅能在Connection、Statement和ResultSet为NULL情况下避免关闭,还能隐藏一些在程序中抛出的SQLEeception

代码如下(DbUtils工具类第四个列举):

public static void commitAndCloseQuietly(Connection conn)

该方法用于提交事务并关闭连接,而且在关闭连接时不抛出SQL异常。

代码如下(DbUtils工具类第五个列举):

public static void rollbackAndCloseQuietly(Connection conn)

该方法用于回滚事务并关闭连接,而且在关闭连接时不抛出SQL异常。

三、ResultSetHandler接口实现类

1、BeanHandler 将结果集中的第一行数据封装到一个对应的JavaBean实例中
2、BeanListHandler 将结果集中的每一行数据都封装到一个对应的JavaBean实例中,再存放到List
3、ArrayHandler 把结果集中的第一行数据转成对象数组
4、ArrayListHandler 把结果集中的每一行数据都转成一个数组存放到List中
5、ColumnListHandler 将结果集中某一列的数据存放到List中/6、KeyedHandler(name) 将结果集中的每一行数据都封装到一个Map<列名,列值>里,再把这些map再存到一个map里,其key为指定的key。
6、MapHandler 将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值
7、MapListHandler 将结果集中的每一行数据都封装到一个Map里,然后再存放到List
8、ScalarHandler 将结果集中某一条记录的其中某一列的数据存储成Object对象

四、QueryRunner类

1.QueryRunner常用的构造函数

QueryRunner() 采用该方法创建QueryRunner时数据库的事务可由我们自己手动控制。正因为该构造方法无参,所以在调用该对象的query、update、等方法时需要传入参数Connection。
QueryRunner(DataSource ds) 采用该方法创建QueryRunner时数据库的事务由DBUtils自动控制。正因为该构造方法传入了参数DataSource,所以在调用该对象的query、update、等方法时无需传入参数Connection。

2.QueryRunner的常用方法

public Object query(Connection conn, String sql, Object[] params, ResultSetHandler rsh)

该方法用于执行查询,在该查询中Object数组里的每个值被用来作为查询语句的置换参数。该方法会自行处理PreparedStatement和ResultSet的创建和关闭。

public Object query(String sql, Object[] params, ResultSetHandler rsh)

不用传入参数Connection

public Object query(Connection conn, String sql, ResultSetHandler rsh)

该方法与上面的两个方法基本一样,它用于执行一个不需要置换参数的查询操作。

public int update(Connection conn, String sql, Object[] params)

该方法用于执行更新操作(例如:增加、删除、更新),在该查询中Object数组里的每个元素值被用来作为更新语句的置换参数。

五、使用实例

1 添加jar包

c3p0-0.9.1.2.jar
commons-dbutils-1.4.jar
mysql-connector-java-5.0.8-bin.jar

导包位置如下:
在这里插入图片描述

2 在src下创建c3p0的配置文件c3p0-config.xml

如下图所示c3p0-config.xml配置的级别与src同级,文件名建议直接复制
在这里插入图片描述

c3p0-config.xml里面的内容如下(只需要修改当前使用的数据库及数据库的use和password)

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
  <default-config>
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/你当前使用的数据库名</property>
    <property name="user">使用者名字</property>
    <property name="password">密码</property>
    <property name="initialPoolSize">15</property>
    <property name="maxIdleTime">40</property>
    <property name="maxPoolSize">150</property>
    <property name="minPoolSize">20</property>
  </default-config>
</c3p0-config>

3 DbUtils简易封装

代码如下(DbUtils工具类):

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;

public class DBUtils {

    //创建数据库连接池
	private static DataSource dataSource = new ComboPooledDataSource();

    //获取数据库连接池
      public static DataSource getDataSource() {
          return dataSource;
      }

    //创建连接
    public static Connection getConnection(){
        try {
            return dataSource.getConnection();
        } catch (SQLException e) {
            throw new RuntimeException("获取数据库连接失败");
        }
    }

    //释放连接
    public static void releaseConnection(Connection connection, Statement statement, ResultSet resultSet) {
        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            resultSet = null;
        }
        if (statement != null) {
            try {
                statement.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            statement = null;
        }
        if (connection != null) {
            try {
                connection.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            connection = null;
        }
    }
}

4 在数据库中建立会员卡表并插入数据

代码如下(建立会员卡表的MySQL命令):

-- 若存在数据库mydb则删除
DROP DATABASE IF EXISTS mydb;
-- 创建数据库mydb
CREATE DATABASE mydb;
-- 选择数据库mydb
USE mydb;

-- 创建表
CREATE TABLE membershipcard (
    id int primary key auto_increment, 
    username varchar(40),
    password varchar(40), 
    email varchar(40), 
    birthday date 
);

-- 插入数据
INSERT INTO membershipcard (username,password,email,birthday) VALUES ("lili","abc123","lili@sina.com","1999-08-14");
INSERT INTO membershipcard (username,password,email,birthday) VALUES ("koko","efg456","koko@sohu.com","1998-07-15");
INSERT INTO membershipcard (username,password,email,birthday) VALUES ("mbmb","mnb333","mbmb@sina.com","1997-06-16");
INSERT INTO membershipcard (username,password,email,birthday) VALUES ("zxzx","poi666","zxzx@sohu.com","1996-05-17");

5 创建一个MembershipCard类(里面的元素与数据库中的会员卡表字段信息类型相同)

代码如下(MembershipCard类):

import java.util.Date;

public class MembershipCard {
    private int id;
    private String username;
    private String password;
    private String email;
    private Date birthday;
    public MembershipCard() {

    }
    public MembershipCard(int id, String username, String password, String email, Date birthday) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.email = email;
        this.birthday = birthday;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    @Override
    public String toString() {
        return "MembershipCard [id=" + id + ", username=" + username + ", password=" + password + ", email=" + email
                + ", birthday=" + birthday + "]";
    }

}

6 利用DbUtils实现增删改查

代码如下(DbUtils实现增删改查测试):

import java.sql.Date;
import java.sql.SQLException;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;

public class Test01 {

	public static void main(String[] args) {
		Test01 test01 = new Test01();
		test01.testSelect();
		// test01.testSelectAll();
		// test01.testUpdate();
		// test01.testDelete();
		// test01.testInsert();

	}
	// 插入数据
	public void testInsert() {
		QueryRunner qr = new QueryRunner(DBUtils.getDataSource());
		Date birthday = Date.valueOf("1997-07-01");
		String sql = "insert into membershipcard(username,password,email,birthday) values(?,?,?,?)";
		Object params[] = { "zsa", "007", "077@sina.com", birthday };
		try {
			qr.update(sql, params);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("suc");
	}
	// 删除数据
	public void testDelete() {
		QueryRunner qr = new QueryRunner(DBUtils.getDataSource());
		String sql = "delete from membershipcard where username=?";
		Object[] param = {"zsa"};
		try {
			qr.update(sql, param);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	// 更新数据
	public void testUpdate() {
		QueryRunner qr = new QueryRunner(DBUtils.getDataSource());
		String sql = "update membershipcard set password=? where username=?";
		Object[] param = {"12546","zxzx"};
		try {
			qr.update(sql, param);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	// 查询所有数据
	public void testSelectAll() {
		QueryRunner qr = new QueryRunner(DBUtils.getDataSource());
		String sql = "select * from membershipcard";
		BeanListHandler<MembershipCard> beanListHandler = new BeanListHandler<>(MembershipCard.class);
		try {
			List<MembershipCard> list = qr.query(sql,beanListHandler);
			for(MembershipCard membershipCard:list) {
				System.out.println(membershipCard);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
	// 查询单条数据
	public void testSelect(){
		QueryRunner qr = new QueryRunner(DBUtils.getDataSource());
		String sql = "select * from membershipcard where username=?";
		Object[] param = {"zxzx"};
		BeanHandler<MembershipCard> beanHandler = new BeanHandler<>(MembershipCard.class);
		try {
			MembershipCard query = qr.query(sql,beanHandler , param);
			System.out.println(query);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

查询单条数据测试输出:
在这里插入图片描述
查询所有数据测试输出:
在这里插入图片描述
添加一条数据测试输出:
在这里插入图片描述
看看数据表中是否真的插入了数据
在这里插入图片描述
更新一条数据测试输出:
在这里插入图片描述
看看数据表中是否真的更新了数据
在这里插入图片描述
删除一条数据测试输出:
在这里插入图片描述
看看数据表中是否真的删除了数据
在这里插入图片描述

总结

在该示例中利用DbUtils实现了增删改查操作。其中,我们可利用BeanHandler将查询到的一条数据转换成与其对应的JavaBean;类似地,我们可利用BeanListHandler将查询到的多条数据转换为JavaBean再存放至List集合。
注意
当有数据需要插入数据表示,导的包应该是java.sql这种格式的

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值