开源协议: Apache 2.0
DbUtils-Pro是一个DbUtils的改进版,它支持多种SQL风格并改进事务管理。主要特点有:
改进DbUtils的异常处理,将SQLException转化为运行时导常抛出,无需再手工捕获异常,这点类似于Spring的JdbcTemplate。
添加Inline风格SQL支持,Inline风格利用Threadlocal方式传递SQL参数,具有简单、易维护的优点。关于Inline风格的详细介绍请参见发现一种简单的SQL包装方法一文。
添加SQL模板支持,将一些长SQL写在模板中是一种比较好的实践。DbUtils-Pro开放式架构设计为可配置使用任意第三方模板(调用setSqlTemplateEngine方法),并自带一个简易的模板实现。
改进数据源管理,可轻易配置使用第三方事务管理服务,如Spring声明式事务,抛弃怪异的TransactionAwareDataSourceProxy代理方式。
原有的DbUtils方法100%保留,这很明显,因为DbPro类的父类是QueryRunner,对于已经使用DbUtils的项目,只需要将QueryRunner换成DbPro,即可无缝升级。
DbUtils-Pro是作为jSqlBox项目的内核而开发的,它是一个承上(包装JDBC,支持多种SQL写法)启下(作为ORM项目内核)的项目,但它本身也是一个独立的工具,可以单独使用,其运行环境为Java6或以上。
作为ORM项目的内核,DbUtils-Pro仅关注于改进JDBC操作的易用性,它不考虑对象映射、关联映射、跨数据库、分页等高级功能,这些高级功能 属于jSqlBox项目负责的范畴。jSqlBox的设计理念是尽量将每个功能点设计成独立的小项目,隔离它们的相互依赖性,每个小项目都可以单独使用,整合在一起就成了jSqlBox,这与Hibernate之类将所有功能都打包在一起提供的持久层工具是不同的。目前在这一理念下已经开发或正在开发的工 具项目有:
1) jDialects,这是一个支持70多种方言的SQL分页和DDL工具,用于解决利用JDBC工具进行跨数据库开发的问题。
2) jTransactions,这是一个将声明式事务作为单独的工具提供的小项目,目前包含TinyTx和SpringTx两个实现,今后将不断扩充。
3) jBeanBox,这是一个纯粹的IOC/AOP工具,与Spring内核功能类似,但是更小、更易用, 是TinyTx的最佳伴侣。
4) DbUtils-Pro,这是一个基于DbUtils并作了改进的JDBC工具,支持多种SQL风格,即可单独使用,也可以作为ORM内核存在,起承上启下作用。
5) jSqlBox这是一个基于ActiveRecord模式的ORM工具,主要作用是实现POJO对象的CRUD和支持基本的关联映射。
方式一:手工下载commons-dbutils-1.7.jar和dbutils-pro-1.7.0.jar并放置于项目的类目录。
方式二:在项目的pom.xml文件中加入如下行:
<dependency> <groupId>com.github.drinkjava2</groupId> <artifactId>dbutils-pro</artifactId> <version>1.7.0</version> </dependency>
DbUtils-Pro仅依赖于DbUtils,如果使用Maven将自动下载对应其主版本号的DbUtils包commons-dbutils-1.7.jar。
如果需要使用事务支持,还需要在pom.xml中添加jTransactions的依赖:
<dependency> <groupId>com.github.drinkjava2</groupId> <artifactId>jtransactions</artifactId> <version>1.0.0</version> </dependency>
一. 以下示例演示DbUtils-Pro在同一个方法里,混合使用五种不同的编程风格。在无事务配置情况下,使用默认的连接管理器,工作在自动提交模式。
query(Connection, String sql, Object... params): 传统DbUtils方法, 需手工关闭Connection和捕获SQLException
query(String sql, Object... params): 传统DbUtils方法, 需手工捕获SQLException
nQuery(String sql, Object... params): 方法名以n打头,与JdbcTemplate类似,无需手工捕获SQLException
iQuery(String... inlineSQLs): 方法名以i打头,In-line风格,参数利用ThreadLocal织入到SQL中
tQuery(String... sqlTemplate): 方法名以t打头,Template风格, 利用模板管理SQL
@Test public void executeTest() { DbPro dbPro = new DbPro((DataSource) BeanBox.getBean(DataSourceBox.class)); dbPro.setAllowShowSQL(true); User user = new User(); user.setName("Sam"); user.setAddress("Canada"); System.out.println("风格1: 继承了旧的DbUtils风格,需手工关闭Connection和捕获SQLException"); Connection conn = null; try { conn = dbPro.prepareConnection(); dbPro.execute(conn, "insert into users (name,address) values(?,?)", "Sam", "Canada"); dbPro.execute(conn, "update users set name=?, address=?", "Sam", "Canada"); Assert.assertEquals(1L, dbPro.queryForObject(conn, "select count(*) from users where name=? and address=?", "Sam", "Canada")); dbPro.execute(conn, "delete from users where name=? or address=?", "Sam", "Canada"); } catch (SQLException e) { e.printStackTrace(); } finally { try { dbPro.close(conn); } catch (SQLException e) { e.printStackTrace(); } } System.out.println("风格2: 继承了旧的DbUtils风格, 需手工捕获SQLException"); try { dbPro.execute("insert into users (name,address) values(?,?)", "Sam", "Canada"); dbPro.execute("update users set name=?, address=?", "Sam", "Canada"); Assert.assertEquals(1L, dbPro.queryForObject("select count(*) from users where name=? and address=?", "Sam", "Canada")); dbPro.execute("delete from users where name=? or address=?", "Sam", "Canada"); } catch (SQLException e) { e.printStackTrace(); } System.out.println("风格3: nXxxx方法,无需捕获SQLException"); dbPro.nExecute("insert into users (name,address) values(?,?)", "Sam", "Canada"); dbPro.nExecute("update users set name=?, address=?", "Sam", "Canada"); Assert.assertEquals(1L, dbPro.nQueryForObject("select count(*) from users where name=? and address=?", "Sam", "Canada")); dbPro.nExecute("delete from users where name=? or address=?", "Sam", "Canada"); System.out.println("风格4: iXxxx方法,In-Inlne风格,可以将参数织入到SQL中"); dbPro.iExecute("insert into users (", // " name ,", param0("Sam"), // " address ", param("Canada"), // ") ", valuesQuesions()); param0("Sam", "Canada"); dbPro.iExecute("update users set name=?,address=?"); Assert.assertEquals(1L, dbPro.iQueryForObject("select count(*) from users where name=" + question0("Sam"))); dbPro.iExecute("delete from users where name=", question0("Sam"), " and address=", question("Canada")); System.out.println("风格5: In-Line风格的引申,半自动的ORM,POJO属性可以织入到SQL任意位置"); dbPro.iExecute("insert into users (", inline0(user, "", ", ") + ") ", valuesQuesions()); dbPro.iExecute("update users set ", inline0(user, "=?", ", ")); Assert.assertEquals(1L, dbPro.iQueryForObject("select count(*) from users where ", inline0(user, "=?", " and "))); dbPro.iExecute(param0(), "delete from users where ", inline(user, "=?", " or ")); System.out.println("风格6: tXxxx方法,模板风格支持"); put0("user", user); dbPro.tExecute("insert into users (name, address) values(#{user.name},#{user.address})"); put0("name", "Sam"); put("addr", "Canada"); dbPro.tExecute("update users set name=#{name}, address=#{addr}"); Assert.assertEquals(1L, dbPro.tQueryForObject("select count(*) from users where ${col}=#{name} and address=#{addr}", put0("name", "Sam"), put("addr", "Canada"), replace("col", "name"))); dbPro.tExecute("delete from users where name=#{name} or address=#{addr}", put0("name", "Sam"), put("addr", "Canada")); }
二. 声明式事务演示 DbUtils-Pro本身并无事务功能,以下示例演示DbUtils-Pro与jTransactions整合进行事务操作。 jTransactions项目是一个独立的事务工具,目前包含两个实现: TinyTx和SpringTx,TinyTx是一个只有四个类组成的微型声明式事务服务,适用于小型项目。SpringTx则是对Spring事务的简 单包装。
下面的示例包含了TinyTx声明式事务的配置、建表、插入数据、事务回滚的演示。此示例如需改成使用Spring事务,只需将1、2行和3、4行的注释互换,并在pom.xml中加入Spring的库依赖即可。 没有用到XML,只有一个注解@AopAround, 从这个例子可以看出jBeanBox与jTransactions的配置是多么的简单。
public class TxDemo { private static Class<?> tx = TinyTx.class; private static ConnectionManager cm = TinyTxConnectionManager.instance(); // private static Class<?> tx = SpringTx.class; // private static ConnectionManager cm = SpringTxConnectionManager.instance(); public static class TxBox extends BeanBox { {this.setConstructor(tx, BeanBox.getBean(DataSourceBox.class), Connection.TRANSACTION_READ_COMMITTED); } } DbPro dbpro = new DbPro((DataSource) BeanBox.getBean(DataSourceBox.class), cm); @AopAround(TxBox.class) public void tx_Insert1() { dbpro.nExecute("insert into users (id) values(?)", 123); Assert.assertEquals(1L, dbpro.nQueryForObject("select count(*) from users")); } @AopAround(TxBox.class) public void tx_Insert2() { dbpro.nExecute("insert into users (id) values(?)", 456); Assert.assertEquals(2L, dbpro.nQueryForObject("select count(*) from users")); System.out.println(1 / 0); } @Test public void doTest() { System.out.println("============Testing: TxDemo============"); TxDemo tester = BeanBox.getBean(TxDemo.class); try { dbpro.nExecute("drop table users"); } catch (Exception e) { } dbpro.nExecute("create table users (id varchar(40))engine=InnoDB"); Assert.assertEquals(0L, dbpro.nQueryForObject("select count(*) from users")); try { tester.tx_Insert1();// this one inserted 1 record tester.tx_Insert2();// this one did not insert, roll back } catch (Exception e) { System.out.println("div/0 exception found, tx_Insert2 should roll back"); } Assert.assertEquals(1L, dbpro.nQueryForObject("select count(*) from users")); BeanBox.defaultContext.close();// Release DataSource Pool } }
以上即为DbUtils-Pro全部文档,如有疑问,请下载并运行单元测试示例或查看源码(核心代码只有9个类)。
MySql驱动(jar包)下载:https://pan.baidu.com/s/19BYnGbO3l5MOOic5K4Ooaw 密码:mwoh 第三方插件(commons-dbutils)下载:https://pan.baidu.com/s/17cyAXHZLgiayx5Y_VHvawQ 密码:6om2 commons-dbutils-1.6.jar---右键---Build Path---A
1 简介 DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能。简要来说就是配合数据库连接池简化对数据库的操作代码,数据库连接池简化了连接操作,而DBUtils简化了增删改查操作,底层由DbUtils工具实现,我们只需要关注用法和了解实现逻辑即可。 2 常用类 DBUtils工具 为了更加简单地使用JDBC,
进入正题之前先下载资源jar包 commons-dbutils-1.7.jar druid-1.0.9.jar Durid应用 使用durid技术可以避免链接繁琐的创建步骤,将java代码与数据库的连接变得更加简单。 最重要的是:使用数据库连接池可以在获得连接后,并不是释放连接而是将它保存在一个连接池中,等待再次调用。这大大加快了java代码与数据库之间数据交互的速度(主要是减少了连接所浪费的时间
1.导包 2.注册驱动 3.获取的连接对象 4.准备sql语句 都是字符串 5.通过数据库的连接获取数据库的执行对象 6.通过执行对象执行sql语句,将sql语句发送给数据库,(DDL语句/DML语句) 7.释放资源 public class JdbcDemo { public static void main(String[] args) throws Exception { //
1. JDBC数据库连接池(⭐) 前言: 随着发展,传统的数据库连接模式已经满足不了需求了,并且也存在问题:资源无法得到重复利用,不能很好节省资源,不能有效控制被创建的连接对象数。因此为了解决传统开发中的数据库连接问题,可以采用数据库连接池技术。 1.1数据库连接池技术概念 数据库连接池的基本思想:就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从
第一章-自定义连接池 1.1 连接池概念 为什么要使用连接池 Connection对象在JDBC使用的时候就会去创建一个对象,使用结束以后就会将这个对象给销毁了(close).每次创建和销毁对象都是耗时操作.需要使用连接池对其进行优化. 程序初始化的时候,初始化多个连接,将多个连接放入到池(集合)中.每次获取的时候,都可以直接从连接池中进行获取.使用结束以后,将连接归还到池中. 连接池原理
目录 1.为什么要使用连接池 2.自定义连接池-初级版本 3.自定义连接池-进阶版本 4.装饰者模式 5.自定义连接池-终极版本 6.C3P0连接池 1.通过硬编码来编写【了解】 2.通过配置文件来编写 3.使用c3p0改写工具类 7.DRUID连接池 1.通过硬编码方式【了解】 2.通过配置文件方式 3.Druid工具类的制作 8.DBUtils完成增删改 9.DBUtils完成查询 查询一条记
1、使用类的加载器来加载database.properties文件流。 2、读取配置文件,获取连接,只执行一次,static{ } 3、JDBCUtils封装类 package cn.itcast.jdbcutils; import java.io.IOException; import java.io.InputStream; import java.sql.Connection; impor
需要了解的知识 首先呢,你需要了解下DBUtils,我的描述肯定没官网解释来的清晰,自行阅读后,你就会发现我为什么会选用PooledDB而不是其他作为连接池了。 其次,DBUtils支持所有遵循DP-API 2规范的数据库连接模块,也就是说除了我示例中所提供的几个数据库连接方式外,各位可以探索其他遵循此标准的连接模块,从而在此基础上拓展,成为连接更多种类数据库的通用工具类。 最后,以下内容均基于p
db.properties driverClass=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/test_db?useUnicode=true&characterEncoding=UTF-8&jdbcCompliantTruncation=false user=root password= commonsDbutils工具类
原则上这不能说是一个持久层框架,它提供了一些Jdbc的操作封装来简化数据查询和记录读取操作。本站就是采用这个项目来读写数据库,代码非常简洁,如果你厌烦了Hibernate的庞大,不妨可以试试——DbUtils。 给出一小段代码看看DbUtils是怎么用的: QueryRunner run = new QueryRunner(dataSource); // Use the BeanHandler i
Python DBUtils 提供了稳固的、持久的到数据库的连接池,支持多线程应用环境。 该项目支持 DB-API 2 兼容数据库接口以及传统的 PyGreSQL 接口。下图是 DB-API 2 的接口结构图 下面是连接的结构图: 使用实例代码: import pgdb # import used DB-API 2 module from DBUtils.PersistentDB import P
主要内容:类声明,用法,示例是接口的实现,负责将行转换为Maps列表。 这个类是线程安全的。 类声明 以下是类的声明 - 用法 第1步 - 创建一个连接对象。 第2步 - 将实现为对象。 第3步 - 将传递给对象,并进行数据库操作。 示例 以下示例将演示如何使用类读取记录。 我们将读取表中的一条记录,并将其映射到 bean。 语法 其中 - 对象将结果集映射到列表。 - 对象从数据库中读取对象。 为了理解上述与DBUtils
主要内容:类声明,用法,示例是接口的实现,负责将行转换为。 这个类是线程安全的。 类声明 以下是类的声明 - 用法 第1步 - 创建一个连接对象。 第2步 - 将实现为对象。 第3步 - 将传递给对象,并进行数据库操作。 示例 以下示例将演示如何使用类读取记录。 我们将读取表中的一条记录,并将其映射到 bean。 语法 其中 - 对象将结果集映射到对象。 - 对象从数据库中读取对象。 为了理解上述与DBUtils相关的概念,
主要内容:类声明,用法,示例是接口的实现,负责将行转换为Java Bean列表。 这个类是线程安全的。 类声明 以下是类的声明 - 用法 第1步 - 创建一个连接对象。 第2步 - 将实现为对象。 第3步 - 将传递给对象,并进行数据库操作。 示例 以下示例将演示如何使用类读取记录。 我们将读取表中的一条记录,并将其映射到 bean。 语法 其中 - 对象将结果集映射到对象。 - 对象从数据库中读取对象。 为了理解上述与DB
主要内容:类声明,用法,示例是接口的实现,负责将第一个行转换为。 这个类是线程安全的。 类声明 以下是类的声明 - 用法 第1步 - 创建一个连接对象。 第2步 - 获取作为对象的实现。 第3步 - 将传递给对象,并进行数据库操作。 示例 以下示例将演示如何使用类读取记录。 我们将读取表中的一条记录,并将其映射到 bean。 语法 其中 - 对象将结果集映射到对象。 - 对象从数据库中读取对象。 为了理解上述与DBUtils