commons-dbutils是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils成为很多不喜欢hibernate的公司的首选。
org.apache.commons.dbutils.QueryRunner --BDManager
org.apache.commons.dbutils.ResultSetHandler—处理结果集
org.apache.commons.dbutils.DbUtils、。
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。
该类简单化了SQL查询,它与ResultSetHandler组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量。
QueryRunner类提供了两个构造方法:
• 默认的构造方法
• 需要一个 javax.sql.DataSource 来作参数的构造方法。
public Object query(Connection conn, Stringsql, 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(Connectionconn, String sql, ResultSetHandler rsh) throws SQLException : 执行一个不需要置换参数的查询操作。
public int update(Connectionconn, String sql, Object[] params) throws SQLException:用来执行一个更新(插入、更新或删除)操作。
public int update(Connectionconn, String sql) throws SQLException:用来执行一个不需要置换参数的更新操作。
该接口用于处理 java.sql.ResultSet,将数据按要求转换为另一种形式。
ResultSetHandler接口提供了一个单独的方法:Objecthandle (java.sql.ResultSet .rs)。
ArrayHandler:把结果集中的第一行数据转成对象数组。
ArrayListHandler:把结果集中的每一行数据都转成一个数组,再存放到List中。
BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。
ColumnListHandler:将结果集中某一列的数据存放到List中。
KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里,再把这些map再存到一个map里,其key为指定的key。
MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List
一个使用C3p0获取数据源的工具类:
publicclass C3p0 {
//private static Connection con;
// ComboPooledDataSource cpds = newComboPooledDataSource("intergalactoApp");
privatestatic ComboPooledDataSource cpds;
/*static{
cpds = new ComboPooledDataSource("mysql");
}*/
// 或者
static{
cpds = new ComboPooledDataSource("mysql");
try {
cpds.setDriverClass("com.mysql.jdbc.Driver");
cpds.setJdbcUrl("jdbc:mysql://localhost:3306/user" );
cpds.setUser("root");
cpds.setPassword("root");
// cpds.setMaxStatements( 180 );
cpds.setMaxIdleTime(6000);
cpds.setMaxPoolSize(40);
cpds.setMinPoolSize(5);
cpds.setInitialPoolSize(10);
cpds.setMaxStatementsPerConnection(20);
} catch(PropertyVetoException e) {
e.printStackTrace();
}
}
publicstatic DataSource getDataSource(){
returncpds;
}
}
一个User实体类:
publicclass User {
privateintid;
private String username;
private String password;
publicint getId() {
returnid;
}
publicvoid setId(int id) {
this.id = id;
}
public String getUsername() {
returnusername;
}
publicvoid setUsername(Stringusername) {
this.username = username;
}
public String getPassword() {
returnpassword;
}
publicvoid setPassword(Stringpassword) {
this.password = password;
}
}
一个对各接口进行测试的类:
publicclass DButilOperation {
@Test
//执行增删改的操作
publicvoid insert(){
QueryRunner qr = new QueryRunner(C3p0.getDataSource());
String sql = "insertinto user (username,password)values(?,?)";
Object [] obj={"ccc","ddd"};
try {
qr.update(sql, obj);
} catch(Exception e) {
e.printStackTrace();
}
}
@Test
publicvoid delete(){
QueryRunner qr = new QueryRunner(C3p0.getDataSource());
String sql="deletefrom user where id=?";
Object [] obj = {3};
try {
qr.update(sql, obj);
} catch(Exception e) {
e.printStackTrace();
}
}
@Test
publicvoid update(){
QueryRunner qr = new QueryRunner(C3p0.getDataSource());
String sql = "updateuser set username =?,password=? where id=?";
Object [] obj ={"fffff","aaaaaaaaaaa",1};
try {
qr.update(sql, obj);
} catch(Exception e) {
e.printStackTrace();
}
}
@Test
// 返回一个实体对象
publicvoid select(){
QueryRunner qr = newQueryRunner(C3p0.getDataSource());
// 不管你查询到多少条记录他只把结果集中的第一条记录封装到一个实体Bean中。所以
// 这里你加不加查询条件都是一样的
// String sql = "select * fromuser";
String sql = "select * from user where id =?";
Object [] obj ={5};
try {
User user = qr.query(sql, obj,new BeanHandler(User.class));
System.out.println(user.getId());
System.out.println(user.getPassword());
System.out.println(user.getUsername());
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
// 返回一个List列表
publicvoid selectList(){
QueryRunner qr = new QueryRunner(C3p0.getDataSource());
String sql ="select * from user";
try {
List <User>list =(List<User>) qr.query(sql, newBeanListHandler(User.class));
for(User user:list){
System.out.println(user.getId());
System.out.println(user.getPassword());
System.out.println(user.getUsername());
}
} catch(Exception e) {
e.printStackTrace();
}
}
@Test
// 把结果集中的第一行数据转成对象数组。
publicvoid getArrayHandler(){
QueryRunner qr = new QueryRunner(C3p0.getDataSource());
// 这里你加不加查询条件都是一样的
// String sql = "select * fromuser";
Stringsql ="select * from user";
try {
Object [] obj = qr.query(sql, new ArrayHandler());
List <Object> list = Arrays.asList(obj);
System.out.println(list);
} catch(Exception e) {
e.printStackTrace();
}
}
@Test
// 把结果集中的每一行数据都转成一个数组,再存放到List中。
publicvoidgetArrayListHandler(){
QueryRunner qr = new QueryRunner(C3p0.getDataSource());
Stringsql ="select * from user";
try {
List<Object[]> list = qr.query(sql, new ArrayListHandler());
for(Object obj : list){
List <Object> lists = Arrays.asList(obj);
System.out.println(lists);
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
// 将结果集中某一列的数据存放到List中。
publicvoidgetColumnListHandler(){
QueryRunner qr = new QueryRunner(C3p0.getDataSource());
Stringsql ="select * from user";
try {
List<Object>list = qr.query(sql, new ColumnListHandler("username"));
for(Object obj :list){
List lists=Arrays.asList(obj);
System.out.println(lists);
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
//将结果集中的每一行数据都封装到一个Map里,
// 再把这些map再存到一个map里,其key为指定的key。
publicvoid getKeyedHanlders(){
QueryRunner qr = new QueryRunner(C3p0.getDataSource());
String sql = "select * from user ";
try {
Map<Object, Map<String,Object>> map = qr.query(sql, new KeyedHandler("password"));
for(Map.Entry<Object, Map<String,Object>>me:map.entrySet()){
Map<String, Object>mp = me.getValue();
for(Map.Entry<String,Object> maps:mp.entrySet()){
System.out.println(maps.getKey()+"--------"+maps.getValue());
}
}
} catch(Exception e) {
e.printStackTrace();
}
}
@Test
// 将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
publicvoid getMapHandler(){
QueryRunner qr = newQueryRunner(C3p0.getDataSource());
String sql = "select * from user ";
try {
Map<String, Object> map = qr.query(sql, new MapHandler());
for(Map.Entry<String,Object>me:map.entrySet()){
System.out.println(me.getKey()+"---------"+me.getValue());
}
} catch(Exception e) {
e.printStackTrace();
}
}
@Test
// 将结果集中的每一行数据都封装到一个Map里,然后再存放到List
publicvoid getMapListHandler(){
QueryRunner qr = newQueryRunner(C3p0.getDataSource());
String sql = "select * from user ";
try {
List<Map<String, Object>> list = qr.query(sql,new MapListHandler());
for(Map<String, Object> maps:list){
for(Map.Entry<String,Object>me:maps.entrySet()){
System.out.println(me.getKey()+"-------"+me.getValue());
}
}
} catch(Exception e) {
e.printStackTrace();
}
}
publicstaticvoid main(String[] args) {
DButilOperation dbo = new DButilOperation();
dbo.update();
System.out.println("-------------------------");
dbo.select();
System.out.println("-------------------------");
dbo.selectList();
System.out.println("-------------------------");
dbo.getArrayHandler();
System.out.println("-------------------------");
dbo.getArrayListHandler();
System.out.println("-------------------------");
dbo.getColumnListHandler();
System.out.println("-------------------------");
dbo.getKeyedHanlders();
System.out.println("-------------------------");
dbo.getMapHandler();
System.out.println("-------------------------");
dbo.getMapListHandler();
}
}
效果如图:
好了就到这里吧!