DbUtils工具的使用
概述
DbUtils是由Apache软件基金会提供的一个开源的Java应用程序连接数据库的工具,该工具是对JDBC协议的一种封装,因为是米国人开发的,所以在该工具中根本没有考虑到中文时候会乱码的问题,所以仍然要注意在连接数据库url中使用?useUnicode=true&characterEncoding=UTF-8去实现数据库对中文的支持。在整个工具中QueryRuner类是核心类,所有的增、删、改、查功能都能在该类中找到相应的方法去实现,在之前对JDBC的学习中我们知道,使用PreparedStatement接口会防止SQL注入,安全性高,但是在使用的过程中,会使用占位符?去代替实际的参数,然后使用set方法去设置相应占位符上的数据,那么我们想知道到底DbUtils是使用Statement接口还是使用PreparedStatement接口实现的呢?查看其源码发现其全部是使用PreparedStatement接口去是实现的,能实现这种通用的功能,说明其整个工具的可用性极高,那么既然是使用PreparedStatement接口去实现的,那么就会使用?占位符,怎么实现对占位符的参数传递呢?答案是在每个方法中几乎都有Object param或者Object… params参数,这种参数在文档中的定义为:查询替换参数。从字面上理解就是用来替换用的,这实际上就是所谓的占位符替换参数。
核心API
我们在使用DbUtils工具时基本都是在与QueryRunner类打交道,所以有必要对QueryRunner进行一个比较详细的介绍。
一个例子
/**
* commons_dbutils工具是Apache软件基金会的一个开源工具,该工具将数据库的相关增、删、改、查操作封装起来供开发者调用
* 开源说是提供了一个通用的操作数据库的接口,学会使用commons-dbutils工具在操作数据库会十分的方便,下面将从增、删、改、查的角度
* 介绍数据库的常见操作
* @author 朱君鹏
* 功能:使用Apache开源工具dbutils实现操作数据库的增、删、改、查功能,使用JUnit测试代码的可用性
* 为了使得自动生成的函数关联程序中的源码,首先应该将源码导入到工程中,导入的方法此处将不会详细的说明
* **/
package com.jpzhutech.commonsdbutils;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class TestDbUtils {
private Connection conn = null;
@Before
public void initConnection() throws SQLException, ClassNotFoundException
{
printCurrentMethodName();
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://192.168.101.44/amon?useUnicode=true&characterEncoding=UTF-8", "root", "560128");
System.out.println(conn);
}
@Before
public void initDatabase() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
runner.update(
conn,
"CREATE TABLE IF NOT EXISTS student(id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20))");
}
@After
public void destory()
{
printCurrentMethodName();
DbUtils.closeQuietly(conn);
}
/**
* 打印当前运行方法名称
*/
public void printCurrentMethodName()
{
System.out.println(Thread.currentThread().getStackTrace()[2]
.getMethodName());
System.out.println("==================================================");
}
@Test
public void testAdd() throws SQLException {
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
//String suffix = Long.toHexString(System.currentTimeMillis());
int result = runner.update(conn,"INSERT INTO student(id, NAME) values(?,? )", 200,"朱君鹏");
System.out.println("受影响记录条数:" + result);
}
}
在query方法中,最重要的是对结果集的处理,请自行查找资料解决,下面的资料也提供了使用实例。