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

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

在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);
    }
}

 

相关文章
|
1月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
74 9
|
1月前
|
XML Java 数据库连接
性能提升秘籍:如何高效使用Java连接池管理数据库连接
在Java应用中,数据库连接管理至关重要。随着访问量增加,频繁创建和关闭连接会影响性能。为此,Java连接池技术应运而生,如HikariCP。本文通过代码示例介绍如何引入HikariCP依赖、配置连接池参数及使用连接池高效管理数据库连接,提升系统性能。
62 5
|
27天前
|
SQL Java 索引
java小工具util系列2:字符串工具
java小工具util系列2:字符串工具
138 83
|
24天前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
46 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
27天前
|
Java 数据库
java小工具util系列1:日期和字符串转换工具
java小工具util系列1:日期和字符串转换工具
55 26
|
1月前
|
JSON Java 关系型数据库
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
在Java中,使用mybatis-plus更新实体类对象到mysql,其中一个字段对应数据库中json数据类型,更新时报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
65 4
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
|
28天前
|
Java
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
50 24
|
27天前
|
数据采集 存储 监控
Java爬虫:数据采集的强大工具
在数据驱动的时代,Java爬虫技术凭借其强大的功能和灵活性,成为企业获取市场信息、用户行为及竞争情报的关键工具。本文详细介绍了Java爬虫的工作原理、应用场景、构建方法及其重要性,强调了在合法合规的前提下,如何有效利用Java爬虫技术为企业决策提供支持。
|
1月前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
55 3
|
1月前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
66 2