- 浏览: 414090 次
- 性别:
- 来自: 北京
最新评论
-
yadongliang:
this.class.getClassLoader().getResourceAsStream -
q316085319:
分享一篇android适配的好文章给你们,http://www ...
android 屏幕适配问题 -
wangyuheng:
一直不明白 多表操作的时候 应该怎么办 对应哪个domain ...
j2ee分层设计 -
humanchair:
"我比较喜欢搞清楚一个技术本身的发展历程,简而言之就 ...
Linux内存管理详解 -
Alex_SHT_JAVA:
写的还不错,简单易懂,3Q
android中CallBack的理解
dbutils开源项目用法:
项目地址:http://commons.apache.org/dbutils/
最新版本为 1.1
英文文档中这样写到:
DbUtils is a very small library of classes so it won't take long to go through the javadocs for each class.
The core classes/interfaces in DbUtils are QueryRunner and ResultSetHandler.
You don't need to know about any other DbUtils classes to benefit from using the library.
大概意思是: DbUtils 是一个非常小的类库 因此你不需要花费太长的时间去研究javadocs
它的核心接口是 QueryRunner 和 ResultSetHandler
你不需要关心其他DbUtils的类如何使用
-------------------------------------------------------------------------------------------------------------------------
QueryRunner
构造 QueryRunner :
QueryRunner()
QueryRunner(javax.sql.DataSource ds)
有两种方法来构造QueryRunner 一种是无参数的 一种是有DataSource类型参数的构造方法
这里使用DataSource 来构造它 使用连接池来构造它的好处就是 我们无需管Connection 对象的创建与关闭了
后面调用QueryRunner对象的方法也无需传入Connection对象了
那我们就要用到另外一个开源数据库连接池组件dbcp
以下为dbcp的用法:
/**
*
*
* dbcp连接池的用法
*/
public class DBUtils {
private static Properties properties;
private static DataSource dataSource;
private static Connection conn;
static {
try {
properties = new Properties();
//载入dbcp的配置文件
properties.load(DBUtils.class.
.getResourceAsStream("/dbcpconfig.properties"));
//创建个BasicDataSourceFactory对象用于创建连接池对象
BasicDataSourceFactory b = new BasicDataSourceFactory();
//把properties对象设置给BasicDataSourceFactory
dataSource = b.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
}
public static DataSource getdataSource() {
return dataSource;
}
}
注意:需要导入dbcp连接池的jar commons-dbcp-1.2.1.jar 和所依赖的 commons-pool-1.2.jar
commons-collections-3.1.jar
// 这样我们就可以构造个queryRunner对象了
QueryRunner queryRunner = new QueryRunner(DBUtils.getdataSource());
QueryRunner 主要方法 :
//更新一列
queryRunner.update("update Users set username=?,password=? where id = ?", new String[]{"11","22","1"});
//删除一列
queryRunner.update("delete from Users where id =?", 1);
--------------------------------------------------------------------------------------------------------------
如果要 使用 QueryRunner的查询方法 也就是query()方法的话 那么就需要有对象来接收查询出来的ResultSet
用什么来接收呢? 要用到 实现ResultSetHandler 接口的类
1. BeanHandler 返回个entitybean 对象
//指定返回哪个 entitybean
ResultSetHandler rsh = new BeanHandler(Users.class);
QueryRunner queryRunner = new QueryRunner(DBUtils.getdataSource());
Users users = (Users) queryRunner.query("select * from Users where id=?",2, rsh);
System.out.println(users.getUsername());
--------------------------------------------------------------------------------------------------------------
2. BeanListHandler 返回个List List里装的是entitybean 对象
QueryRunner queryRunner = new QueryRunner(DBUtils.getdataSource());
ResultSetHandler rsh = new BeanListHandler(Users.class);
List<Users> list = (List) queryRunner.query(
"select * from Users ", rsh);
for(Users user:list){
System.out.println(user.getUsername());
}
--------------------------------------------------------------------------------------------------------------
3. ArrayListHandler 返回List 对象 list里装的为Object数组
QueryRunner queryRunner = new QueryRunner(DBUtils.getdataSource());
// 使用ArrayListHandler 实现类来存放结果会返回ArrayList对象
ResultSetHandler rsh = new ArrayListHandler();
//list里装的是对象数组
List<Object[]> list = (List) queryRunner.query(
"select * from Users ", rsh);
for(Object[] user:list) {
for(Object obj:user)
{
System.out.println(obj);
}
}
-------------------------------------------------------------------------------------------------------------
4. ColumnListHandler 返回List 对象
注意: 构造 ColumnListHandler() 对象时候如果 是无参数的话
像这样 ResultSetHandler rsh = new ColumnListHandler();
查询出来的List 里放的类型为主键的类型 值为主键的值;
ResultSetHandler rsh = new ColumnListHandler();
List<Integer> list = (List) queryRunner.query(
"select * from Users ", rsh);
//System.out.println(list.get(0).getClass().getSimpleName());
for(Integer in:list){
System.out.println(in);
}
构造 ColumnListHandler() 对象时候如果 是有参数的话
像这样 ResultSetHandler rsh = new ColumnListHandler(主键值);
那么查询出来的List 里放的是就是这个主键对应的一行的记录;
ResultSetHandler rsh = new ColumnListHandler(2);
List<String> list = (List) queryRunner.query(
"select * from Users ", rsh);
for(String in:list){
System.out.println(in);
}
-------------------------------------------------------------------------------------------------------------
5. KeyedHandler 根据键返回Map
ResultSetHandler rsh = new KeyedHandler();
//map里装的key为主键的值 value 为主键对应的那行记录名称和记录
Map map = (Map) queryRunner.query(
"select id,username,password from Users ", rsh);
//根据主键值出去那一列
// Map t = (Map) map.get(2);
System.out.println(map.get(2));
---------------------------------------------------------------------------------------------------------------
6. MapHandler 根据键返回Map
QueryRunner queryRunner = new QueryRunner(DBUtils.getdataSource());
ResultSetHandler rsh = new MapHandler();
Map map = (Map) queryRunner.query(
"select * from Users ", rsh);
System.out.println(map);
---------------------------------------------------------------------------------------------------------------
7. ScalarHandler 根据键返回第一行记录
QueryRunner queryRunner = new QueryRunner(DBUtils.getdataSource());
// 这样就会返回第一行记录名字为username的值
ResultSetHandler rsh = new ScalarHandler("username");
//这的类型根据表里数据的类型而定 如果上面 ResultSetHandler rsh = new ScalarHandler("username");
//取出来的类型为int的话 那么这里也必须由int 来接收
String result = (String) queryRunner.query("select * from Users where id=99 ",
rsh);
System.out.println(result);
---------------------------------------------------------------------------------------------------------------
使用dbutils
需要 : commons-dbutils-1.2.jar
下载地址 : http://commons.apache.org/dbutils/download_dbutils.cgi
需要: c3p0-0.9.1.2.jar
----------------
@Test
public void testArrayHandler() throws Exception {
// 将结果集中的第一行封装到Object数组,使用ArrayHandler实现类
QueryRunner runner = new QueryRunner(C3p0Utils.getDataSource());
String sql = "select * from users where id=?";
Object[] arr = runner
.query(sql, new ArrayHandler(), new Object[] { 1 });
System.out.println(arr);
}
@Test
public void testArrayListHandler() throws Exception {
// 使用ArrayListHandler实现类, 把结果集存在List中,List中的每个元素都是
// 一个数组, 每个数组中存放表中每一行的所有字段
QueryRunner runner = new QueryRunner(C3p0Utils.getDataSource());
String sql = "select * from users";
List<?> list = (List<?>) runner.query(sql, new ArrayListHandler());
Object[] arr = (Object[]) list.get(1);
String username = (String) arr[1];
System.out.println(username);
}
@Test
public void testColumnListHandler() throws Exception {
// 使用ColumnListHandler, 获得所有行的username列的内存,
// 存放在List中
QueryRunner runner = new QueryRunner(C3p0Utils.getDataSource());
String sql = "select * from users";
List<?> list = (List<?>) runner.query(sql, new ColumnListHandler(
"username"));
System.out.println(list);
}
@Test
public void testKeyedHandler() throws Exception {
// KeyedHandler使用实现类
// 将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值
QueryRunner runner = new QueryRunner(C3p0Utils.getDataSource());
String sql = "select * from users";
Map<?, ?> map = (Map<?, ?>) runner.query(sql, new KeyedHandler("id"));
// System.out.println(map);
// 找 id 为 3 的 user 的username
Map<?, ?> map1 = (Map<?, ?>) map.get(4);
String username = (String) map1.get("username");
System.out.println(username);
}
@Test
public void testMapListHandler() throws Exception {
// 使用MapListHandler,查询出所有行, 存放在List中, List中的每个 元素是
// 一个 Map, 其中存在每一行的所有字段map.key是字段名, map.value是字段值
QueryRunner runner = new QueryRunner(C3p0Utils.getDataSource());
String sql = "select * from users";
List<?> list = (List<?>) runner.query(sql, new MapListHandler());
System.out.println(list);
}
---------下面使用自动封装到bean的功能--------
public List<?> getAll() {
// 使用BeanListHandler实现类
// 将查出的结果自动封装到bean列表中
try {
// 创建 QueryRunner 对象
QueryRunner runner = new QueryRunner(C3p0Utils.getDataSource());
// 写sql
String sql = "select * from users";
// 调用方法
List<User> list = runner.query(sql, new BeanListHandler<User>(
User.class));
return list;
} catch (SQLException e) {
throw new DaoException(e);
}
}
public User find(int id) {
try {
// 创建 QueryRunner 对象
QueryRunner runner = new QueryRunner(C3p0Utils.getDataSource());
// 写sql
String sql = "select * from users where id=?";
// 调用方法
User user = runner.query(sql, new BeanHandler<User>(User.class),
new Object[] { id });
return user;
} catch (SQLException e) {
throw new DaoException(e);
}
}
public boolean insert(User user) {
try {
QueryRunner runner = new QueryRunner(C3p0Utils.getDataSource());
String sql = "insert into users(username, password) values(?,?)";
int num = runner.update(sql, new Object[] { user.getUsername(),
user.getPassword() });
if (num > 0)
return true;
return false;
} catch (SQLException e) {
throw new DaoException(e);
}
}
public boolean update(User user) {
try {
QueryRunner runner = new QueryRunner(C3p0Utils.getDataSource());
String sql = "update users set username=?,password=? where id=?";
int num = runner.update(sql, new Object[] { user.getUsername(),
user.getPassword(), user.getId() });
if (num > 0)
return true;
return false;
} catch (SQLException e) {
throw new DaoException(e);
}
}
public boolean delete(int id) {
try {
QueryRunner runner = new QueryRunner(C3p0Utils.getDataSource());
String sql = "delete from users where id=?";
int num = runner.update(sql, id);
if (num > 0)
return true;
return false;
} catch (SQLException e) {
throw new DaoException(e);
}
}
---------C3p0Utils工具类---------
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class C3p0Utils {
private static DataSource ds ;
static {
ds = new ComboPooledDataSource();
}
public static DataSource getDataSource() {
return ds;
}
}
-----------user类--------
public class User {
private int id;
private String username;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", password="
+ password + "]";
}
}
----------------------------------
dbutils 不支持关联表,BeanHandler 它只管单个表到Bean的映射假如用BeanHandler,数据库里面表,同JavaBean直接的映射关系应该满足什么样的要求。如果,这个表,更其他的表关联,那么这个JavaBean又应该怎么写?
一直在寻找,没有找到满意的答案。
发表评论
-
HTTPURLCONNECTION传递中文乱码
2014-01-13 17:36 2648HttpURLConnection urlConn = ( ... -
java的System.getProperty()方法可以获取的值
2014-01-10 16:26 1059java.version Java ... -
java 序列化与反序化
2012-09-27 16:58 1519java 序列化与反序化 一.java序列化的用途 ... -
request.getParameter/setAttribute/getAttribute
2011-11-24 23:13 14711.getAttribute是取得jsp中 用setAttri ... -
j2ee分层设计
2014-01-10 16:26 1486一,Service->DAO,只能在Service中注入 ... -
二叉树变双向链表
2011-11-16 00:30 3780输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表 ... -
Arrays.asList的使用及异常问题
2011-11-16 00:24 16698将数组转成List问题,通常我们习惯这样写成:List&l ... -
List的add方法与addAll方法的区别
2011-11-15 22:00 134429add是将传入的参数作为当前List中的一个Item存储 ... -
JAVA的容器---List,Map,Set的区别
2011-11-15 21:52 1095Set 数据是不区分顺序的List 是分先后顺序的Map Ve ... -
java集合框架图及介绍
2011-11-15 21:49 1027转自:http://hi.baidu.com/%C9%AE_% ... -
myeclips使用经验总结
2011-11-15 21:35 25410. 快捷键 ===================== ... -
为什么加载数据库驱动只用Class.forName()
2011-11-13 22:41 3296终于明白为什么加载数据库驱动只用Class.forName() ... -
this.class.getClassLoader().getResourceAsStream
2011-11-13 22:29 35658this.getClass().getClassLoader( ... -
JAVA中properties文件和类
2011-11-13 21:29 987java中的properties文件是一种配置文件,主要用于表 ... -
静态变量、静态方法、静态代码块、非静态变量及非静态方法的简单介绍
2011-11-13 21:12 1960静态变量 静态变量是类 ...
相关推荐
它可以执行预编译的PreparedStatement,也可以直接使用Statement,同时处理结果集并自动关闭资源。 2. **ResultSetHandler**:这个接口用于处理查询结果。DBUtils提供了一些预定义的实现,如`ArrayHandler`、`...
DBUtils是apache下的一个小巧的JDBC轻量级封装的工具包,其最核心的特性是结果集的封装,可以直接将查询出来的结果集封装成JavaBean,这就为我们做了最枯燥乏味、最容易出错的一大部分工作。
2. **Apache Commons DBUtils**:DBUtils是一个简化JDBC使用的实用工具库,它在Java数据库连接(JDBC)之上提供了一层简单的封装。它可以帮助开发者处理常见的JDBC任务,比如执行SQL查询、更新,以及处理结果集。...
在JavaWeb项目中,模型通常由JavaBean(EJB)类构成,它们封装了数据并提供了对数据的操作方法。例如,一个用户管理模型可能包含User类,该类包含了用户的属性(如用户名、密码等)以及添加、删除、修改用户的方法。...
JavaBean是一种符合特定规范的Java类,通常用于封装数据和提供公共方法,便于在多个组件之间共享和重用。在JSP中,JavaBean可以作为Model层,存储和处理数据。 5. **EL(Expression Language)**: EL是一种简洁...
1.commons-beanutils.jar...12.commons-DbUtils.jar:Apache组织提供的一个资源JDBC工具类库,它是对JDBC的简单封装,对传统操作数据库的类进行二次封装,可以把结果集转化成List。 13.commons-Email.jar: 提供开源的API
DBUtils是Apache提供的一个开源工具包,它提供了对JDBC的进一步封装,使得数据库操作更加便捷且不易出错。`QueryRunner`是DBUtils的核心类,提供了`update`、`query`和`batch`方法,这些方法的使用比直接使用JDBC更...
通过使用 BeanUtils,可以轻松地将一个 JavaBean 转换为另一个 JavaBean,并且可以将一个 Map 对象转换为一个 JavaBean。 例如,下面是一个使用 BeanUtils 克隆对象的示例代码: ```java import org.apache.commons...
3. **dbutils**: Apache Commons DBUtils是一个简单易用的数据库操作库,它提供了对JDBC的简单封装,可以简化数据库操作,例如执行SQL语句、处理结果集等。 4. **dom4j**: 这是一个Java文档对象模型库,主要用于XML...
10. **commons-dbutils-1.3.jar**:Apache Commons DbUtils是简化数据库操作的库,它基于JDBC,提供了数据库查询、事务处理等基本功能的简单封装,降低了处理数据库时的复杂性。 以上这些jar包在JavaWeb开发中扮演...
Apache Commons工具集是一个开源的工具集,包含了许多实用的工具类,旨在解决平时编程中经常会遇到的问题,减少重复劳动。下面对Apache Commons工具集中的部分组件进行详细介绍: 1. BeanUtils:提供了对于JavaBean...
8.DbUtils:提供了对jdbc的操作封装,简化数据查询和记录读取操作。例如: ```java import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; QueryRunner runner = new Query...