28、jdbc操作数据库(5)

版权声明:chaizepeng https://blog.csdn.net/chaizepeng/article/details/86693805

介绍一个稍微封装了jdbc的工具类org.apache.commons.dbutils,使用dbutils可以简化对数据库操作程序的开发。

API介绍

接下来通过实例的方式说一下dbutils的具体使用

添加jar包:commons-dbutils-1.7.jar

增、删、改

进行增、删、改操作,在这里(未使用数据源)只需传入数据库连接、sql、占位符值到update方法中即可完成操作。代码如下:

public static void main(String[] args) {
	//可以直接传入一个数据源,这里不适用连接池做实例
	QueryRunner queryRunner = new QueryRunner();
	
	Connection connection = null;
	//进行增、删、改操作,在这里只需传入数据库连接、sql、占位符值到update方法中即可完成操作
	try {
		connection = DBUtil.getConnection();
		//添加
		String sql1 = "INSERT INTO USER (uname,password) VALUES (? , ?)";
		Object []obj1= {"xiaopeng","123456"};
		int update1 = queryRunner.update(connection,sql1, obj1);
		System.out.println("添加成功:"+update1);
		
		//修改
		String sql2 = "UPDATE USER SET UNAME = ? WHERE ID = ?";
		Object []obj2 = {"xiaopeng",20005};
		int update2 = queryRunner.update(connection, sql2, obj2);
		System.out.println("修改成功:"+update2);
		
		//删除
		String sql3 = "DELETE FROM USER WHERE ID = ?";
		int update3 = queryRunner.update(connection,sql3,20004);
		System.out.println("删除成功:"+update3);
	} catch (SQLException e) {
		e.printStackTrace();
	}finally {
		if (connection != null) {
			try {
				connection.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}

查询

使用dbutils进行查询时,需要了解如下几个类,他们用于将查询结果进行封装:

BeanListHandler:用于将结果集转成一个List集合,其泛型可用户自定义

public static void main(String[] args) {
	//可以直接传入一个数据源,这里不适用连接池做实例
	QueryRunner queryRunner = new QueryRunner();
	Connection connection = null;
	connection = DBUtil.getConnection();
	String sql = "SELECT UNAME ,PASSWORD  FROM USER LIMIT 3";
	try {
		
		List<User> list = queryRunner.query(connection, sql, new BeanListHandler<>(User.class));
		System.out.println(list);
	} catch (SQLException e) {
		e.printStackTrace();
	}
	
}

BeanHandler:用于将结果封装成一个实体,用于返回一个结果的场景

public static void main(String[] args) {
	//可以直接传入一个数据源,这里不适用连接池做实例
	QueryRunner queryRunner = new QueryRunner();
	Connection connection = null;
	connection = DBUtil.getConnection();
	String sql = "SELECT UNAME ,PASSWORD  FROM USER WHERE ID = 4";
	try {
		//注意:这个地方一定要用实现类,否则容易报错
		User user = queryRunner.query(connection, sql, new BeanHandler<>(User.class));
		System.out.println(user);
	} catch (SQLException e) {
		e.printStackTrace();
	}
}

MapHandler:用于将返回的一个结果集封装成一个Map集合,用于返回一条结果集的场景

public static void main(String[] args) {
	//可以直接传入一个数据源,这里不适用连接池做实例
	QueryRunner queryRunner = new QueryRunner();
	Connection connection = null;
	connection = DBUtil.getConnection();
	String sql = "SELECT UNAME ,PASSWORD  FROM USER WHERE ID = 4";
	try {
		Map<String, Object> map = queryRunner.query(connection, sql, new MapHandler());
		System.out.println(map);
	} catch (SQLException e) {
		e.printStackTrace();
	}
}

MapListHandler:用于将返回的结果集封装成一个List集合,每一条记录信息封装到一个Map集合中

public static void main(String[] args) {
	//可以直接传入一个数据源,这里不适用连接池做实例
	QueryRunner queryRunner = new QueryRunner();
	Connection connection = null;
	connection = DBUtil.getConnection();
	String sql = "SELECT UNAME ,PASSWORD  FROM USER LIMIT 10";
	try {
		List<Map<String, Object>> list = queryRunner.query(connection, sql, new MapListHandler());
		System.out.println(list);
	} catch (SQLException e) {
		e.printStackTrace();
	}
}

基本实现原理:这几个封装类都实现了ResultSetHandler接口,然后根据不同的类型对应实现ResultSetHandler接口中的handle方法以实现结果集的封装,封装时最终都调用的是类BeanProcessor中的方法,具体封装过程可看源码

public interface ResultSetHandler<T> {

    T handle(ResultSet rs) throws SQLException;

}

猜你喜欢

转载自blog.csdn.net/chaizepeng/article/details/86693805