Apache DbUtils查询初步实现
admin 发布于:2012-02-12 02:56:00
阅读:loading
花了几天时间,初步的了解了下Apache DbUtils,Apache公共的组件确实是多的很,这里主要说说DbUtils组件,它是马哇就不说了,有马哇优点也就不说了,组件集合详细看看下图吧。
,大晚上的,赶紧搞完了睡觉,只啰嗦一句,好的东西,也得需要好的眼力,识货才行。怎么安装DbUtils环境就不说了,这个相信大家都知道。
1、利用DbUtils实现多表数据查询,并将查询结果集转换为 List<Javabean>或者Javabean的形式。
先给出数据库表结果,一个Province省表,一个City市表,实现根据SQL语句的查询结果,自动与某javabean相转化。
表关系比较简单,不再赘述了,接下来看看两个相对于的Javabean代码。
javabean说明:仔细看的话,会发现@Javabean注释,自己写的,没别的什么实现业务,只是起到一个标记的作用,类似于java.io.Serializable接口,实现他了表示你这个对象可以被序列化,这里的注释表示如果在javabean中某一个字段是关联的javabean对象,则需要标记一下,该注释的代码如下,习惯上喜欢说注解,但JDKapi文档中称为注释,那就暂且注释吧。
连接数据库的类就直接贴代码了,
/**
* @author cdd
*/
public class DBManager {
static{
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 获取数据库连接
*/
public static Connection getConnection(){
Connection conn = null;
try {
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/Struts", "root", "root");
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
/**
* 关闭数据库连接
*/
public static void Close(Connection conn){
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 测试数据库连接是否成功
* @param args
*/
public static void main(String[] args) {
System.out.println(DBManager.getConnection());
}
}
接下来就是最主要的操作实现代码了,先给出可以可以复制的:
package com.base.db.utils;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.ArrayHandler;
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.MapListHandler;
import com.base.annotations.Javabean;
/**
* @author cdd
* DbUtils查询封装
*/
public class DbUtils {
private Connection connection = null;
private QueryRunner queryRunner = null;
public DbUtils(Connection connection) {
this.connection = connection;
queryRunner = new QueryRunner();
}
/**
* 将查询的一条数据转换成Array数组对象,如果查询语句返回的是多条Result对象,则返回结果集的第一条记录
*/
public Object[] queryByArray(String sql, Object... params)
throws SQLException {
return query(sql, new ArrayHandler(), params);
}
/**
* 将查询的一条数据转换成Map对象,如果查询语句返回的是多条Result对象,则返回结果集的第一条记录
*/
public Map<String, Object> queryByMap(String sql, Object... params)
throws SQLException {
return query(sql, new MapHandler(), params);
}
/**
* 将查询出来的N条结果集返回为List<Map><String,Object>>
*
* @param sql
* @param params
* @return
* @throws SQLException
*/
public List<Map<String, Object>> queryAllByMap(String sql, Object... params)
throws SQLException {
return query(sql, new MapListHandler(), params);
}
/**
* 将查询的一条记录转换成javabean对象,如果查询语句返回的是多条Result对象,则返回结果集的第一条记录
*/
public <T> T queryByJavabean(String sql, Class<T> javabean,
Object... params) throws SQLException {
return query(sql, new BeanHandler<T>(javabean), params);
}
/**
* 将查询的记录数转换成javabean对象
*/
public <T> List<T> querAllByJavabean(String sql, Class<T> javabean,
Object... params) throws SQLException {
return query(sql, new BeanListHandler<T>(javabean), params);
}
/**
* 将查询多表返回的map对象,转换为一个javabean
*/
public <T> T queryManyByJavabean(String sql, Class<T> javabean,
Object... params) throws SQLException {
return queryMap2Javabean(queryByMap(sql, params), javabean);
}
/**
* 将查询的数据列表转换为List<Javabean>
*
* @param <T>
* @param sql
* @param javabean
* @param params
* @return
* @throws SQLException
*/
public <T> List<T> queryAllManyByJavabean(String sql, Class<T> javabean,
Object... params) throws SQLException {
List<Map<String, Object>> mapList = queryAllByMap(sql, params);
List<T> list = null;
if (mapList != null && mapList.isEmpty() == false) {
list = new ArrayList<T>();
for (Map<String, Object> map : mapList) {
T t = queryMap2Javabean(map, javabean);
list.add(t);
}
}
return list;
}
/**
* 将map集合中数据与javabean中属性绑定
*
* @param <T>
* @param map
* @param javabean
* @return
*/
private <T> T queryMap2Javabean(Map<String, Object> map, Class<T> javabean) {
if (map != null && map.isEmpty() == false) {
try {
T newObject = javabean.newInstance();
Field fields[] = javabean.getDeclaredFields();
for (Field field : fields) {
if (field.getAnnotation(Javabean.class) != null) {
// 验证该字段是否为Javabean类型
Object newSon = field.getType().newInstance();
field.setAccessible(true);
field.set(newObject, newSon);
BeanUtils.populate(newSon, map);
}
}
BeanUtils.populate(newObject, map);
return newObject;
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
return null;
}
/**
* 对DbUtils组件查询核心方法封装
*/
private <T> T query(String sql, ResultSetHandler<T> rsh, Object... params)
throws SQLException {
return queryRunner.query(connection, sql, rsh, params);
}
}
现在一个一个的贴出,代码截图看上去格式清晰点。
最后贴上测试运行代码:
测试的输出结果当然是有打印对象,有打印集合了,上例子中实现的全是对于查询的封装,将一条记录转换为数据,map,javabean,将多条数据,转换为List<Map>,List<T>,等,暂时未使用到其他的新增或者修改的方法实现,更主要的是,查询没有加上分页查询的情况,后续会持续更新这个的。这种实现也是有局限的,比如依赖数据库列名和javabean字段名称有依赖。其实搞清楚DbUtils是什么,能解决什么问题,就好了。
点赞