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。
}
发布了48 篇原创文章 · 获赞 18 · 访问量 2970

猜你喜欢

转载自blog.csdn.net/qq_45615417/article/details/104087577