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

 

相关文章
|
10月前
|
人工智能 缓存 监控
使用LangChain4j构建Java AI智能体:让大模型学会使用工具
AI智能体是大模型技术的重要演进方向,它使模型能够主动使用工具、与环境交互,以完成复杂任务。本文详细介绍如何在Java应用中,借助LangChain4j框架构建一个具备工具使用能力的AI智能体。我们将创建一个能够进行数学计算和实时信息查询的智能体,涵盖工具定义、智能体组装、记忆管理以及Spring Boot集成等关键步骤,并展示如何通过简单的对话界面与智能体交互。
3527 1
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
12月前
|
数据可视化 BI API
无缝对接云数据库:自定义报表生成工具在混合云环境下的部署指南
自定义报表生成工具通过拖拽设计、多数据源整合及自动化输出,帮助业务人员零代码创建个性化报表,解决传统工具灵活性不足、技术门槛高的问题。文章对比其与传统报表差异,列举行业应用场景(如财务、零售),并给出选型建议与主流工具(如FineReport、Power BI、板栗看板)的优劣势分析。
405 0
|
监控 Java Unix
6个Java 工具,轻松分析定位 JVM 问题 !
本文介绍了如何使用 JDK 自带工具查看和分析 JVM 的运行情况。通过编写一段测试代码(启动 10 个死循环线程,分配大量内存),结合常用工具如 `jps`、`jinfo`、`jstat`、`jstack`、`jvisualvm` 和 `jcmd` 等,详细展示了 JVM 参数配置、内存使用、线程状态及 GC 情况的监控方法。同时指出了一些常见问题,例如参数设置错误导致的内存异常,并通过实例说明了如何排查和解决。最后附上了官方文档链接,方便进一步学习。
3245 4
|
机器学习/深度学习 消息中间件 存储
【高薪程序员必看】万字长文拆解Java并发编程!(9-2):并发工具-线程池
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的强力并发工具-线程池,废话不多说让我们直接开始。
446 0
|
9月前
|
人工智能 监控 Java
Java与AI智能体:构建自主决策与工具调用的智能系统
随着AI智能体技术的快速发展,构建能够自主理解任务、制定计划并执行复杂操作的智能系统已成为新的技术前沿。本文深入探讨如何在Java生态中构建具备工具调用、记忆管理和自主决策能力的AI智能体系统。我们将完整展示从智能体架构设计、工具生态系统、记忆机制到多智能体协作的全流程,为Java开发者提供构建下一代自主智能系统的完整技术方案。
1080 4
|
10月前
|
人工智能 Java API
Java AI智能体实战:使用LangChain4j构建能使用工具的AI助手
随着AI技术的发展,AI智能体(Agent)能够通过使用工具来执行复杂任务,从而大幅扩展其能力边界。本文介绍如何在Java中使用LangChain4j框架构建一个能够使用外部工具的AI智能体。我们将通过一个具体示例——一个能获取天气信息和执行数学计算的AI助手,详细讲解如何定义工具、创建智能体并处理执行流程。本文包含完整的代码示例和架构说明,帮助Java开发者快速上手AI智能体的开发。
3463 8
|
NoSQL Java API
在Java环境下如何进行Redis数据库的操作
总的来说,使用Jedis在Java环境下进行Redis数据库的操作,是一种简单而高效的方法。只需要几行代码,就可以实现复杂的数据操作。同时,Jedis的API设计得非常直观,即使是初学者,也可以快速上手。
495 94
|
SQL 数据库 开发者
Python中使用Flask-SQLAlchemy对数据库的增删改查简明示例
这样我们就对Flask-SQLAlchemy进行了一次简明扼要的旅程,阐述了如何定义模型,如何创建表,以及如何进行基本的数据库操作。希望你在阅读后能对Flask-SQLAlchemy有更深入的理解,这将为你在Python世界中从事数据库相关工作提供极大的便利。
1020 77
|
10月前
|
人工智能 数据库 iOS开发
DBeaver Ultimate Edtion 25.2 发布 - 通用数据库工具
DBeaver Ultimate Edtion 25.2 Multilingual (macOS, Linux, Windows) - 通用数据库工具
835 0