DBUtils框架及其使用

    xiaoxiao2021-03-25  126

    commons-dbutils 是 Apache提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,能极大简化jdbc编码的工作量

    API

    QueryRunner//简化SQL查询 ResultSetHandler//将数据按要求转换为另一种形式 DbUtils//工具类,关闭连接、装载JDBC驱动程序 //method public Object query(Connection conn, String sql, Object[] params, ResultSetHandler rsh) //查询,对象数组中的每个元素值被用来作为查询语句的置换参数(占位符)。自行处理PreparedStatement 和 ResultSet 的创建和关闭 public Object query(String sql, Object[] params, ResultSetHandler rsh) //从提供给构造方法的数据源或使用的setDataSource 方法中重新获得 Connection。 public Object query(Connection conn, String sql, ResultSetHandler rsh) //执行一个不需要置换参数的查询操作。 public int update(Connection conn, String sql, Object[] params) //用来执行一个更新(插入、更新或删除)操作。 public int update(Connection conn, String sql) //用来执行一个不需要置换参数的更新操作。

    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

    创建一个DBUtils

    public class MyDBCPUtils { //数据源 运行程序的时候直接加载 private static DataSource ds; public static DataSource getDs() { return ds; } static { try { //加载配置文件 InputStream in = MyDBCPUtils.class.getClassLoader().getResourceAsStream("dbcpconfig.properties"); Properties prop = new Properties(); prop.load(in); // 框架提供的数据源 BasicDataSourceFactory factory = new BasicDataSourceFactory(); ds = factory.createDataSource(prop); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } //创建连接 public static Connection getConnection() throws SQLException { return ds.getConnection(); // 返回一个被包装过的connection,所以用户可以直接关掉。关掉其实就是放回连接池了。 } //释放资源 public static void releaseResource(Statement st, ResultSet rs, Connection conn) { if (st != null) { try { st.close(); } catch (SQLException e) { e.printStackTrace(); } } if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }

    加载配置文件dbcpconfig.prop

    #连接设置 driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/mytest username=root password=123456 #<!-- 初始化连接 --> initialSize=10 #最大连接数量 maxActive=50 #<!-- 最大空闲连接 --> maxIdle=20 #<!-- 最小空闲连接 --> minIdle=5 #<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 --> maxWait=60000 #JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;] #注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。 connectionProperties=useUnicode=true;characterEncoding=utf8 #指定由连接池所创建的连接的自动提交(auto-commit)状态。 defaultAutoCommit=true #driver default 指定由连接池所创建的连接的只读(read-only)状态。 #如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix) defaultReadOnly= #driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。 #可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE defaultTransactionIsolation=REPEATABLE_READ

    新建一个JavaBean存放每一条记录

    public class User { private String username; private String password; private String email; private String headimg; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public User() { super(); // TODO Auto-generated constructor stub } public String getHeadimg() { return headimg; } public void setHeadimg(String headimg) { this.headimg = headimg; } public User(String username, String password, String email, String headimg) { super(); this.username = username; this.password = password; this.email = email; this.headimg = headimg; } @Override public String toString() { return "User [username=" + username + ", password=" + password + ", email=" + email + ", headimg=" + headimg + "]"; } }

    QueryRunner和ResultHandler怎么用?

    //2步 QueryRunner queryRunner = new QueryRunner(MyDBCPUtils.getDs());//传入数据源,构造QueryRunner类 List<User> userlist = queryRunner.query("select * from user;", new BeanListHandler<User>(User.class) ); List<User> userlist = queryRunner.query("select * from user where username = ?;", new BeanListHandler<User>(User.class) , "aa"); int update = queryRunner.update("insert into user values(?,?,?,?)","gg","gg","gg@163.com","me.jpg"); //1.传入数据源创建 QueryRunner runner = new QueryRunner(MyDBCPUtils.getDs()); /ArrayHandler把结果集中的第一行的所有列的数据转成对象数组。不止一行的情况只取第一行 Object[] array = runner.query("select * from user;", new ArrayHandler()); ArrayListHandler:把结果集中的每一行数据都转成一个数组,再存放到List中 List<Object[]> list = runner.query("select * from user;", new ArrayListHandler()); ///BeanHandler将结果集中的第一行数据封装到一个对应的JavaBean实例中,它的成员跟表里的列名一致 User user = runner.query("select * from user where username = ?;", new BeanHandler<User>(User.class),"kk"); //BeanListHandler将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里 List<User> list = runner.query("select * from user;", new BeanListHandler<User>(User.class)); //ColumnListHandler:将结果集中某一列的数据存放到List中。 List<Object> query = runner.query("select * from user;", new ColumnListHandler(1)); // KeyedHandler(name)将结果集中的每一行数据都封装到一个Map<列名,列值>里,再把这些map再存到一个map里,其key为指定的key Map<Object, Map<String, Object>> queryMap = runner.query("select * from user;", new KeyedHandler("username")); //MapHandler将结果集中的第一行数据封装到一个Map里,key是列名,value是对应的数据 Map<String, Object> query = runner.query("select * from user;", new MapHandler()); //MapListHandler将表中的每一行数据都封装到一个Map里,然后再存放到List List<Map<String, Object>> query = runner.query("select * from user;", new MapListHandler()); //ScalarHandler只取某一行一列(一个单元格的数据) Object query = runner.query("select count(*) from user;", new ScalarHandler(1));
    转载请注明原文地址: https://ju.6miu.com/read-7333.html

    最新回复(0)