JDBC : 使用DBUtils 工具类

所需jar包 : commons-dbutils-1.6.jar

DbUtils类 

1.DbUtils :提供如关闭连接、装载JDBC驱动程序等常规工作的工具类,里面的所有方法都是静态的。主要方法如下:

-public static void close(…) throws java.sql.SQLException: DbUtils类提供了三个重载的关闭方法。这些方法检查所提供的参数是不是NULL,如果不是的话,它们就关闭Connection、Statement和ResultSet。

-public static void closeQuietly(…): 这一类方法不仅能在Connection、Statement和ResultSet为NULL情况下避免关闭,还能隐藏一些在程序中抛出的SQLEeception。

-public static void commitAndCloseQuietly(Connection conn): 用来提交连接,然后关闭连接,并且在关闭连接时不抛出SQL异常。

-public static boolean loadDriver(java.lang.String driverClassName):这一方装载并注册JDBC驱动程序,如果成功就返回true。使用该方法,你不需要捕捉这个异常ClassNotFoundException。

1.1QueryRunner类 

该类简单化了SQL查询,它与ResultSetHandler组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量。

QueryRunner类提供了两个构造方法:

-默认的构造方法

-需要一个 javax.sql.DataSource 来作参数的构造方法。

QueryRunner类的主要方法

public Object query(Connection conn, String sql, Object[] params, ResultSetHandler rsh) throws SQLException:执行一个查询操作,在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数。该方法会自行处理 PreparedStatement 和 ResultSet
的创建和关闭。

public Object query(String sql, Object[] params, ResultSetHandler rsh) throws SQLException: 几乎与第一种方法一样;唯一的不同在于它不将数据库连接提供给方法,并且它是从提供给构造方法的数据源(DataSource) 或使用的setDataSource 方法中重新获得 Connection。

public Object query(Connection conn, String sql, ResultSetHandler rsh) throws SQLException : 执行一个不需要置换参数的查询操作。

public int update(Connection conn, String sql, Object[] params) throws SQLException:用来执行一个更新(插入、更新或删除)操作。

public int update(Connection conn, String sql) throws SQLException:用来执行一个不需要置换参数的更新操作。

<span style="font-size:14px;">/**
	 * 测试 QueryRunner 的 Update 方法
	 * 该方法用于 INSERT , UPDATE , DELETE
	 */
	@Test
	public void testQueryRunnerUpdate() {
		//1.创建 QueryRunner 的实现类
		QueryRunner queryRunner = new QueryRunner();

		//String sql = "delete from temp where id in(?,?)";
		//String sql = "insert into temp(id,name,birth) values(?,?,?)";
		String sql = "update temp set name = ? where id = ?";
		//2.使用 update
		Connection conn = null;

		try {
			conn = JDBC_Tools.getConnection();
			queryRunner.update(conn,sql,"OK",1);
		} catch (Exception e) {
			JDBC_Tools.relaseSource(conn, null);
		}
	}</span>

1.2.ResultSetHandler接口 

该接口用于处理 java.sql.ResultSet,将数据按要求转换为另一种形式。

ResultSetHandler 接口提供了一个单独的方法:Object handle (java.sql.ResultSet .rs)。

<span style="font-size:14px;">class MyResultSetHandler implements ResultSetHandler<Object>{

		@Override
		public Object handle(ResultSet rs)
							throws SQLException {
//			System.out.println(" handler is OK!");
//			return "OVER";
			List<Person> persons = new ArrayList<Person>();
			while(rs.next()){
				Integer id = rs.getInt(1);
				String name = rs.getString(2);
				Date birth = rs.getDate(3);
				persons.add(new Person(id,name,birth));
			}
			return persons;
		}
	}
	/**
	 * 测试 QueryRunner 的 Query 方法的返回值取决于ResultSetHandler参数的
	 * handle 方法的返回值
	 */
	@Test
	public void testQueryRunnerQuery(){
		QueryRunner queryRunner = new QueryRunner();
		Connection conn = null;
		try {
			conn = JDBC_Tools.getConnection();

			String sql = "select * from temp ";
		@SuppressWarnings("unchecked")
		List<Object> ls = (List<Object>) queryRunner.query(conn, sql, new MyResultSetHandler());
		for(Object p : ls)
			System.out.println(p);
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			JDBC_Tools.relaseSource(conn, null);
		}

	}</span>

1.3 ResultSetHandler 接口的实现类

ArrayHandler:把结果集中的第一行数据转成对象数组。

ArrayListHandler:把结果集中的每一行数据都转成一个数组,再存放到List中。

BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。

BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。

ColumnListHandler:将结果集中某一列的数据存放到List中。

KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里,再把这些map再存到一个map里,其key为指定的key。

MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。

MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List

<span style="font-size:14px;">package xuezaipiao1;

import java.sql.Connection;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.junit.Test;
/**
 * 测试DbUtils 工具类
 * @author Kevy
 */
public class testDbUtils {

	/**
	 * ScalarHandler : 把结果集转为一个数值(可以是任意基本数据类型和字符串),
	 */
	@Test
	public void testScalarHandler(){
		Connection conn = null;
		QueryRunner queryRunner = new QueryRunner();
		try {
			conn = JDBC_Tools.getConnection();
			//String sql = "select name from temp where id = ?";
			String sql = "select count(id) from temp";
			Object s = queryRunner.query(conn, sql,
					new ScalarHandler<Person>());

			System.out.println(s);

		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}finally{
			JDBC_Tools.relaseSource(conn, null);
		}
	}
	/**
	 * MapListHandler : 将结果集转为一个  Map 的 List (不是绑定Javabean)
	 * 一个 Map 对应一条查询得到的记录 键:SQL 查询的列名(不是列的别名), 值:列的值
	 * MapListHandler :返回的是多条记录对应的Map 集合
	 */
	@Test
	public void testMapListHandler(){
		Connection conn = null;
		QueryRunner queryRunner = new QueryRunner();
		try {
			conn = JDBC_Tools.getConnection();
			String sql = "select * from temp";
			List<Map<String, Object>> ls = queryRunner.query(conn, sql,
					new MapListHandler());

			for(Map<String, Object> map : ls){
				for(Map.Entry<String , Object> m : map.entrySet()){
					System.out.print(m.getKey());
					System.out.println(":"+m.getValue());
				}
			}

		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}finally{
			JDBC_Tools.relaseSource(conn, null);
		}
	}

	/**
	 * MapHandler : 返回 SQL 对应的第一条记录对应的 Map对象
	 * 键:SQL 查询的列名(不是列的别名), 不是绑定Javabean
	 * 值:列的值
	 */
	@Test
	public void testMapHandler(){
		Connection conn = null;
		QueryRunner queryRunner = new QueryRunner();
		try {
			conn = JDBC_Tools.getConnection();
			String sql = "select id,name,birth from temp";
			Map<String, Object> map = queryRunner.query(conn, sql,
					new MapHandler());

			for(Map.Entry<String , Object> entry : map.entrySet()){
				System.out.print(entry.getKey()+":");
				System.out.println(entry.getValue());
			}

		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}finally{
			JDBC_Tools.relaseSource(conn, null);
		}
	}
	/**
	 * BeanListHandler : 把结果集转为List,该List不为null,但可能为空集合(size()==0)
	 * 若SQL语句能够查询到记录,List中存放创建BeanListHandler 传入的Class 参数对应的对象
	 * 绑定Javabean,要查询的列的别名 必须与 对应 java类的属性值相同
	 */
	@Test
	public void testBeanListHandler(){
		Connection conn = null;
		QueryRunner queryRunner = new QueryRunner();
		try {
			conn = JDBC_Tools.getConnection();
			String sql = "select * from temp";
			List<Person> ls = queryRunner.query(conn, sql,
					new BeanListHandler<Person>(Person.class));
			for(Person p : ls)
			System.out.println(p);
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}finally{
			JDBC_Tools.relaseSource(conn, null);
		}
	}

	/**
	 * BeanHandler 把结果集的第一条记录转为创建 BeanHandler 对象时传入的 Class 参数对应的对象
	 * 只返回一条,绑定Javabean,要查询的列的别名 必须与 对应 java类的属性值相同
	 * @param <T>
	 *
	 */
	@Test
	public <T> void testBeanHandler(){

		Connection conn = null;
		QueryRunner queryRunner = new QueryRunner();
		try {
			conn = JDBC_Tools.getConnection();
			String sql = "select * from temp where id = ?";
			//BeanHandler<T>
			Person p = queryRunner.query(conn, sql,
					new BeanHandler<Person>(Person.class), 1);
			System.out.println(p);

		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}finally{
			JDBC_Tools.relaseSource(conn, null);
		}
	}

	class MyResultSetHandler implements ResultSetHandler<Object>{

		@Override
		public Object handle(ResultSet rs)
							throws SQLException {
//			System.out.println(" handler is OK!");
//			return "OVER";
			List<Person> persons = new ArrayList<Person>();
			while(rs.next()){
				Integer id = rs.getInt(1);
				String name = rs.getString(2);
				Date birth = rs.getDate(3);
				persons.add(new Person(id,name,birth));
			}
			return persons;
		}
	}
	/**
	 * 测试 QueryRunner 的 Query 方法的返回值取决于ResultSetHandler参数的
	 * handle 方法的返回值
	 */
	@Test
	public void testQueryRunnerQuery(){
		QueryRunner queryRunner = new QueryRunner();
		Connection conn = null;
		try {
			conn = JDBC_Tools.getConnection();

			String sql = "select * from temp ";
		@SuppressWarnings("unchecked")
		List<Object> ls = (List<Object>) queryRunner.query(conn, sql, new MyResultSetHandler());
		for(Object p : ls)
			System.out.println(p);
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			JDBC_Tools.relaseSource(conn, null);
		}

	}
	/**
	 * 测试 QueryRunner 的 Update 方法
	 * 该方法用于 INSERT , UPDATE , DELETE
	 */
	@Test
	public void testQueryRunnerUpdate() {
		//1.创建 QueryRunner 的实现类
		QueryRunner queryRunner = new QueryRunner();

		//String sql = "delete from temp where id in(?,?)";
		//String sql = "insert into temp(id,name,birth) values(?,?,?)";
		String sql = "update temp set name = ? where id = ?";
		//2.使用 update
		Connection conn = null;

		try {
			conn = JDBC_Tools.getConnection();
			queryRunner.update(conn,sql,"OK",1);
		} catch (Exception e) {
			JDBC_Tools.relaseSource(conn, null);
		}
	}
}
</span>
时间: 2024-08-04 21:19:25

JDBC : 使用DBUtils 工具类的相关文章

数据库工具--DBUtils工具类的使用

1. DBUtils概述 DBUtils 是 JDBC的一个简化开发工具包.使用DBUtils需要导入的jar包:commons-dbutils-1.4.jar 核心类:QueryRunner 包 org.apache.commons.dbutils java.lang.Object  |--org.apache.commons.dbutils.AbstractQueryRunner     |--org.apache.commons.dbutils.QueryRunner 构造方法: Quer

DButils工具类可以用来获取数据库连接向数据库插入更新删除对象2

package com.ctl.util; import java.awt.Color; import java.awt.Font; import java.awt.Insets; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.*; import java.lang.reflect.*; import java.sql.*; import java.text.SimpleD

Java学习笔记49(DBUtils工具类二)

上一篇文章是我们自己模拟的DBUtils工具类,其实有开发好的工具类 这里使用commons-dbutils-1.6.jar 事务的简单介绍: 在数据库中应用事务处理案例:转账案例 张三和李四都有有自己的存款 主键 帐户名 余额 1 张三 1000 2 李四 10 要从张三的账户余额中转账800到李四账户 SQL语句实现: update xx set 余额 = 余额-800 where 主键=1 update xx set 余额 = 余额+800 where 主键=2 虽然操作成功,但是会出现问

Dbutils工具类的使用

一.什么是Dbutils? Commons DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能.来源百度百科 简而言之,Dbutils就是封装了jdbc的代码,简化了jdbc的dao层的操作. 二.Dbutils的使用 A:导入相关的依赖jar包 mysql-connector-java-5.1.7-bin.jar commons-dbutils-1.7.jar B:项目结构 StudentDao接口:对

java学习笔记之DBUtils工具类

DBUtils工具类 一.介绍 DBUtils是Apache组织开源的数据库工具类. 二.使用步骤 ①.创建QueryRunner对象 ②.调用update()方法或者query()方法执行sql语句 三.构造方法及静态方法 QueryRunner类 1.构造方法 ①.无参构造 QueryRunner qr =new  QueryRunner(); 使用无参构造的时候,调用update方法和query方法时就需要使用带Connection 类型参数的重载形式 ②.有参构造 QueryRunner

Java学习笔记48(DBUtils工具类一)

上一篇的例子可以明显看出,在增删改查的时候,很多的代码都是重复的, 那么,是否可以将增删改查封装成一个类,方便使用者 package demo; /* * 实现JDBC的工具类 * 定义方法,直接返回数据库的连接对象 * */ import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Stat

jdbc连接用工具类

封装的是链接部分和关流部分 mysql8.0.13 public class JDBCUtils { private JDBCUtils(){} private static Connection con; static{ try { Class.forName("com.mysql.jdbc.Driver"); //2获得连接 对象 String url ="jdbc:mysql://localhost:3306/rwx?useSSl=false&serverTim

JDBC连接Oracle工具类

import java.sql.*;import java.util.ResourceBundle; /** * jdbc工具类,负责: * 1. 加载/注册数据库驱动程序 * 2. 获取数据库连接 * 3. 释放数据库资源(Connection, Statement, ResultSet) */public class JdbcUtil { private static final String DRIVER = getValue("jdbc.driver"); private st

DButils工具类能够用来获取数据库连接向数据库插入更新删除对象2

package com.ctl.util; import java.awt.Color; import java.awt.Font; import java.awt.Insets; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.*; import java.lang.reflect.*; import java.sql.*; import java.text.SimpleD