前言
我经常喜欢把自己想要实现的功能在网络上搜索一下,看看有没有志同道合的朋友已经写好了,我就可以懒懒的拿过来直接用了!上个周末无意间去研究了下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毫秒.
希望此文能起到抛砖引玉的作用,转载请保留出处!