DBUtils工具类实现CRUD操作

Apache-DBUtils简介

  • commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,帮我们简化了CRUD 的代码。其中的主要API,如QueryRunner类简化了SQL查询,它与ResultSetHandler接口(或其实现类)组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量。
  • 主要API简述:
    QueryRunner类:提供了数据库操作的一系列重载的update()和query()操作。
    ResultSetHandler接口:用于处理数据库查询操作得到的结果集。还可通过不用结果集的情况,由其不同的子类来实现。
    DbUtils:提供如关闭连接、装载JDBC驱动程序等常规工作的工具类。
    1)public static void close(…) throws java.sql.SQLException: DbUtils类提供了三个重载的关闭方法。该方法需要手动编码判断所提供的参数是不是NULL,如果不是的话,就关闭Connection、Statement和ResultSet。
    2)public static void closeQuietly(…): 这一类方法能在Connection、Statement和ResultSet为NULL情况下避免关闭,还能隐藏一些在程序中抛出的SQLEeception。

代码使用测试

1.导入支持的jar包(commons-dbutils-1.6.jar)

在这里插入图片描述

2.使用DBUtils对数据表进行CRUD操作

写法一使用带参数(DataSource)的QueryRunner构造器,可以通过在工具类(JDBCUtils.java)添加一个静态的获取数据源的方法,避免写重复代码

写法二使用QueryRunner默认的构造器时,执行CRUD操作带入的参数要有一个连接,连接的获取通过数据库连接池来获取数据库连接的工具类(JDBCUtils.java)来实现。

(JDBCUtils.java)

public class TestDBUtils {
	//测试增删改
	@Test
	public void testCUD() throws Exception{
		//得到数据库连接池
		Properties pros = new Properties();
		InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("druid.properties");
		pros.load(is);
		DataSource createDataSource = DruidDataSourceFactory.createDataSource(pros);
		
		//写法一:使用带参数(DataSource)的QueryRunner构造器,会从DataSource中自动获取连接
		QueryRunner queryRunner = new QueryRunner(createDataSource);
		
		//增
		String insertSql = "insert into t_students values(null,?,?,?)";
		int insertNum = queryRunner.update(insertSql,"123",18,"男");
		System.out.println("添加了" + insertNum + "条记录");
		
		//删
		String deleteSql = "delete from t_students where id=?";
		int  deleteNum = queryRunner.update(deleteSql,1);
		System.out.println("删除了" + deleteNum + "条记录");
		
		//改
		String updateSql = "update  t_students set name=? where id=?";
		int  updateNum = queryRunner.update(updateSql,"9999",8);
		System.out.println("更新了" + updateNum + "条记录");
		
		
//		//写法二:使用QueryRunner默认的构造器方法
//		QueryRunner queryRunner2 = new QueryRunner();
//		//需要获取用于运行增删改查的连接
//		Connection conn = JDBCUtils.getConnection1();
//		String insertSql = "insert into t_students values(null,?,?,?)";
//		//把连接带入增删改查的方法
//		int insertNum = queryRunner.update(conn,insertSql,"128",10,"男");
//		System.out.println("添加了" + insertNum + "条记录");
		
		
	}
	
	
	//测试查(使用ResultSetHandler接口的匿名实现类,自己封装)
	@Test
	public void testR() throws Exception{
		//得到数据库连接池
		Properties pros = new Properties();
		InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("druid.properties");
		pros.load(is);
		DataSource createDataSource = DruidDataSourceFactory.createDataSource(pros);
		//得到QueryRunner
		QueryRunner queryRunner = new QueryRunner(createDataSource);
		
		//查(使用ResultSetHandler接口的匿名实现类,自己封装)
		String selectSql = "select * from t_students where id=?";
		//执行查询,查询到的数据存放在ResultSet里面。 然后调用handle方法,自己手动去封装。
		Student student = queryRunner.query(selectSql, new ResultSetHandler<Student>(){
			@Override
			public Student handle(ResultSet rs) throws SQLException {
				Student student = new Student();
				while(rs.next()){
					int id = rs.getInt("id");
					String name = rs.getString("name");
					int age = rs.getInt("age");
					String sex = rs.getString("sex");
					
					student.setId(id);
					student.setName(name);
					student.setAge(age);
					student.setSex(sex);
				}
				return student;
			}
			
		},9);
		System.out.println(student.toString());
	}
	
	
	//测试查(使用ResultSetHandler接口的实现类,官方封装好了)
	@Test
	public void testR2() throws Exception{
			//得到数据库连接池
			Properties pros = new Properties();
			InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("druid.properties");
			pros.load(is);
			DataSource createDataSource = DruidDataSourceFactory.createDataSource(pros);
			//得到QueryRunner
			QueryRunner queryRunner = new QueryRunner(createDataSource);
			
			//查询单个对象(使用ResultSetHandler的实现类:BeanHandler)
			String selectSql = "select * from t_students where id=?";
			//BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
			//Student.class:通过类的字节码得到该类的实例(JavaBean)
			Student student = queryRunner.query(selectSql, new BeanHandler<Student>(Student.class), 8);
			System.out.println(student.toString());
			
			
			System.out.println("-----------------------------------------------------");
			
			
			//查询多个对象构成的集合(使用ResultSetHandler的实现类:BeanListHandler)
			String selectSql2 = "select id,name,age from t_students where id < ?";
			//BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。
			//Student.class:通过类的字节码得到该类的实例(JavaBean)
			List<Student> studentList = queryRunner.query(selectSql2, new BeanListHandler<>(Student.class), 8);
			for (Student student2 : studentList) {
				System.out.println(student2.toString());
			}
			
			
			System.out.println("------------------------------------------------------");
			
			
			//查询最大的,最小的,平均的,总和,个数相关的数据(使用ResultSetHandler的实现类:ScalarHandler)
			String selectSql3 = "select max(age) from t_students";
			//ScalarHandler:查询单个值对象	
			int maxAge = (int) queryRunner.query(selectSql3, new ScalarHandler());
			System.out.println("最大年龄:"+maxAge);
	}	
}

把DbUtils类提供的关闭连接与资源的相关操作封装到工具类(JDBCUtils.java)

一个较完整的JDBCUtils工具类

public class JDBCUtils {
	//使用C3P0的数据库连接池技术获取数据库连接
	private static ComboPooledDataSource comboPooledDataSource=new ComboPooledDataSource();
	public static Connection getConnection() throws SQLException{
		return comboPooledDataSource.getConnection();	
	}
	
	
	//使用Druid数据库连接池技术获取数据库连接
	private static DataSource createDataSource;
	static{
		try {
			Properties pros = new Properties();
			InputStream is = JDBCUtils.class.getResourceAsStream("/druid.properties");
			//InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("druid.properties");
			pros.load(is);
			createDataSource = DruidDataSourceFactory.createDataSource(pros);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
    //得到连接的方法
	public static Connection getConnection1() throws SQLException{
		return createDataSource.getConnection();	
	}
	//得到数据源的方法
	public static DataSource getDataSource() {
		return createDataSource;
	}


	
	//使用dbutils.jar中提供的DbUtils工具类,实现资源的关闭
	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);
	}

//实现资源的关闭的方法说明:
//public static void close(…) throws java.sql.SQLException: DbUtils类提供了三个重载的关闭方法。该方法需要手动编码判断所提供的参数是不是NULL,如果不是的话,就关闭Connection、Statement和ResultSet。
//public static void closeQuietly(…): 这一类方法能在Connection、Statement和ResultSet为NULL情况下避免关闭,还能隐藏一些在程序中抛出的SQLEeception。
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
commons-dbutils包是Apache开源组织提供的用于操作数据库的工具包。简单来讲,这个工具包就是用来更加方便我们操作数据库的,最近工作中使用了一下,感觉确实方便很多,基本告别自己封装JDBC代码对数据库进行增删改查了。代码看着也很简洁。 例如: 增删改查使用的类:QueryRunner类+ResultSetHandler类,使用这俩类就可以解决掉。 QueryRunner类的query()方法:new QueryRunner().query(Connection conn, String sql, ResultSetHandler rsh) query方法后面参数中加一个Connection连接,是在获取不到数据源的情况下,也就是说,QueryRunner的实例化构造函数使用无参的那个,下面我的实现代码就是用的这种方法。 当然还有一种实例化:new QueryRunner(new Datasource()).query(String sql, ResultSetHandler rsh) query方法中的参数 ResultSetHandler 参数中加上ResultSetHandler接口的实现类参数(下面这些实现类),执行完SQL后,返回的数据就是已经封装好的我们想要的结果了。 ArrayHandler :将ResultSet中第一行的数据转化成对象数组 ArrayListHandler将ResultSet中所有的数据转化成List,List中存放的是Object[] BeanHandler :将ResultSet中第一行的数据转化成Bean对象 BeanListHandler :将ResultSet中所有的数据转化成List ColumnListHandler :将ResultSet中某一列的数据存成List KeyedHandler :将ResultSet中存成映射,key为某一列对应为Map,Map中存放的是数据 MapHandler :将ResultSet中第一行的数据存成Map MapListHandler :将ResultSet中所有的数据存成List<Map> ScalarHandler :将ResultSet中一条记录的其中某一列的数据存成Object

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Thinking in Coder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值