Apache DbUtils查询初步实现


placeholder image
admin 发布于:2012-02-12 02:56:00
阅读:loading

花了几天时间,初步的了解了下Apache DbUtils,Apache公共的组件确实是多的很,这里主要说说DbUtils组件,它是马哇就不说了,有马哇优点也就不说了,组件集合详细看看下图吧。

image.png

,大晚上的,赶紧搞完了睡觉,只啰嗦一句,好的东西,也得需要好的眼力,识货才行。怎么安装DbUtils环境就不说了,这个相信大家都知道。

1、利用DbUtils实现多表数据查询,并将查询结果集转换为 List<Javabean>或者Javabean的形式。

先给出数据库表结果,一个Province省表,一个City市表,实现根据SQL语句的查询结果,自动与某javabean相转化。

image.png

image.png

 表关系比较简单,不再赘述了,接下来看看两个相对于的Javabean代码。

image.png

image.png

image.png

javabean说明:仔细看的话,会发现@Javabean注释,自己写的,没别的什么实现业务,只是起到一个标记的作用,类似于java.io.Serializable接口,实现他了表示你这个对象可以被序列化,这里的注释表示如果在javabean中某一个字段是关联的javabean对象,则需要标记一下,该注释的代码如下,习惯上喜欢说注解,但JDKapi文档中称为注释,那就暂且注释吧。

image.png

连接数据库的类就直接贴代码了,


/**

 * @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&lt;Map&gt;&lt;String,Object&gt;&gt;

  *

  * @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&lt;Javabean&gt;

  *

  * @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);

 }


}

现在一个一个的贴出,代码截图看上去格式清晰点。

image.png

image.png

image.png

image.png

image.png

image.png

最后贴上测试运行代码:

image.png

image.png

 测试的输出结果当然是有打印对象,有打印集合了,上例子中实现的全是对于查询的封装,将一条记录转换为数据,map,javabean,将多条数据,转换为List<Map>,List<T>,等,暂时未使用到其他的新增或者修改的方法实现,更主要的是,查询没有加上分页查询的情况,后续会持续更新这个的。这种实现也是有局限的,比如依赖数据库列名和javabean字段名称有依赖。其实搞清楚DbUtils是什么,能解决什么问题,就好了。


 点赞


 发表评论

当前回复:作者

 评论列表


留言区