问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

dbutils jar 可以用于hive吗

发布网友 发布时间:2022-05-01 05:34

我来回答

2个回答

懂视网 时间:2022-05-01 09:55

,能够大大减少编码量。

  QueryRunner类提供了两个构造方法:

    默认的构造方法
    需要一个 javax.sql.DataSource 来作参数的构造方法。

	/**
	 * 测试 QueryRunner 类的 update 方法
	 * 该方法可用于 INSERT, UPDATE 和 DELETE
	 */
	@Test
	public void testQueryRunnerUpdate() {
		//1. 创建 QueryRunner 的实现类
		QueryRunner queryRunner = new QueryRunner();
		
		String sql = "DELETE FROM customers " +
				"WHERE id IN (?,?)";		
		Connection connection = null;		
		try {
			connection = JDBCTools.getConnection();
			//2. 使用其 update 方法
			queryRunner.update(connection, 
					sql, 12, 13);
		} catch (Exception e) {
			e.printStackTrace();
		} finally{
			JDBCTools.releaseDB(null, null, connection);
		}		
	}

 ResultSetHandler接口

  该接口用于处理 java.sql.ResultSet,将数据按要求转换为另一种形式。

  ResultSetHandler 接口提供了一个单独的方法:Object handle (java.sql.ResultSet .rs)。

ResultSetHandler 接口的实现类

ArrayHandler:把结果集中的第一行数据转成对象数组。
ArrayListHandler:把结果集中的每一行数据都转成一个数组,再存放到List中。
BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。

ColumnListHandler:将结果集中某一列的数据存放到List中。
KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里,再把这些map再存到一个map里,其key为指定的key。
MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List
	/**
	 * 测试 QueryRunner 的 query 方法
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	@Test
	public void testResultSetHandler(){
		String sql = "SELECT id, name, email, birth " +
				"FROM customers";
		
		//1. 创建 QueryRunner 对象
		QueryRunner queryRunner = new QueryRunner();		
		Connection conn = null;		
		try {
			conn = JDBCTools.getConnection();
			/**
			 * 2. 调用 query 方法:
			 * ResultSetHandler 参数的作用: query 方法的返回值直接取决于 
			 * ResultSetHandler 的 hanlde(ResultSet rs) 是如何实现的. 实际上, 在
			 * QueryRunner 类的 query 方法中也是调用了 ResultSetHandler 的 handle()
			 * 方法作为返回值的。
			 */
			Object object = queryRunner.query(conn, sql, 
					new ResultSetHandler(){
						@Override
						public Object handle(ResultSet rs) throws SQLException {
							List<Customer> customers = new ArrayList<>();
							
							while(rs.next()){
								int id = rs.getInt(1);
								String name = rs.getString(2);
								String email = rs.getString(3);
								Date birth = rs.getDate(4);
								
								Customer customer = 
										new Customer(id, name, email, birth);
								customers.add(customer);
							}							
							return customers;
						}
					}			
					);				
			System.out.println(object); 
		} catch (Exception e) {
			e.printStackTrace();
		} finally{
			JDBCTools.releaseDB(null, null, conn);
		}
	}
	/**
	 * 测试 ResultSetHandler 的 BeanListHandler 实现类
    * 当数据库列名和DAO中实体类属性不同时,要用别名使其一致
	 * BeanListHandler: 把结果集转为一个 Bean 的 List. 该 Bean的类型在创建 BeanListHandler 对象时传入:
	 * new BeanListHandler<>(Customer.class)
	 */
 Object object = queryRunner.query(conn, sql, new BeanListHandler<>(Customer.class),4);

 

	/**
	 * 1. ResultSetHandler 的作用: QueryRunner 的 query 方法的返回值最终取决于
	 * query 方法的 ResultHandler 参数的 hanlde 方法的返回值. 
	 * 
	 * 2. BeanListHandler: 把结果集转为一个 Bean 的 List, 并返回. Bean 的类型在
	 * 创建 BeanListHanlder 对象时以 Class 对象的方式传入. 可以适应列的别名来映射 
	 * JavaBean 的属性名: 
	 * String sql = "SELECT id, name customerName, email, birth " +
	 *			"FROM customers WHERE id = ?";
	 * 
	 * BeanListHandler(Class<T> type)
	 * 
	 * 3. BeanHandler: 把结果集转为一个 Bean, 并返回. Bean 的类型在创建 BeanHandler
	 * 对象时以 Class 对象的方式传入
	 * BeanHandler(Class<T> type) 
	 * 
	 * 4. MapHandler: 把结果集转为一个 Map 对象, 并返回. 若结果集中有多条记录, 仅返回
	 * 第一条记录对应的 Map 对象. Map 的键: 列名(而非列的别名), 值: 列的值
	 * 
	 * 5. MapListHandler: 把结果集转为一个 Map 对象的集合, 并返回. 
	 * Map 的键: 列名(而非列的别名), 值: 列的值
	 * 
	 * 6. ScalarHandler: 可以返回指定列的一个值或返回一个统计函数的值. 
	 */

 使用DBUtils 编写通用的DAO接口,及其实现类

DAO.java

/**
 * 访问数据的 DAO 接口. 
 * 里边定义好访问数据表的各种方法
 * @param T: DAO 处理的实体类的类型. 
 */
public interface DAO<T> {

	/**
	 * 批量处理的方法
	 * @param connection
	 * @param sql
	 * @param args: 填充占位符的 Object [] 类型的可变参数.
	 * @throws SQLException 
	 */ 
	void batch(Connection connection, 
			String sql, Object [] ... args) throws SQLException;
	
	/**
	 * 返回具体的一个值, 例如总人数, 平均工资, 某一个人的 email 等.
	 * @param connection
	 * @param sql
	 * @param args
	 * @return
	 * @throws SQLException 
	 */
	<E> E getForValue(Connection connection,
			String sql, Object ... args) throws SQLException;
	
	/**
	 * 返回 T 的一个集合
	 * @param connection
	 * @param sql
	 * @param args
	 * @return
	 * @throws SQLException 
	 */
	List<T> getForList(Connection connection,
			String sql, Object ... args) throws SQLException;
	
	/**
	 * 返回一个 T 的对象
	 * @param connection
	 * @param sql
	 * @param args
	 * @return
	 * @throws SQLException 
	 */
	T get(Connection connection, String sql, 
			Object ... args) throws SQLException;
	
	/**
	 * INSRET, UPDATE, DELETE
	 * @param connection: 数据库连接
	 * @param sql: SQL 语句
	 * @param args: 填充占位符的可变参数.
	 * @throws SQLException 
	 */
	void update(Connection connection, String sql, 
			Object ... args) throws SQLException;

}

 JdbcDAOImpl.java

/**
 * 使用 QueryRunner 提供其具体的实现
 * @param <T>: 子类需传入的泛型类型. 
 */
public class JdbcDaoImpl<T> implements DAO<T> {

	private QueryRunner queryRunner = null;
	private Class<T> type;
	
	public JdbcDaoImpl() {
		queryRunner = new QueryRunner();
		type = ReflectionUtils.getSuperGenericType(getClass());
	}
	
	@Override
	public void batch(Connection connection, String sql, Object[]... args) throws SQLException {
		queryRunner.batch(connection, sql, args);
	}

	@Override
	public <E> E getForValue(Connection connection, String sql, Object... args) throws SQLException {
		return (E) queryRunner.query(connection, sql, new ScalarHandler(), args);
	}

	@Override 
	public List<T> getForList(Connection connection, String sql, Object... args) throws SQLException {
		return queryRunner.query(connection, sql, new BeanListHandler<>(type), args);
	}

	@Override
	public T get(Connection connection, String sql, Object... args) throws SQLException { 
		return queryRunner.query(connection, sql, new BeanHandler<>(type), args);
	}

	@Override
	public void update(Connection connection, String sql, Object... args) throws SQLException {
		queryRunner.update(connection, sql, args);
	}
	
}

 

Apache—DBUtils

标签:

热心网友 时间:2022-05-01 07:03

我反正用apache的dbutils连不上hive
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果手机微信怎么换漂亮字体(苹果手机微信怎么换行输入) 有什么好用的app转换字体 手写转文字的软件 erp可以看评论地址吗 淘宝评论url是什么意思? 揭秘:码牌支付风控升级,背后真相揭秘 电脑电视直播软件哪个好用什么软件好电脑看电视直播 潼南子同街学区是哪些 三极管BU406价格和参数? 火锅料放在冰柜忘了插电一个星期给会坏了吗 火锅的设备有哪些 梦见去朋友店里,看见一条小狗特别喜欢,小狗也喜欢我,就抱回来养? 梦见一只白色的小狗,干干净净的很可爱,在梦里好像是家里要养这只小狗,请问是什么寓意呢 西递宏村有什么好玩的么?周末双休准备跟旅游团去。400多,近500的样子,贵了吗? 宝宝两岁了,老喜欢扔东西,怎么办 两岁的孩子不听话,摔东西,应该怎么教育? 孩子喜欢扔东西,可能是在进行探索,家长可以适当配合,你怎么看? 宝宝快2岁半了,最近特别喜欢故意扔东西怎么引导 孩子两岁多了,但平时还是总爱乱扔东西应该怎么办? 两岁孩子“扔东西”能锻炼什么?父母该怎样正确引导? 2岁小朋友爱扔东西,家长该怎么办? 2岁的宝宝为什么经常发脾气,还喜欢扔东西打人? 两岁宝宝突然特别喜欢扔东西,该如何应对? QQ在进程后台但是打不开? 腾讯qq打不开 qq最近打不开了(程序没有响应)我重下了一个,为何显示qq正在运行中? 我一不小心关了QQ的进程了、、结果QQ打不开了,怎么办? qq打不开,进程里也没有 QQ双击打不开任务管理器也没有进程 重下了N遍 源文件也删了很多次 我的qq打不开了 进程也结束不了 重装也不管用 那位大侠出来帮帮我啊... qq打不开的问题,进程不能结束!求高手指点! 快速开宫口的方法 性行为时女性子宫口会开吗? 怎样才能打开宫颈口 怎样人为干预让宫口快点开 开宫口下面是什么感觉? 怎样才能插入宫颈口 如何扩张宫颈口 给女人开宫是啥意思? 扩宫是什么意思对子宫有伤害吗 预产期到了宫口不开怎么办 女生19岁,避孕套塞到子宫里可以灌水把肚子撑的鼓起来吗? 宫口开着是怎么回事 买卖股票用哪个银行好 相机的内置闪光灯有用吗?要不要单独买闪光灯? 炒股用哪家银行最好 单反相机外接闪光灯 有用吗 单反外置闪光灯拍摄人物用处很大吗? 单反相机的外置闪光灯作用大吗?有必要买吗/ 单反加外置闪光灯有什么好处 白天外面单反开闪光灯,有必要吗?