您的位置:首页 > 其它

继hibernate后又一ORM框架commons-dbutils的JDBC第一次使用日记

2013-07-09 16:50 621 查看
前言

我经常喜欢把自己想要实现的功能在网络上搜索一下,看看有没有志同道合的朋友已经写好了,我就可以懒懒的拿过来直接用了!上个周末无意间去研究了下apache的开源项目,发现了commons-dbutils这个包,英文的介绍看着很累,立即百度了一下commons-dbutils这个关键词,结果是少量的信息,同样的内容!不过看完介绍我也是觉得如获至宝,赶紧下载下来试试,在调试过程中出现了不少错误,现将过程分享给大家,希望大家不要从蹈我的覆辙。

1.commons-dbutils最新版目前是commons-dbutils-1.5.jar

下载地址:http://commons.apache.org/proper/commons-dbutils

英文不好的我替你们愁,因为全是英文的页面。

2.commons-dbutils-1.5.jar需要依赖包

commons-dbcp-1.4.jar、commons-pool-1.4.jar

3.JDK环境1.6

4.Mysql数据库驱动一定要下载mysql-connector-java-5.0.6-bin.jar或以上版本,开始我用的mysqldriver.jar老是出现异常(功能未实现)

5.有了以上基础,就可以写个测试类来测试一下了

新建项目:dbutils-test

新建包:com.qisentech.demo.dbutils

新建类:DBTest.java

创建数据库的语句:

create database `test`;
create table `city` (
`id` int(11) not null auto_increment,
`name` varchar(50) character set utf8 default NULL,
primary key (`id`)
);
insert into `city` values (1,'六安');
insert into `city` values (2,'南京');
insert into `city` values (3,'苏州');
insert into `city` values (4,'上海');
insert into `city` values (5,'合肥');
insert into `city` values (6,'成都');


使用commons-dbutils最主要是要有数据源,所以首先我在类中封装了一个初始化数据燕的方法

/**
* 初始化数据源
*
* @return 数据源
*/
private static DataSource initDataSource() {
BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName("org.gjt.mm.mysql.Driver");
ds.setUsername("root");
ds.setPassword("123456");
ds.setUrl("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=UTF-8");
return ds;
}
大家看到了我用的驱动是[org.gjt.mm.mysql.Driver]

接下来,我们来写几个方法来看看如何使用DBUtils

增加数据:

public Object inert(String sql, Object param[]) throws SQLException {
DataSource dataSource = initDataSource();
QueryRunner queryRunner = new QueryRunner(dataSource);
return queryRunner.update(sql, param);
}

public static void main(String[] args) throws SQLException {
DBTest test = new DBTest();
Object result = test.inert("insert into City(Name)values(?)", new Object[]{"北京"});
System.out.println("result : " + result.toString());
}
执行结果:result : 1

代表1行受影响,即数据插入成功。

修改数据和插入是一样的,只需要把SQL语句改成update语句即可。

下面我们来看看如何查询并返回一个对象,前提是我们需要先建一个对象:

public class City {

private int id;
private String name;

public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
我们建了一个实体对象City

下面是查询对象方法:

public City query(String sql, Object[] param, Class clazz) throws SQLException {
DataSource dataSource = initDataSource();
QueryRunner queryRunner = new QueryRunner(dataSource);
City obj = (City) queryRunner.query(sql, new BeanHandler(clazz), param);
return obj;
}

public static void main(String[] args) throws SQLException {
DBTest test = new DBTest();
City city = test.query("select * from City where id = ?", new Object[]{1}, City.class);
System.out.println("result :city.name  = " + city.getName());
}


执行结果:result :city.name = 六安

是不是很简单!
那我们查询对象集合怎么办呢,不急,来看下面这段代码:

public List<City> queryList(String sql, Object[] param, Class clazz)
throws SQLException {
DataSource dataSource = initDataSource();
QueryRunner queryRunner = new QueryRunner(dataSource);
List<City> list = (List<City>) queryRunner
.query(sql, new BeanListHandler(clazz), param);
return list;
}

public static void main(String[] args) throws SQLException {
DBTest test = new DBTest();
List<City> list = test.queryList("select * from City where id < 3"
, null, City.class);
for (int i = 0; i < list.size(); i++) {
City city = list.get(i);
System.out.println("result[" + i + "] :city.name  = " + city.getName());
}
}


执行结果:

result[0] :city.name = 六安

result[1] :city.name = 南京

result[2] :city.name = 苏州

result[3] :city.name = 上海

result[4] :city.name = 合肥

result[5] :city.name = 成都

result[6] :city.name = 北京

好了,示例演示到这了,下面来讲一下主要原理和规则:
1.实体类City和数据库表City是通过City.class来映射绑定的,实体类名可以和数据表名称不一致。

2.实体类City中的属性要和City表的字段名和字段类型要一致。

3.实体City中的属性要生成标准的getter和setter方法。

具备了以上3个条件,执行query后,commons-dbutils会自动封装为List。

笔者也进行了对比实验,使用commons-dbutils封装对象,比自行getter和setter的效率高出20倍.传统方法查询后(185条记录)自行封装,需要370毫秒,而使用commons-dbutils,仅需要23毫秒.

希望此文能起到抛砖引玉的作用,转载请保留出处!

/article/7854676.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: