DButils+dbcp数据源+spring增删改查学习实例

首先我们来看下DButils的简介:

Common Dbutils是操作数据库的组件,对传统操作数据库的类进行二次封装,可以把结果集转化成List。它是对JDBC的一个轻量级的封装,简化了很多重复的一些操作。

Dbutils的一些注意事项:

1、DBUtils是JDBC的简单封装,可以和JDBC混合使用。

2、DBUtils对结果集自动封装为JavaBean是有着苛刻要求的:必须满足JavaBean的规范,其次Bean的getter与setter方法的名字与结果集的列名一一对应,而不要求JavaBean的私有成员与表结果集列名一一对应。

比如:

person表中有个字段叫:address,那么对应的JavaBean的Person类中必须有getAddress和setAddress两个方法,而Person类中可以将address属性命名为add,这是没问题的。

3、DBUtils可以将结果集封装为各种类型,主要有:Bean/List<Bean>,Map/List<Map>/Map<Map>,数组/List<数组>,列/List<列>,这些类型。

对于Map<Map>的类型使用KeyedHandler作为结果集处理器,内层的Map是“列名-值"对,外层的Map是“主键-内层Map的引用”,但此处的主键不一定就是数据库的主键,可以随意指定

4、DBUtils执行插入操作的时候,无法返回自增主键,这是一个很严重的问题,当然不能怪DBUtils,可以通过变通的方法来实现,比如在MySQL中,执行完了一个插入SQL后,接着执行SELECT LAST_INSERT_ID()语句,就可以获取到自增主键。

5、DBUtils的性能和JDBC性能是一样,测试过程中没发现性能损失,拥有了很高性能的同时,而不失JDBC的灵活性。

下面散仙介绍一下,本次例子中使用的技术:

连接池:dbcp,也是common家族里面的包
bean注入和管理: 使用的是spring
轻量级的工具库:dbutils

数据源是在,spring的配置文件配置的:

 代码如下 复制代码

<bean id="local" class="org.apache.commons.dbcp.BasicDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> 
    <property name="url" value="jdbc:mysql://localhost:3306/person?characterEncoding=utf-8"></property> 
    <property name="username" value="root"></property> 
    <property name="password" value="qin"></property> 
    <property name="maxActive" value="10"/> 
        <property name="initialSize" value="5"/> 
    <property name="defaultReadOnly" value="false"/> 
</bean>

当然,上面的这个数据源,我们可以配置多个,也可配置不同的库,这样设计比较方便灵活,利于我们动态切换我们的库。

由于是java项目,并没有采用Web容器的方式启动,所以需要我们定义一个bean的加载器,来获取连接池,代码如下:

 代码如下 复制代码
package com.dhgate.dbutils.opera; 
 
import javax.sql.DataSource; 
 
import org.apache.commons.dbcp.BasicDataSource; 
import org.springframework.beans.factory.BeanFactory; 
import org.springframework.beans.factory.support.BeanDefinitionRegistry; 
import org.springframework.beans.factory.support.DefaultListableBeanFactory; 
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader; 
import org.springframework.core.io.ClassPathResource; 
 
/**
 * 
 * 加载Spring的xml的bean配置
 * */ 
public class XmlBeanLoad { 
     
     
    /**
     * 
     * 根据连接池的名
     * 得到一个连接池对象
     * 
     * @param datasourceName 数据源名字
     * @return 数据连接池对象
     * */ 
    public static BasicDataSource getDataSource(String datasourceName){ 
        BeanFactory bean=new DefaultListableBeanFactory(); 
        XmlBeanDefinitionReader reader=new XmlBeanDefinitionReader((BeanDefinitionRegistry)bean); 
        reader.loadBeanDefinitions(new ClassPathResource("datasource.xml")); 
        BasicDataSource data=(BasicDataSource) bean.getBean(datasourceName); 
        return data; 
    } 
     
     
     
     
    /***
     * 测试连接信息
     * 
     * **/ 
    public static void main(String[] args) throws Exception{ 
         
        BeanFactory bean=new DefaultListableBeanFactory(); 
        XmlBeanDefinitionReader reader=new XmlBeanDefinitionReader((BeanDefinitionRegistry)bean); 
        reader.loadBeanDefinitions(new ClassPathResource("datasource.xml")); 
//      BasicDataSource data=(BasicDataSource) bean.getBean("common2"); 
        BasicDataSource data=(BasicDataSource) bean.getBean("local"); 
        System.out.println(data.getConnection()); 
         
         
    } 
 
}

增删改查代码示例:

 代码如下 复制代码

package com.dhgate.dbutils.opera; 
 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.util.Arrays; 
import java.util.List; 
 
import javax.sql.DataSource; 
 
import org.apache.commons.dbutils.QueryRunner; 
import org.apache.commons.dbutils.ResultSetHandler; 
import org.apache.commons.dbutils.handlers.BeanHandler; 
import org.apache.commons.dbutils.handlers.BeanListHandler; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
 
import com.dhgate.m2b.entity.Student; 
/**
 * 
 * dbutils+datasource
 * 实现轻量级的增删改查
 * @author qindongliang
 * 
 *  * */ 
public class DataQuery<T> { 
 
    private static Logger logger = LoggerFactory.getLogger(DataQuery.class); 
     
     
    private Class clazz; 
    public DataQuery(Class clazz) { 
        this.clazz=clazz; 
    } 
     
    public DataQuery() { 
        // TODO Auto-generated constructor stub 
    } 
     
     
    public T query(String sql,Object[] params,String name)throws Exception{ 
        log(sql, params, name); 
        DataSource datasource=XmlBeanLoad.getDataSource(name); 
        System.out.println(datasource.getConnection().toString()); 
        QueryRunner runner=new QueryRunner(datasource); 
        System.out.println(runner); 
        return (T) runner.query(sql, new BeanHandler(clazz),params); 
    } 
     
    /**
     * 查询集合
     * @param sql 添加的sql语句
     * @param params 数据的参数
     * @param name 连接池的名字
     * */ 
    public List<T> queryList(String sql,Object[] params,String name)throws Exception{ 
        log(sql, params, name); 
        DataSource datasource=XmlBeanLoad.getDataSource(name); 
        QueryRunner runner=new QueryRunner(datasource); 
          
        return (List<T>) runner.query(sql, new BeanListHandler(clazz),params); 
    } 
     
    /**
     * 添加一条数据
     * @param sql 添加的sql语句
     * @param params 数据的参数
     * @param name 连接池的名字
     * */ 
    public void add(String sql,Object[] params,String name)throws Exception{ 
        log(sql, params, name); 
        DataSource datasource=XmlBeanLoad.getDataSource(name); 
        QueryRunner runner=new QueryRunner(datasource); 
        int i=runner.update(datasource.getConnection(),sql, params); 
        if(i>0){ 
            System.out.println("添加成功!"); 
        } 
    } 
     
    /**
     * 更新一条数据
     * @param sql 添加的sql语句
     * @param params 数据的参数
     * @param name 连接池的名字
     * */ 
    public void update(String sql,Object[] params,String name)throws Exception{ 
        log(sql, params, name); 
        DataSource datasource=XmlBeanLoad.getDataSource(name); 
        QueryRunner runner=new QueryRunner(datasource); 
        int i=runner.update(datasource.getConnection(),sql, params); 
        if(i>0){ 
            System.out.println("更新成功!"); 
        } 
    } 
     
    /**
     * 删除一条数据
     * @param sql 添加的sql语句
     * @param params 数据的参数
     * @param name 连接池的名字
     * */ 
    public void delete(String sql,Object[] params,String name)throws Exception{ 
        log(sql, params, name); 
        DataSource datasource=XmlBeanLoad.getDataSource(name); 
        QueryRunner runner=new QueryRunner(datasource); 
        int i=runner.update(datasource.getConnection(),sql, params); 
        if(i>0){ 
            System.out.println("删除成功!"); 
        } 
    } 
     
     
    /**
     * 统计某个表的count
     * @param sql sql语句
     * @param params 条件参数
     * @param name  数据源名字
     * @return 返回检索的数量
     * **/ 
    public int count(String sql,Object[] params,String name)throws Exception{ 
         
        log(sql, params, name); 
        DataSource datasource=XmlBeanLoad.getDataSource(name); 
        QueryRunner runner=new QueryRunner(datasource); 
         
        int count=runner.query(sql, new ResultSetHandler<Integer>() { 
            @Override 
            public Integer handle(ResultSet rs) throws SQLException { 
                if(rs.next()){ 
                    return rs.getInt(1); 
                } 
                return 0; 
            } 
        },params); 
         
        return count; 
    } 
     
     
     
     
 
     
    private void log(String sql,Object[] params,String name){ 
        logger.info("SQL语句:"+sql+" 检索参数: "+Arrays.toString(params)+" 连接池名字: "+name); 
    } 
     
     
     
    public static void main(String[] args)throws Exception { 
         
//    String sql="select * from person where name like ? "; 
      String datasourceName="local"; 
      DataQuery<Student> sq=new DataQuery<Student>(Student.class); 
      //添加测试 
      //sq.add("insert into person (name,sex) values(?,?)", new Object[]{"散仙","女"},datasourceName); 
      //更新测试 
      //sq.update("update person set name=? , sex=? where id = ? ", new Object[]{"三劫散仙","男",5}, datasourceName); 
      //删除测试 
      sq.delete("delete from person where id = ? ", new Object[]{1}, datasourceName); 
//     
  
      //单条查询测试 
//    Student st= sq.query(sql, new Object[]{"王晶"}, datasourceName); 
//    System.out.println(st);  
//   System.out.println("================================"); 
      //批量查询测试 
//    List<Student> queryList = sq.queryList(sql, new Object[]{"%天%"}, datasourceName); 
//    System.out.println("查询数量: "+queryList.size()); 
//    for(Student stt:queryList){ 
//        System.out.println(stt); 
//    } 
     //System.out.println(st); 
    //  testLimit(); 
         
    } 
     
    public static void testLimit()throws Exception{ 
          String sql="select * from person  order by id desc  limit ? , ?   "; 
          String datasourceName="local"; 
          DataQuery<Student> sq=new DataQuery<Student>(Student.class); 
          List<Student> queryList = sq.queryList(sql, new Object[]{2,3}, datasourceName); 
          System.out.println("查询数量: "+queryList.size()); 
          for(Student stt:queryList){ 
              System.out.println(stt); 
          } 
    } 
     
  
     
     
}

以上代码,就是简化了封装操作数据库增删改查的过程,当然我们也可以扩展它,使它成为一个轻量级的ORM框架,这样更方便操作,另外注意一点,如果注意数据库的编码问题,如果编码不一致,可能会导致,中文查询有问题,而且程序不会报异常,只是查询的结果为空或null,所以这一点需要格外注意,最好在连接数据库的配置里,加上指定的数据库编码,如散仙上面的xml的写法。

最后看一下DButils一些Handler的封装:

 代码如下 复制代码

ArrayHandler:把结果集中的第一行数据转成对象数组。 
ArrayListHandler:把结果集中的每一行数据都转成一个对象数组,再存放到List中。 
BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。 
BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。 
ColumnListHandler:将结果集中某一列的数据存放到List中。 
KeyedHandler:将结果集中的每一行数据都封装到一个Map里,然后再根据指定的key把每个Map再存放到一个Map里。 
MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。 
MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List。 
ScalarHandler:将结果集中某一条记录的其中某一列的数据存成Object。 

使用的主要jar包有:

commons-dbutils-1.6.jar dbutis的主要包 
mysql的驱动包 
spring的核心包 

时间: 2024-09-28 12:40:12

DButils+dbcp数据源+spring增删改查学习实例的相关文章

C#访问SQLServer增删改查代码实例_C#教程

一个专门实现访问sql server数据库增删改查的操作代码,分享给大家,具体内容如下 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Data; usi

PHP+MYSQL实现用户的增删改查_php实例

文件列表..文件内容.. dbconn.php userListt.php editUser.php editDo.php detailUser.php deleteUser.php addUser.php addDo.php <dbconn.php> <?php // 创建数据库连接 $con = mysql_connect("localhost",'root','') or die('error:'.mysql_error()); mysql_select_db(

thinkPHP数据库增删改查操作方法实例详解_php实例

本文实例讲述了thinkPHP数据库增删改查操作方法.分享给大家供大家参考,具体如下: thinkphp对数据库增删改查进行了封装操作,使得使用更加方便,但是不一定灵活. 可以用封装的用,需要写sql,可以执行sql. 1.原始的 $Model = new Model(); // 实例化一个model对象 没有对应任何数据表 $insert_sql = "INSERT INTO sh_wxuser_collection (user_id,store_id,good_id,addtime) VAL

【框架】[Hibernate]利用Hibernate进行单表的增删改查-Web实例

转载请注明出处:http://blog.csdn.net/qq_26525215 本文源自[大学之旅_谙忆的博客] 前面两篇博客已经将Hibernate的基础知识讲解得差不多了,差不多到写实例的时候了. 本篇只用hibernate进行单表的增删改查. 应用Hibernate,对students表进行增删改查. service层和DAO层,我都是直接写实现类了(因为这里主要是演示一下Hibernate的使用),如果是开发项目,注意一定要写接口! 准备数据库: 首先准备一个students表: cr

thinkPHP数据库增删改查操作方法实例详解

本文实例讲述了thinkPHP数据库增删改查操作方法.分享给大家供大家参考,具体如下: thinkphp对数据库增删改查进行了封装操作,使得使用更加方便,但是不一定灵活. 可以用封装的用,需要写sql,可以执行sql. 1.原始的 $Model = new Model(); // 实例化一个model对象 没有对应任何数据表 $insert_sql = "INSERT INTO sh_wxuser_collection (user_id,store_id,good_id,addtime) VAL

Laravel memcached缓存对文章增删改查进行优化例子

本节我们将以文章的增删改查作为实例系统讲述缓存的使用,这个实例是对之前创建RESTFul风格控制器实现文章增删改查这篇教程的改造和升级,我们将在其基础上融合进Eloquent ORM和模型事件,将应用的场景直接拉到生成环境. 1.准备工作 路由及控制器 路由的定义和控制器的创建保持和创建RESTFul风格控制器实现文章增删改查中一样. 创建数据表 关于文章对应数据表我们在数据库部分使用查询构建器实现对数据库的高级查询已有提及,这里我们使用之前创建的数据表即可. 创建文章模型 关于文章模型Post

Laravel使用memcached缓存对文章增删改查进行优化的方法

本文实例讲述了Laravel使用memcached缓存对文章增删改查进行优化的方法.分享给大家供大家参考,具体如下: 这里我们将以文章的增删改查作为实例系统讲述缓存的使用,这个实例是对之前创建RESTFul风格控制器实现文章增删改查这篇教程的改造和升级,我们将在其基础上融合进Eloquent ORM和模型事件,将应用的场景直接拉到生成环境. 1.准备工作 路由及控制器 路由的定义和控制器的创建保持和创建RESTFul风格控制器实现文章增删改查中一样. 创建数据表 关于文章对应数据表我们在数据库部

MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)

[正文] 这一周状态不太好,连续打了几天的点滴,所以博客中断了一个星期,现在继续. 我们在之前的几篇文章中学习了JDBC对数据库的增删改查.其实在实际开发中,一般都是使用第三方工具类,但是只有将之前的基础学习好了,在使用开源工具的时才能得心应手.如果对JDBC基础不太清楚,或者对本文看不太懂,建议先回顾一下本人之前的几篇和"MySQL数据库学习笔记"相关的文章.但是不管怎样,今后如果用到了数据库的增删改查,肯定是这篇文章中的代码用的最多. 一.DbUtils简介: DBUtils是ap

java web实现增删改查后,应该学习哪些高级技术?

问题描述 java web实现增删改查后,应该学习哪些高级技术? 做了个小项目,实现了curd,想继续往缓存,并发,负载高级深入,请推荐一个详细的高级技术路线?最好有书 解决方案 javaweb深入浅出,不过这个方向研究,主要还是在公司里学的会更实用些 解决方案二: 多线程,Socket,I/O JSP.EL.JSTL,AJAX JavaScript,jQuery JSON,XML EJB(可忽略) 各种框架 ......太多了 解决方案三: 多线程,Socket,I/O JSP.EL.JSTL