在java程序中,一般使用jdbc连接数据库,比较麻烦,在看传智教程时学了一个工具类,用于简化与数据库之间的操作步骤,就是TxQueryRunner,他是QueryRunner的子类,用起来和他是一样的,特点是支持事务,使用时需要导入几个jar包,分别是

:

这个工具类的优点基本上就是阿帕奇出的DBUtils框架里边所具有的特点,极大简化操作者的代码量,底层使用c3p0连接池,可以方便的吧数据库查询出来的结果映射到JavaBean,List,Map等中,以下是笔记及代码:

import java.sql.SQLException;
import java.util.List;
import java.util.Map; import org.apache.commons.dbutils.QueryRunner;
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 org.apache.commons.dbutils.handlers.ScalarHandler;
import org.junit.Test; import cn.itcast.commons.CommonUtils;
import cn.itcast.jdbc.JdbcUtils;
import cn.itcast.jdbc.TxQueryRunner; /**
* TxQueryRunner它是QueryRunner的子类!(commons-dbutils.jar)
* 可用起来与QueryRunner相似的!
* 我们的类支持事务!它底层使用了JdbcUtils来获取连接!
*
* 简化jdbc的操作
* QueryRunner的三个方法:
* * update() --> insert、update、delete
* * query() --> select
* * batch() --> 批处理
* @author qdmmy6
*
*/
public class TxQueryRunnerTest {
/**
* 测试update()方法,用来执行insert、update、delete语句
* @throws SQLException
*/
@Test
public void testUpdate() throws SQLException {
String sql = "insert into t_person(pid,pname,age,sex) values(?,?,?,?)";
Object[] params = {"1", "p1", 1, "男"};//给sql中对应的参数 QueryRunner qr = new TxQueryRunner();//我们没有给对象提供连接池
qr.update(sql, params);//执行sql,也不提供连接,它内部会使用JdbcUtils来获取连接
} /**
* 使用事务
* @throws SQLException
*/
@Test
public void testUpdate2() throws Exception {
try {
JdbcUtils.beginTransaction();//开启事务 String sql = "insert into t_person(pid,pname,age,sex) values(?,?,?,?)";
QueryRunner qr = new TxQueryRunner();
Object[] params = {"2", "p2", 2, "女"};
qr.update(sql, params);//执行 if(false) {
throw new Exception();
} params = new Object[]{"3", "p3", 3, "女"};
qr.update(sql, params);//执行 JdbcUtils.commitTransaction();//提交事务
} catch(Exception e) {
try {
JdbcUtils.rollbackTransaction();//回滚事务
} catch (SQLException e1) {
}
throw e;
}
} /**
* 测试查询方法
* 我们知道JDBC查询的结果的是ResultSet
* 而QueryRunner查询的结果是通过ResultSet映射后的数据。
* * QueryRunner第一步是执行select,得到ResultSet
* * 把ResultSet转换成其他类型的!
* 通过转换结果:
*    * javaBean:把结果集封装到javaBean中
* * Map:把结果集封装到Map中
* * 把结果集封装到Object中(结果集是单行单列)
* @throws SQLException
*
*
*/
/*
* 单行结果集映射到javaBean中
*/
@Test
public void testQuery1() throws SQLException {
String sql = "select * from t_person where pid=?";
QueryRunner qr = new TxQueryRunner();
/*
* 第二个参数类型为ResultSetHandler,它是一个接口,表示映射的结果类型。
*
* BeanHandler --> 它是ResultSetHandler的实现类,它的作用是把结果集封装到Person对象中
*/
Person p = qr.query(sql, new BeanHandler<Person>(Person.class), "1");
System.out.println(p);
} /**
* 使用BeanListHandler
* 把多行结果集映射到List<Bean>,即多个JavaBean对象。
* 一行结果集记录对应一个javaBean对象,多行就对应List<Bean>
* @throws SQLException
*/
@Test
public void testQuery2() throws SQLException {
String sql = "select * from t_person";
QueryRunner qr = new TxQueryRunner();
/*
* 第二个参数类型为ResultSetHandler,它是一个接口,表示映射的结果类型。
*
* BeanListHandler --> 它是ResultSetHandler的实现类,
* 它的作用是把结果集封装到List<Person>对象中
*/
List<Person> list = qr.query(sql, new BeanListHandler<Person>(Person.class));
System.out.println(list);
} /**
* 使用MapHandler,把单行结果集封装到Map对象中
* @throws SQLException
*/
@Test
public void testQuery3() throws SQLException {
String sql = "select * from t_person where pid=?";
QueryRunner qr = new TxQueryRunner();
/*
* 第二个参数类型为ResultSetHandler,它是一个接口,表示映射的结果类型。
*
* BeanListHandler --> 它是ResultSetHandler的实现类,
* 它的作用是把结果集封装到List<Person>对象中
*/
Map<String, Object> map = qr.query(sql, new MapHandler(), "1");
System.out.println(map);
} /**
* 使用MapListHandler,把多行结果集封装到List<Map>中,即多个Map
* 一行对应一个Map,多行对应List<Map>
* @throws SQLException
*/
@Test
public void testQuery4() throws SQLException {
String sql = "select * from t_person";
QueryRunner qr = new TxQueryRunner();
/*
* 第二个参数类型为ResultSetHandler,它是一个接口,表示映射的结果类型。
*
* BeanListHandler --> 它是ResultSetHandler的实现类,
* 它的作用是把结果集封装到List<Person>对象中
*/
List<Map<String, Object>> mapList = qr.query(sql, new MapListHandler());
System.out.println(mapList);
} /**
* 使用ScalarHandler,把单行单列的结果集封装到Object中
* @throws SQLException
*/
@Test
public void testQuery5() throws SQLException {
String sql = "select count(*) from t_person";//结果集是单行单列的
QueryRunner qr = new TxQueryRunner(); Object obj = qr.query(sql, new ScalarHandler());
/*
* 我们知道select count(1),结果一定是个整数!
* > Integer
* > Long
* > BigInteger
*
* 不同的驱动,结果不同!
* 无论是哪种类型,它都是Number类型!强转成Number一定不出错
*/
Number number = (Number)obj;
long cnt = number.longValue();
System.out.println(cnt);
}
}

java操作数据库增删改查的小工具1--TxQueryRunner的更多相关文章

  1. java操作数据库增删改查的小工具2--TxQueryRunner

    当涉及到多表查询时,如数据库中有两张表分别为t_person和t_address,表结构如下: 其中t_person的外键为t-address的主键aid, 新建两个javaBean类,Person ...

  2. 2. MongoDB基本操作 —— 用Mongo.exe操作数据库增删改查

    一.开篇 传统的关系数据库一般由数据库(database).表(table).记录(record)三个层次概念组成,MongoDB是由数据库(database).集合(collection).文档对象 ...

  3. MongoDB(六)java操作mongodb增删改查

    java操作mysql数据库的代码我们已经了如指掌了.增删改查,java对mongodb数据库也是类似的操作,先是数据库连接.再是进行操作. 首先我们进入进入admin数据库.然后建立自己的数据库te ...

  4. Django-Model操作数据库(增删改查、连表结构)

    一.数据库操作 1.创建model表         基本结构 1 2 3 4 5 6 from django.db import models     class userinfo(models.M ...

  5. phpcms 操作数据库 增删改查

    数据库的其他类继承的都是libs/class/model.class.php 这里面有写好的操作数据库的常用方法 1.增 insert($data, $return_insert_id = false ...

  6. MongoDB学习day04--NodeJs操作数据库增删改查

    一.在Nodejs中使用Mongodb Nodejs需要引入的包 npm install mongodb --save -dev 或者使用镜像 cnpm install mongodb --save ...

  7. Java针对数据库增删改查代码

    package com.bank.abc; import java.beans.PropertyVetoException; import java.sql.Connection; import ja ...

  8. JavaWeb学习记录(七)——MVC操作数据库增删改查与分页功能

    一.分页工具类 package blank.util;import java.util.List; import org.springframework.jdbc.core.JdbcTemplate; ...

  9. struts+hibernate 请求数据库增删改查(小项目实例)

      StudentAction.java package com.action; import java.util.ArrayList; import java.util.List; import j ...

随机推荐

  1. ajax 全套

    ajax简介 AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术.Ajax不是一种新的编程语言, ...

  2. *HDU1850 博弈

    Being a Good Boy in Spring Festival Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32 ...

  3. 学习JavaScript闭包

    作者: 阮一峰 日期: 2009年8月30日 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 下面就是我的学习笔记,对于Javascript初 ...

  4. iOS程序模块化设计

    一.模块化设计的概述: 模块化设计(Block-based design):对一定范围内的不同功能或相同功能的不同性能.不同规格的产品进行功能分析的基础上,划分并设计出一系列功能模块,通过模块的选择和 ...

  5. 拯救无法启动的虚拟机文件.vmdk中的数据

    FROM: http://blog.csdn.net/npy_lp/article/details/7686583 从事Linux开发的软件工程师几乎都使用过虚拟机软件,如VMware worksta ...

  6. SDOI 2016 生成魔咒

    题目大意:一个字符串,刚开始为空,依次在后面添加一个字符,问每次添加完字符后本质不同的字符串有多少种 后缀自动机裸题,添加字符时,更新的结点个数即为新增加的子串 #include<bits/st ...

  7. DBImport v3.5 中文版发布:数据库定时同步及文档生成工具(IT人员必备)

    前言: 趁着最近的休息时间,只能多勤快些:多写代码,多更新文章. 因为一旦投入新的工作,估计博客又会恢复到一年才产几篇的状态. 对于DBImport,因为用户的意见,增加了一个亮点功能,让软件B格升为 ...

  8. js问题杂记

    1.如何把字符串数组 转成数组对象? eval妙用 var str = "[\"UserName=1,Pwd=1\",\"UserNmae=1,Pwd=1,Sa ...

  9. DRY(Don't Repeat Yourself )原则

    凡是写过一些代码的程序猿都能够意识到应该避免重复的代码和逻辑.我们通过提取方法,提取抽象类等等措施来达到这一目的.我们总能时不时的听到类似这样的话:”把这些公用的类放到shared项目去,别的项目还要 ...

  10. 剑指Offer面试题:24.复杂链表的复制

    一.题目:复杂链表的复制 题目:请实现函数ComplexListNode Clone(ComplexListNode head),复制一个复杂链表.在复杂链表中,每个结点除了有一个Next指针指向下一 ...