JDBC-day07(Apache-DBUtils实现CRUD操作)

news/2024/5/18 21:42:55 标签: apache, JDBC, java

九:Apache-DBUtils实现CRUD操作

1 Apache-DBUtils简介

Apache-DbUtils 是 Apache 组织提供的开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用DbUtils能极大简化JDBC编码的工作量,同时也不会影响程序的性能。因此DbUtils成为很多不喜欢Hibernate的公司的首选。
使用Apache-DbUtils之前需要导入它的jar包,官网上会有,或者找国内镜像站找也可以。

2.常用的API及案例

  • org.apache.commons.dbutils.QueryRunner
    • 使用此类可以更快捷的进行删除,添加,修改操作,因为此类封装了我们之前自己写的删除,添加,修改操作。

例:对Customers表进行插入

java">	@Test
	public void testInsert() {
		Connection conn = null;        
		try {
			QueryRunner runner = new QueryRunner();
			conn = JDBCUtils.getConnection2();
			String sql = "insert into customers(name,email,birth)values(?,?,?)";
			int updateCount = runner.update(conn, sql, "薛之谦","xuezhiqian@168.com",new Date(87654323456L));
			if(updateCount != 0) {
				System.out.println("修改了" + updateCount + "条记录");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			JDBCUtils.closeResource(conn, null);
		}
	}
  • org.apache.commons.dbutils.ResultSetHandler

    • 定义了查询相关的接口,它的实现类根据其接口进行了具体的操作编写
      
    • ResultSetHandler 接口提供了一个单独的方法:Object handle (java.sql.ResultSet .rs)
      
  • 接口的主要实现类:

    • ArrayHandler:把结果集中的第一行数据转成对象数组。

    • ArrayListHandler:把结果集中的每一行数据都转成一个数组,再存放到List中。

    • BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。

    • BeanListHandler :将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。

    • ColumnListHandler:将结果集中某一列的数据存放到List中。

    • KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里,再把这些map再存到一个map里,其key为指定的key。

    • MapHandler :将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。

    • MapListHandler :将结果集中的每一行数据都封装到一个Map里,然后再存放到List

    • ScalarHandler :查询单个值对象

例:查询操作
BeanHandler:ResultSetHandler接口的实现类,用于封装表中的一条记录。

java">	@Test
	public void testQuery1() {
		Connection conn = null;                              
		try {
			QueryRunner runner = new QueryRunner();
			conn = JDBCUtils.getConnection2();
			String sql = "select id,name,email,birth from customers where id = ?";
			BeanHandler<Customer> handler = new BeanHandler<>(Customer.class);
			
			Customer customer = runner.query(conn, sql, handler, 23);
			System.out.println(customer);
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			JDBCUtils.closeResource(conn, null);
		}		
	}

BeanListHandler:ResultSetHandler接口的实现类,用于封装表中的多条记录构成的集合。

java">	@Test
	public void testQuery2() {
		Connection conn = null;                              
		try {
			QueryRunner runner = new QueryRunner();
			conn = JDBCUtils.getConnection2();
			String sql = "select id,name,email,birth from customers where id < ?";
			
			BeanListHandler<Customer> handler = new BeanListHandler<>(Customer.class);
			List<Customer> list = runner.query(conn, sql, handler, 23);
			list.forEach(System.out::println);//打印出多条记录
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			JDBCUtils.closeResource(conn, null);
		}
	}

MapHandler:ResultSetHandler接口的实现类,对应表中的一条记录。 将字段及相应字段的值作为Map中的Key和Value。

java">@Test
public void testQuery3() {
	Connection conn = null;                                         
	try {
		QueryRunner runner = new QueryRunner();
		conn = JDBCUtils.getConnection2();
		String sql = "select id,name,email,birth from customers where id = ?";
		
		MapHandler handler = new MapHandler();
		Map<String, Object> map = runner.query(conn, sql, handler, 23);
		
		System.out.println(map);
	} catch (Exception e) {
		e.printStackTrace();
	}finally {
		JDBCUtils.closeResource(conn, null);
	}		
}

MapListHandler:ResultSetHandler接口的实现类,对应表中的多条记录。将字段及相应字段的值作为Map中的Key和Value,将这些map添加到List中

java">@Test
public void testQuery4() {
	Connection conn = null;                
	try {
		QueryRunner runner = new QueryRunner();
		conn = JDBCUtils.getConnection2();
		String sql = "select id,name,email,birth from customers where id < ?";
		
		MapListHandler handler = new MapListHandler();
		List<Map<String, Object>> list = runner.query(conn, sql, handler, 23);
		
		list.forEach(System.out::println);
	} catch (Exception e) {
		e.printStackTrace();
	}finally {
		JDBCUtils.closeResource(conn, null);
	}		
}

ScalarHandler:用于查询特殊值

java">	@Test
	public void testQuery5() {
		Connection conn = null;        
		try {
			QueryRunner runner = new QueryRunner();
			conn = JDBCUtils.getConnection2();
			String sql = "select count(*) from customers";
			
			ScalarHandler handler = new ScalarHandler();
			Long count = (Long)runner.query(conn, sql, handler);
			System.out.println(count);
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			JDBCUtils.closeResource(conn, null);
		}		
	}
	
	@Test
	public void testQuery6() {
		Connection conn = null;
		try {
			QueryRunner runner = new QueryRunner();
			conn = JDBCUtils.getConnection2();
			String sql = "select max(birth) from customers";
			
			ScalarHandler handler = new ScalarHandler();
			Date maxBirth = (Date) runner.query(conn, sql, handler);
			System.out.println(maxBirth);
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			JDBCUtils.closeResource(conn, null);
		}		
	}
  • org.apache.commons.dbutils.DbUtils

    • DbUtils工具类提供如关闭连接、装载JDBC驱动程序等常规操作
      

例:资源关闭

java">public static void closeResource1(Connection conn,Statement ps,ResultSet rs){           
//		try { 
//			DbUtils.close(conn);
//		} catch (SQLException e) {
//			e.printStackTrace();
//		}
//		try {
//			DbUtils.close(ps);
//		} catch (SQLException e) {
//			e.printStackTrace();
//		}
//		try {
//			DbUtils.close(rs);
//		} catch (SQLException e) {
//			e.printStackTrace();
//		}

		DbUtils.closeQuietly(conn);
		DbUtils.closeQuietly(ps);
		DbUtils.closeQuietly(rs);
	}

其中可能会出现不少的小问题,请多多包含
感谢大家的支持,关注,评论,点赞!
参考资料:尚硅谷_宋红康_JDBC核心技术


http://www.niftyadmin.cn/n/5116498.html

相关文章

Web前端—Flex布局:标准流、浮动、Flex布局、综合案例(短视频首页解决方案)

版本说明 当前版本号[20231024]。 20231024初版 目录 文章目录 版本说明目录Flex布局01-标准流02-浮动基本使用产品区域布局HTML标签CSS样式 清除浮动场景搭建额外标签法单伪元素法双伪元素法overfow法 03-Flex布局Flex组成主轴对齐方式侧轴对齐方式修改主轴方向弹性伸缩比弹…

云计算要学习哪些技术?

学习云计算需要涉及多个技术领域和相关的工具、平台和框架。以下是一个详细的介绍&#xff0c;帮助您了解学习云计算所需的技术。 1. 虚拟化技术 虚拟化是云计算的基础&#xff0c;因此了解虚拟化技术至关重要。学习虚拟化技术时&#xff0c;需要掌握以下知识点&#xff1a; …

Docker 容器全部停止命令

Docker是一个开源的容器化平台&#xff0c;它可以帮助开发者快速构建、部署和运行应用程序。在使用Docker时&#xff0c;我们通常会创建多个容器来运行不同的服务或应用。当我们需要停止所有的容器时&#xff0c;可以使用一些命令来实现。本文将介绍几种常见的停止所有Docker容…

强化学习代码实战(1)

机器人领域&#xff1a;控制&#xff0c;规划&#xff0c;感知等都可以用&#xff0c;可以把它作为一个优化过程&#xff0c;那么任何需要优化的问题都可以用它解决。 1.应用 深度学习&#xff1a;智能感知&#xff0c;解决智能如何理解这个世界的问题。 强化学习&#xff1a…

codeshell安装配置

codeshell安装配置 1 注意事项1.1 Python版本问题 2 codeshell环境搭建2.1 codeshell使用软件各版本2.2 软件下载2.3 codeshell使用环境安装2.3.1 python-3.10.9-amd64.exe安装2.3.2 Anaconda3-2022.10-Windows-x86_64.exe安装2.3.3 创建环境2.3.4 Pytorch安装2.3.5 transforme…

【数据结构】B树与B+树的联系与区别

1. 概念 一棵m阶B树&#xff1a; 树中每个结点至多有m棵子树。(即至多含有m-1个关键字&#xff0c;两颗子树指针夹着一个关键字)&#xff1b;若根结点不是终端结点&#xff0c;则至少有两颗子树。(至少一个关键字)&#xff1b;除根结点外的所有非叶子结点至少有[m/2]棵子树。…

MySQL1——喵喵期末不挂科

宝宝&#xff0c;你不点个赞吗&#xff1f;不评个论吗&#xff1f;不收个藏吗&#xff1f; 最后的最后&#xff0c;关注我&#xff0c;关注我&#xff0c;关注我&#xff0c;你会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的很重要…

【Spring Cloud】seata分布式事务官方入门案例(导读2)

文章目录 1. 准备seata环境1.1. 生产环境启动seata1.2. 采用代码启动seata 2. 开始测试3. 附录3.1. 如果第一次配置seata压缩包3.2. 常见问题参考 本文是针对官方seata入门文章https://sca.aliyun.com/zh-cn/docs/2022.0.0.0/user-guide/seata/quick-start的 补充说明&#xf…