热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ApacheDBUtils使用总结【转】

ApacheDBUtils使用总结 DBUtils是个小巧的JDBC轻量级封装的工具包,其最核心的特性是结果集的封装,可以直接将查询出来的结果集封装成JavaBean,这就为我们做
Apache DBUtils使用总结
 
DBUtils是个小巧的JDBC轻量级封装的工具包,其最核心的特性是结果集的封装,可以直接将查询出来的结果集封装成JavaBean,这就为我们做了最枯燥乏味、最容易出错的一大部分工作。
 
在使用DBUtils之前,应该注意一些问题:
 
1、DBUtils是JDBC的简单封装,可以和JDBC混合使用。
 
2、DBUtils对结果集自动封装为JavaBean是有着苛刻要求的:必须满足JavaBean的规范,其次Bean的getter与setter方法的名字与结果集的列名一一对应,而不要求JavaBean的私有成员与表结果集列名一一对应。
比如:
person表中有个字段叫:address,那么对应的JavaBean的Person类中必须有getAddress和setAddress两个方法,而Person类中可以将address属性命名为add,这是没问题的。
 
3、DBUtils可以将结果集封装为各种类型,主要有:Bean/List,Map/List/Map,数组/List<数组>,列/List<列>,这些类型。
对于Map的类型使用KeyedHandler作为结果集处理器,内层的Map是“列名-值"对,外层的Map是“主键-内层Map的引用”,但此处的主键不一定就是数据库的主键,可以随意指定,比如:
ResultSetHandler h = new KeyedHandler("id");
Map found = (Map) queryRunner.query("select id, name, age from person", h);
Map jane = (Map) found.get(new Long(1)); // jane's id is 1
String janesName = (String) jane.get("name");
Integer janesAge = (Integer) jane.get("age");
 
4、DBUtils执行插入操作的时候,无法返回自增主键,这是一个很严重的问题,当然不能怪DBUtils,可以通过变通的方法来实现,比如在MySQL中,执行完了一个插入SQL后,接着执行SELECT LAST_INSERT_ID()语句,就可以获取到自增主键。
 
5、DBUtils的性能和JDBC性能是一样,测试过程中没发现性能损失,拥有了很高性能的同时,而不失JDBC的灵活性。
 
6、对于JavaBean的成员类型定义,有一条原则那就是:尽可能使用包装类型,而不要使用基本类型。很多人不理解为什么,包括我见到一些傻B(,我提出让改为包装类型,他还信誓旦旦的说他的代码多牛多叼),都干好多年了,这个简单的道理还不知道:
        //错误
        int a1 = (Integer) null;
        boolean x1 = (Boolean)null;
        //正确
        Integer a2 = (Integer) null;
        Boolean x2 = (Boolean)null;
 
实际上就是为了保证在查询结果为null的时候,也不会因为给基本类型赋null值而发生错误。
 
下面给出一个简单例子,作为以后写代码时候有点参考:
 
环境:
MySQL5.4
JDK1.5
 
建表SQL:
CREATE TABLE person (
     id bigint(20) NOT NULL AUTO_INCREMENT,
     name varchar(24) DEFAULT NULL,
     age int(11) DEFAULT NULL,
     address varchar(120) DEFAULT NULL,
     PRIMARY KEY (id)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=gbk
 
Java代码:
public class Person {
        private Long id;
        private String sdf;
        private String address2;
        private Integer age;

        public Person() {
        }

        public Person(String sdf) {
                this.sdf = sdf;
        }

        public Person(String sdf, Integer age, String address) {
                this.sdf = sdf;
                this.age = age;
                this.address2 = address;
        }

        public Long getId() {
                return id;
        }

        public void setId(Long id) {
                this.id = id;
        }

        public String getSdf() {
                return sdf;
        }

        public void setSdf(String sdf) {
                this.sdf = sdf;
        }

        public Integer getAge() {
                return age;
        }

        public void setAge(Integer age) {
                this.age = age;
        }

        public String getAddress() {
                return address2;
        }

        public void setAddress(String address2) {
                this.address2 = address2;
        }
}
 
测试
package com.lavasoft.dbstu;

import com.lavasoft.common.DBToolkit;
import org.apache.commons.dbutils.QueryRunner;
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.ScalarHandler;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

/**
* Created by IntelliJ IDEA.
*
* @author leizhimin 2010-1-25 21:00:29
*/

public class PersonDAOImpl implements PersonDAO {
        private static PersonDAOImpl instance = new PersonDAOImpl();

        public static PersonDAOImpl getInstance() {
                return instance;
        }

        public static void main(String[] args) {
                //错误
                int a1 = (Integer) null;
                boolean x1 = (Boolean) null;
                //正确
                Integer a2 = (Integer) null;
                Boolean x2 = (Boolean) null;

                getInstance().save(null);
//                getInstance().save(null);
//                getInstance().save(null);
//                getInstance().save(null);
//                getInstance().save(null);
                getInstance().update(null);
                getInstance().load(null);
                getInstance().load4Map(null);
        }

        @Override
        public Long save(String sql) {
                Long id = null;
                String ins_sql = "INSERT INTO person (NAME, age, address) VALUES ('aaa', 21, 'address001')";
                Connection cOnn= DBToolkit.getConnection();
                QueryRunner qr = new QueryRunner();
                try {
                        qr.update(conn, ins_sql);
                        //获取新增记录的自增主键
                        id = (Long) qr.query(conn, "SELECT LAST_INSERT_ID()", new ScalarHandler(1));
                } catch (SQLException e) {
                        e.printStackTrace();
                } finally {
                        DBToolkit.closeConnection(conn);
                }
                return id;
        }

        @Override
        public int delete(Long id) {
                int x = 0;
                Connection cOnn= DBToolkit.getConnection();
                QueryRunner qr = new QueryRunner();
                try {
                        x = qr.update(conn, "DELETE FROM person WHERE id = ?", id);
                } catch (SQLException e) {
                        e.printStackTrace();
                } finally {
                        DBToolkit.closeConnection(conn);
                }
                return x;
        }

        @Override
        public int update(Person person) {
                int x = 0;
                Connection cOnn= DBToolkit.getConnection();
                QueryRunner qr = new QueryRunner();
                try {
                        x = qr.update(conn, "UPDATE person SET NAME = ?, age = ?, address = ? WHERE id = ?", "xxx", 23, "ttt", 5);
                } catch (SQLException e) {
                        e.printStackTrace();
                } finally {
                        DBToolkit.closeConnection(conn);
                }
                return x;

        }

        @Override
        public Person load(Long id) {
                Connection cOnn= DBToolkit.getConnection();
                QueryRunner qr = new QueryRunner();
                try {
                        Person person = (Person) qr.query(conn, "SELECT * FROM person where id = ?", new BeanHandler(Person.class), 3L);
                        System.out.println(person.getId() + "\t" + person.getSdf() + "\t" + person.getAge() + "\t" + person.getAddress());
                } catch (SQLException e) {
                        e.printStackTrace();
                }
                return null;
        }

        @Override
        public List findPerson(String sql) {
                Connection cOnn= DBToolkit.getConnection();
                QueryRunner qr = new QueryRunner();
                try {
                        List pset = (List) qr.query(conn, "SELECT * FROM person", new BeanListHandler(Person.class));
                        for (Person person : pset) {
                                System.out.println(person.getId() + "\t" + person.getSdf() + "\t" + person.getAge() + "\t" + person.getAddress());
                        }
                } catch (SQLException e) {
                        e.printStackTrace();
                }
                return null;
        }

        public Person load4Map(Long id) {
                Connection cOnn= DBToolkit.getConnection();
                QueryRunner qr = new QueryRunner();
                try {
                        //先将两个字段置为null
                        qr.update(conn, "update person set age = null,address =null where id =1");
                        Map map = qr.query(conn, "SELECT * FROM person where id = ?", new MapHandler(), 1L);
                        Person person = new Person();
                        person.setId((Long) map.get("id"));
                        person.setSdf((String) map.get("name"));
                        person.setAge((Integer) map.get("age"));
                        person.setAddress((String) map.get("address"));
                        System.out.println(person.getId() + "\t" + person.getSdf() + "\t" + person.getAge() + "\t" + person.getAddress());
                } catch (SQLException e) {
                        e.printStackTrace();
                }
                return null;
        }
}
 
注意:
从上面的过程看,每个SQL的执行都需要用到QueryRunner,这其实是一个普通的类,非线程安全。在创建这个QueryRunner对象的时候,每次都要new。
 
QueryRunner对象的创建方式很多,可以通过DateSource,也可以通过Connection来创建。从QueryRunner对象上,可以直接获取到DataSource或者Connection对象。
 
 
Dbutil 的使用示例 
 
代码
package cn.lining.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ArrayHandler;
import org.apache.commons.dbutils.handlers.ArrayListHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ColumnListHandler;
import org.apache.commons.dbutils.handlers.KeyedHandler;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

publicclass test {
@SuppressWarnings(
"unchecked")
publicstaticvoid main(String[] args) throws ClassNotFoundException {

UserField userField
=new UserField();

Connection conn
=null;
String jdbcURL
="jdbc:mysql://localhost:3306/macaw4";
String jdbcDriver
="com.mysql.jdbc.Driver";
try {
DbUtils.loadDriver(jdbcDriver);
conn
= DriverManager.getConnection(jdbcURL, "root", "root");
conn.setAutoCommit(
false);//关闭自动提交
QueryRunner qRunner =new QueryRunner();

// 以下部分代码采用MapHandler存储方式查询
System.out.println("***Using MapHandler***");
Map map
= (Map) qRunner.query(conn,
"select * from mc_user_field where id = ?",
new MapHandler(), new Object[] { "5" });

System.out.println(
"id ------------- name ");
System.out.println(map.get(
"id") +" ------------- "
+ map.get("name"));

// 以下部分代码采用MapListHandler存储方式查询
System.out.println("***Using MapListHandler***");
List lMap
= (List) qRunner.query(conn,
"select * from mc_user_field", new MapListHandler());

System.out.println(
"id ------------- name ");
for (int i =0; i < lMap.size(); i++) {
Map vals
= (Map) lMap.get(i);
System.out.println(vals.get(
"id") +" ------------- "
+ vals.get("name"));
}

// 以下部分代码采用BeanHandler存储方式查询
System.out.println("***Using BeanHandler***");
userField
= (UserField) qRunner.query(conn,
"select * from mc_user_field where id = ?",
new BeanHandler(Class.forName("cn.lining.test.UserField")),
new Object[] { "5" });
System.out.println(
"id ------------- name ");
System.out.println(userField.getId()
+" ------------- "
+ userField.getName());

// 以下部分代码采用BeanListHandler存储方式查询
System.out.println("***Using BeanListHandler***");
List lBean
= (List) qRunner.query(conn,
"select * from mc_user_field", new BeanListHandler(Class
.forName(
"cn.lining.test.UserField")));
System.out.println(
"id ------------- name ");
for (int i =0; i < lBean.size(); i++) {
userField
= (UserField) lBean.get(i);
System.out.println(userField.getId()
+" ------------- "
+ userField.getName());
}

// 以下部分代码采用ArrayHandler存储方式查询
System.out.println("***Using ArrayHandler***");
Object[] array
= (Object[]) qRunner.query(conn,
"select * from mc_user_field where id = ?",
new ArrayHandler(), new Object[] { "5" });

System.out.println(
"id ------------- name ");
System.out.println(array[
0].toString() +" ------------- "
+ array[1].toString());

// 以下部分代码采用ArrayListHandler存储方式查询
System.out.println("***Using ArrayListHandler***");
List lArray
= (List) qRunner.query(conn,
"select * from mc_user_field", new ArrayListHandler());
System.out.println(
"id ------------- name ");
for (int i =0; i < lArray.size(); i++) {
Object[] var
= (Object[]) lArray.get(i);
System.out.println(var[
0].toString() +" ------------- "
+ var[1].toString());
}

// 以下部分代码采用ColumnListHandler存储方式查询指定列
System.out.println("***Using ColumnListHandler***");
List lName
= (List) qRunner.query(conn,
"select * from mc_user_field where id = ?",
new ColumnListHandler("name"), new Object[] { "5" });
System.out.println(
"name ");
for (int i =0; i < lName.size(); i++) {
String name
= (String) lName.get(i);
System.out.println(name);
}

// 以下部分代码采用ScalarHandler存储方式查询
System.out.println("***Using ScalarHandler***");
String name
= (String) qRunner.query(conn,
"select * from mc_user_field where id = ?",
new ScalarHandler("name"), new Object[] { "5" });

System.out.println(
"name ");
System.out.println(name);

// 以下部分代码采用KeyedHandler存储方式查询
System.out.println("***Using KeyedHandler***");
Map
<String, Map> map2 = (Map<String, Map>) qRunner.query(conn,
"select * from mc_user_field", new KeyedHandler("name"));

System.out.println(
"name: field_name2");
Map vals
= (Map) map2.get("field_name2");
System.out.println(vals.get(
"id") +""+ vals.get("name") +""
+ vals.get("type"));

// 以下部分代码插入一条数据
System.out.println("***Insert begin***");
userField
=new UserField();
qRunner.update(conn,
"insert into mc_user_field ("
+"id,name,type,sort_order,required,visible)"
+"values (?,?,?,?,?,?)", new Object[] { userField.getId(),
userField.getName(), userField.getType(),
userField.getSort_order(), userField.getRequired(),
userField.getVisible() });
System.out.println(
"***update end***");

// 以下部分代码更新一条数据
System.out.println("***update begin***");
userField
=new UserField();
qRunner.update(conn,
"update mc_user_field set "
+"name = ?,type = ?,sort_order = ?,"
+"required = ?,visible = ?"+"where id = ?",
new Object[] { userField.getName(), userField.getType(),
userField.getSort_order(), userField.getRequired(),
userField.getVisible(), userField.getId() });
System.out.println(
"***update end***");

// 以下部分代码删除一条数据
System.out.println("***delete begin***");
userField
=new UserField();
qRunner.update(conn,
"delete from mc_user_field where id2 = ?",
new Object[] { userField.getId() });
System.out.println(
"***delete end***");

}
catch (SQLException ex) {
ex.printStackTrace();
try {
System.out.println(
"***rollback begin***");
DbUtils.rollback(conn);
System.out.println(
"***rollback end***");
}
catch (SQLException e) {
e.printStackTrace();
}
}
finally {
DbUtils.closeQuietly(conn);
}

}
}
  • ArrayHandler:把结果集中的第一行数据转成对象数组。
  • ArrayListHandler:把结果集中的每一行数据都转成一个对象数组,再存放到List中。
  • BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
  • BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。
  • ColumnListHandler:将结果集中某一列的数据存放到List中。
  •  KeyedHandler:将结果集中的每一行数据都封装到一个Map里,然后再根据指定的key把每个Map再存放到一个Map里。
  •  MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
  •  MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List。
  •  ScalarHandler:将结果集中某一条记录的其中某一列的数据存成Object。

推荐阅读
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • Week04面向对象设计与继承学习总结及作业要求
    本文总结了Week04面向对象设计与继承的重要知识点,包括对象、类、封装性、静态属性、静态方法、重载、继承和多态等。同时,还介绍了私有构造函数在类外部无法被调用、static不能访问非静态属性以及该类实例可以共享类里的static属性等内容。此外,还提到了作业要求,包括讲述一个在网上商城购物或在班级博客进行学习的故事,并使用Markdown的加粗标记和语句块标记标注关键名词和动词。最后,还提到了参考资料中关于UML类图如何绘制的范例。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
author-avatar
詹姵慧3482
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有