JavaWeb基础—dbutils的简单入门

进行此章节之前,介绍一个JdbcUtils的再次的简单封装

  (例如后面需要构造QueryRunner时得到数据源等的简便的操作)

package cn.itcast.jdbcutils;

import java.sql.Connection;
import java.sql.SQLException;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class JdbcUtils {
    //使用的是默认的配置信息,注意给出c3p0-config.xml配置文件
    private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
    //处理多线程的并发访问问题,使用ThreadLocal
    private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
    public static Connection getConnection() throws SQLException{
        //不为Null说明开启了事务,返回连接
        //先获取自己线程的Connection
        Connection con = tl.get();
        if(con != null) return con;
        return dataSource.getConnection();
    }
    /**
     * 大方一点,给出连接池对象给你
     */
    public static ComboPooledDataSource getDataSource(){
        return dataSource;
    }
    //给出三个方法
    /**
     * 开启事务
     * 创建一个Connection,设置为手动提交
     * 保证DAO使用的就是这个事务的连接
     * 同时还需要保证下面两个提交与回滚是同一个连接
     * 通过创建一个本类的连接成员
     * @throws SQLException
     */
    public static void startTransaction() throws SQLException{
        Connection con = tl.get();
        //开启事务后con不再为null
        con = getConnection();
        con.setAutoCommit(false);
        //保存连接
        tl.set(con);
    }
    /**
     * 提交事务
     * @throws SQLException
     */
    public static void commitTransaction() throws SQLException{
        Connection con = tl.get();
        if(con == null) throw new SQLException("事务未开启,请勿提交!");
        con.commit();
        con.close();
        //清空连接
        con = null;
        //移除事务
        tl.remove();
    }
    /**
     * 回滚事务
     * @throws SQLException
     */
    public static void rollbackTransaction() throws SQLException {
        Connection con = tl.get();
        if(con == null) throw new SQLException("事务未开启,请勿回滚!");
        con.rollback();
        con.close();
        con = null;
        tl.remove();
    }
    /**
     * 用于释放连接
     * @param connection
     * @throws SQLException
     */
    public static void releaseConnection(Connection connection) throws SQLException{
        //事务专用则不关闭,后续会有关闭
        //如果不是事务,则需要关闭
        Connection con = tl.get();
        //事务都没有,直接关闭
        if(con == null) connection.close();
        //有事务,判断是否相等,是否为专用连接
        if(con != connection) connection.close();

    }
}

一、简易的入门:

    common-dbutils是Apache对Jdbc的一个简单的封装,其中主要涉及的类有:

      QueryRunner

      ResultSetHandler

      DbUtils

    使用的依赖如下:

    

  1.

  重要类 QueryRunner (构造时提供数据源)
  重要方法:int update(String sql,Object...params);增删改
  重载版本 int update(Connection con,String sql,Object...params);本方法不再管理con,由外部提供(保证是同一个)
  T query(String sql,ResultSetHandler rsh,Object...params);查询
  重载版本类同上

  给出一个使用的小例子:

  

package cn.itcast.demo;

import java.sql.SQLException;

import org.apache.commons.dbutils.QueryRunner;
import org.junit.Test;

import cn.itcast.jdbcutils.JdbcUtils;

/**
 * 测试commons-dbutils
 * @author jiangbei01
 *
 */
public class Demo02 {
    @Test
    public void testfun1() throws SQLException{
        QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
        String sql = "INSERT INTO ab VALUES(?,?)";
        Object[] params = {8,"肖恩"};
        qr.update(sql, params);
    }
}

  2.

  给一张表对应一个类,字段与属性对应起来

  他会先得到ResultSet,然后调用handler方法转换成需要的类型
  接口ResultSetHandler,我们学习的实现类:
  BeanHandler 构造器需要一个class参数,返回指定类型的javabean对象  一行记录
  BeanListHandler 构造器同上,由名称知为多行,转换成list对象,多个javabean  多行记录
  MapHandler 把一行记录转换成一个map (如{name:zhangsan,age:20})  一行记录
  MapListHandler 同上对比,多个map的多行记录,返回List<Map>,返回的也是一个List  多行记录
  ScalarHandler 单行单列,通常与select count(*) from stu; 单行单列

  这里使用装饰者模式加上开头改造的工具类,将QueryRunner稍加改造

  

package cn.itcast.jdbcutils;

import java.sql.Connection;
import java.sql.SQLException;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
/**
 * 这个类可以自身自己处理连接问题,可以通过jdbcUtils释放连接(类方法会处理是否关闭)
 * @author jiangbei01
 *
 */
public class TxQueryRunner extends QueryRunner {

    @Override
    public int[] batch(String sql, Object[][] params) throws SQLException {
        /*
         * 得到连接
         * 执行父类方法
         * 释放连接
         * 返回值
         */
        Connection con = JdbcUtils.getConnection();
        int[] results = super.batch(con,sql, params);
        JdbcUtils.releaseConnection(con);
        return results;
    }

    @Override
    public <T> T query(String sql, Object param, ResultSetHandler<T> rsh) throws SQLException {
        /*
         * 得到连接
         * 执行父类方法
         * 释放连接
         * 返回值
         */
        Connection con = JdbcUtils.getConnection();
        T results = super.query(con,sql, param,rsh);
        JdbcUtils.releaseConnection(con);
        return results;
    }

    @Override
    public <T> T query(String sql, Object[] params, ResultSetHandler<T> rsh) throws SQLException {
        Connection con = JdbcUtils.getConnection();
        T results = super.query(con,sql, params,rsh);
        JdbcUtils.releaseConnection(con);
        return results;
    }

    @Override
    public <T> T query(String sql, ResultSetHandler<T> rsh, Object... params) throws SQLException {
        Connection con = JdbcUtils.getConnection();
        T results = super.query(con,sql, rsh,params);
        JdbcUtils.releaseConnection(con);
        return results;
    }

    @Override
    public <T> T query(String sql, ResultSetHandler<T> rsh) throws SQLException {
        Connection con = JdbcUtils.getConnection();
        T results = super.query(con,sql, rsh);
        JdbcUtils.releaseConnection(con);
        return results;
    }

    @Override
    public int update(String sql, Object... params) throws SQLException {
        Connection con = JdbcUtils.getConnection();
        int results = super.update(con,sql,params);
        JdbcUtils.releaseConnection(con);
        return results;
    }

    @Override
    public int update(String sql, Object param) throws SQLException {
        Connection con = JdbcUtils.getConnection();
        int results = super.update(con,sql,param);
        JdbcUtils.releaseConnection(con);
        return results;
    }

    @Override
    public int update(String sql) throws SQLException {
        Connection con = JdbcUtils.getConnection();
        int results = super.update(con,sql);
        JdbcUtils.releaseConnection(con);
        return results;
    }

}

给出一个使用改造类的小例子:

package cn.itcast.jdbcutils;

import java.sql.Connection;
import java.sql.SQLException;

import org.apache.commons.dbutils.QueryRunner;

public class AccountDAO {
    /**
     * 不能使用连接池
     * 要自己提供连接才能保证是同一个连接
     * @param name
     * @param money
     * @throws SQLException
     */
    public static void update(String name, double money) throws SQLException{
        QueryRunner qr = new TxQueryRunner();
        String sql = "update account set balaence=balaence+? where name=?";
        Object[] params = {money,name};
        //给出参数并执行

        qr.update(sql,params);
        /*
         * 以下代码新写的Tx类已经完成,无需处理
         * Connection con = JdbcUtils.getConnection();
         *     //释放连接
        JdbcUtils.releaseConnection(con);

         */

    }
}

  并发访问时产生的问题,可以使用ThreadLocal类(待更新详细)进行解决,示例如下:

package cn.itcast.jdbcutils;

import java.sql.Connection;
import java.sql.SQLException;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class JdbcUtils {
    //使用的是默认的配置信息,注意给出c3p0-config.xml配置文件
    private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
    //处理多线程的并发访问问题,使用ThreadLocal
    private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
    public static Connection getConnection() throws SQLException{
        //不为Null说明开启了事务,返回连接
        //先获取自己线程的Connection
        Connection con = tl.get();
        if(con != null) return con;
        return dataSource.getConnection();
    }
    /**
     * 大方一点,给出连接池对象给你
     */
    public static ComboPooledDataSource getDataSource(){
        return dataSource;
    }
    //给出三个方法
    /**
     * 开启事务
     * 创建一个Connection,设置为手动提交
     * 保证DAO使用的就是这个事务的连接
     * 同时还需要保证下面两个提交与回滚是同一个连接
     * 通过创建一个本类的连接成员
     * @throws SQLException
     */
    public static void startTransaction() throws SQLException{
        Connection con = tl.get();
        //开启事务后con不再为null
        con = getConnection();
        con.setAutoCommit(false);
        //保存连接
        tl.set(con);
    }
    /**
     * 提交事务
     * @throws SQLException
     */
    public static void commitTransaction() throws SQLException{
        Connection con = tl.get();
        if(con == null) throw new SQLException("事务未开启,请勿提交!");
        con.commit();
        con.close();
        //清空连接
        con = null;
        //移除事务
        tl.remove();
    }
    /**
     * 回滚事务
     * @throws SQLException
     */
    public static void rollbackTransaction() throws SQLException {
        Connection con = tl.get();
        if(con == null) throw new SQLException("事务未开启,请勿回滚!");
        con.rollback();
        con.close();
        con = null;
        tl.remove();
    }
    /**
     * 用于释放连接
     * @param connection
     * @throws SQLException
     */
    public static void releaseConnection(Connection connection) throws SQLException{
        //事务专用则不关闭,后续会有关闭
        //如果不是事务,则需要关闭
        Connection con = tl.get();
        //事务都没有,直接关闭
        if(con == null) connection.close();
        //有事务,判断是否相等,是否为专用连接
        if(con != connection) connection.close();

    }
}
时间: 2024-11-12 10:28:34

JavaWeb基础—dbutils的简单入门的相关文章

JavaWeb基础—JSP自定义标签入门

自定义标签的作用:替换JSP页面的java代码 步骤:1.标签处理类(标签是一个对象,那也就需要先有类) 2.tld文件 它是一个xml(可以向c标签里借),一般放到WEB-INF下,不让客户端浏览器看到 核心配置 <tag> <name>myTag</name> <tag-class>com.jiangbei.tag.MyTag</tag-class> <body-content>empty</body-content>

SpringMVC 基础教程 简单入门实例

SpringMVC 基础教程 简单入门实例 标签: Spring MVCspringmvcSpringMVC教程基础教程SpringMVC实例 2013-05-09 13:44 170403人阅读 评论(69) 收藏 举报  分类: Java(23)  Spring框架(3)  版权声明:本文为博主原创文章,未经博主允许不得转载. spring MVC 入门教程二: 一个简单的入门实例教程 该实例的源码和实例中的jar 源码:http://download.csdn.net/detail/swi

DartWeb基础—简单入门

DartWeb基础-简单入门 DartWeb的前面是Dart,所以需要先搭建好Dart开发环境,再进行下面的工作 下载Dartium浏览器 Dartium是Chromium的一个特殊的版本,里面包含Dart VM,使用Dartium意味着你不必将代码编译为JavaScript就能调试程序,直到开发完成后再将代码编译为JavaScript测试其他浏览器 Dartium下载地址-传送门 为以后方便开发,可以建立一个快捷方式到桌面 创建并完善应用 在根目录下新建index.html文件 <!DOCTY

【VB超简单入门】一、写在前面

每本书的前面总得写点什么,到我这里也自然不能免俗,前言这东西“存在即合理”,所以就随便写一点咯~ 首先这本书是给从未接触过编程的童鞋准备的,由于我学识疏浅,对VB也只是一知半解所以也只能讲一点点最基础的知识,入门之后便可以自由学习更高级的东西了~ 编程其实并不难,有很多人一看到屏幕上密密麻麻的代码就被吓呆了= =… 也有很多童鞋问我编程是不是得背很多代码= =…其实根本不用背,编程涉及的单词都是很简单的,高中的英语水平基本是可以胜任的,当然如果英语水平足够高的话可以直接阅读英文原版手册那就是更好

Asp.Net MVC3 简单入门第一季(一)环境准备

前言 大家好,从今天开始我将写一个关于AspNet MVC3方 面学习的总结,并跟初学者一起分享一些基本的基础知识,作者本身也很愿意跟大家一起交流技术,一起交流一起进步,欢迎高手不吝赐教,欢迎大家不同的意见和 建议,作者的学识和见识当然有自己的局限性,希望自己能成为不闷骚型的技术人员,而不是只自己享受技术,而不让更多的人来分享你的成果的人. 第一节:关于Asp.Net MVC3 Asp.Net MVC已经到第三版了,相信大家也都熟悉了,我也不再重复相关概念性的东西了.但是大家一定要了解,Asp.

Web Service简单入门例子

我们一般实现Web Service的方法有很多种.其中我主要使用了CXF Apache插件和Axis 2两种. Web Service是应用服务商为了解决每个问题而提供的在线服务方案,其主要采用了SOAP(Simple Object Access Protocol)协议,数据传输格式使用XML格式来描述,因此也具有跨平台的特性. web广泛用到的技术: TCP/IP:通用网络协议,被各种设备使用 HTML(标准通用标记语言下的一个应用):通用用户界面,可以使用HTML标签显示数据 Java:写一

mongodb学习(搭建开发环境+简单入门)

接下来这段时间,我将会学习mongodb,由浅入深,并且将学习的过程会详细记录下来.mongodb是什么?我想这一点不需要我过多的解释.好了,废话不多说,我们直奔主题,看看mongodb开发环境的搭建.说明一点,在学习mongodb期间,我的所有 操作都是在windows下完成的.下面我带大家一步一步学习windows下mongodb开发环境的搭建 下载mongodb 首先我们需要到mongodb的官网下载mongodb. http://www.mongodb.org/downloads 新建一

Web Service简单入门示例

我们一般实现Web Service的方法有非常多种.当中我主要使用了CXF Apache插件和Axis 2两种. Web Service是应用服务商为了解决每一个问题而提供的在线服务方案,其主要採用了SOAP(Simple Object Access Protocol)协议,传输数据格式使用XML格式来描写叙述.因此也具有跨平台的特性. web广泛用到的技术: TCP/IP:通用网络协议.被各种设备使用 HTML(标准通用标记语言下的一个应用):通用用户界面,能够使用HTML标签显示数据 Jav

(一)JavaWeb基础知识

JavaWeb基础知识 一.基本概念 1.1.WEB开发的相关知识 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资源分为: 1.静态web资源(如html 页面):指web页面中供人们浏览的数据始终是不变. 2.动态web资源:指web页面中供人们浏览的数据是由程序产生的,不同时间点访问web页面看到的内容各不相同. 静态web资源开发技术:Html 常用动态web资源开发技术:JSP/Servlet.ASP.P