DBUtils 的使用与踩坑记录

博主声明:

转载请在开头附加本文链接及作者信息,并标记为转载。本文由博主 威威喵 原创,请多支持与指教。

本文首发于此   博主:威威喵  |  博客主页:https://blog.csdn.net/smile_running

  • DBUtils工具包

    DBUtils是Apache组织提供的一个开源JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化JDBC编码的工作量,同时也不会影响程序的性能。

    QueryRunner类简单化了SQL查询,它与ResultSetHandler接口组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量。ResultSetHandler接口提供将数据按要求转换为另一种形式。

DBUtils 的使用与踩坑记录_第1张图片

一、常用实现类

1、BeanHandler

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

例如:

	@Test
	public void testBeanHandler() {
		QueryRunner queryRunner = new QueryRunner();
		Connection conn = null;
		try {
			conn = JdbcUtils.getConnectionForC3P0();
			String sql = "select username,password,register_time,sex,user_role,id_card from user where username=?";
			User user = queryRunner.query(conn, sql, new BeanHandler<>(User.class), "小王");
			System.out.println(user);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (conn != null) {
				JdbcUtils.release(null, conn, null);
			}
		}
	}

2、BeanListHandler

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

例如:

	@Test
	public void testBeanListHandler() {
		QueryRunner queryRunner = new QueryRunner();
		Connection conn = null;
		try {
			conn = JdbcUtils.getConnectionForC3P0();
			String sql = "select username,password,register_time,sex,user_role,id_card from user";
			List user = queryRunner.query(conn, sql, new BeanListHandler<>(User.class));
			System.out.println(user);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (conn != null) {
				JdbcUtils.release(null, conn, null);
			}
		}
	}

3、MapHandler

    将结果集中的第一行数据封装为一个Map

例如:

	@Test
	public void testMapHandler() {
		QueryRunner queryRunner = new QueryRunner();
		Connection conn = null;
		try {
			conn = JdbcUtils.getConnectionForC3P0();
			String sql = "select username,password,register_time,sex,user_role,id_card from user where username=?";
			Map user = queryRunner.query(conn, sql, new MapHandler(), "小王");
			System.out.println(user);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (conn != null) {
				JdbcUtils.release(null, conn, null);
			}
		}
	}

4、MapListHandler

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

例如:

	@Test
	public void testMapListHandler() {
		QueryRunner queryRunner = new QueryRunner();
		Connection conn = null;
		try {
			conn = JdbcUtils.getConnectionForC3P0();
			String sql = "select username,password,register_time,sex,user_role,id_card from user";
			List> user = queryRunner.query(conn, sql, new MapListHandler());
			System.out.println(user);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (conn != null) {
				JdbcUtils.release(null, conn, null);
			}
		}
	}

5、ScalarHandler

    将结果集中的单个值返回

例如:

	@Test
	public void testScalarHandler2() {
		QueryRunner queryRunner = new QueryRunner();
		Connection conn = null;
		try {
			conn = JdbcUtils.getConnectionForC3P0();
			String sql = "select register_time from user where id_card=?";
			Object register_time = queryRunner.query(conn, sql, new ScalarHandler(), "321...");
			System.out.println(register_time);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (conn != null) {
				JdbcUtils.release(null, conn, null);
			}
		}
	}

6、需注意的坑

    通过BeanHandler和BeanListHandler得到的结果集会有不存在(NULL)的情况,比如这种情况下就会导致NULL,图:

    出现这种情况的原因是:实体类(User)中的对应属性名与数据库的字段(列名)无法匹配,数据库的数据如下图:

DBUtils 的使用与踩坑记录_第2张图片

    其中register_time、user_role、id_card与类变量registerTime、userRole、idCard无法对应赋值,这也是BeanHandler的一种缺陷,而其它如MapHandler、ScalarHandler就不会出现这种情况。

    原因是:MapHandler、ScalarHandler的底层运用了反射来获取元数据的列名,所以它可以获取的到结果。

©原文链接:https://blog.csdn.net/smile_Running/article/details/87009755

©作者博客 ID:smile_running

你可能感兴趣的:(#,JavaEE,Java)