Java实战之04JavaWeb-06DBUtils
一、DBUtils
1.DBUtils的简介
Commons DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能。
2.DBUtils中的API的概要介绍
QueryRunner类:sql操作的核心类 这个对象内部封装着操作数据的方法
ResultSetHandler接口:代表结果集到实体的映射封装的功能
为什么是接口:具体封装的规则不知道 要根据实体业务进行自行操作
DButils类:主要是关于数据库的关闭 事务的提交相关的方法
3.QueryRunner的API详解
注意:在使用DBUtils之前 导入的jar包
1)数据库驱动
2)连接池的jar
3)DBUtils的jar
(1)怎样创建QueryRunner
有两种方式可以创建QueryRunner
第一种无参:new QueryRunner();
一般情况下 结合事务操作一起使用
第二种有参:new QueryRunner(DataSource);
一般情况下 不需要事务控制的时候使用
注意:程序中操作sql时 必须得有Connection对象,有数据源参数的构造方法会自动从数据源中获得一个Connection对象操作数据库。无参的构造方法在创建QueryRunner时没有提供Connection的对象信息,在指定操作sql的方法时也得传入Connection。
QueryRunner中的方法
batch
update
query
(2)更新数据的操作(单条sql执行)
update操作:
update方法有三个参数 是通过这三个参数的组合 形成多个方法
Connection:数据库的连接对象 与无参的new QueryRunner()一起使用
sql:要执行sql语句 是必须有的
params:代笔占位符的实际的参数
通过上述参数可以组成哪些方法
update(Connection,sql,params);
update(Connection,sql);
update(sql,params);
update(sql);
1 @Test 2 public void test1() throws SQLException{ 3 //需求:修改products表中的id=100的商品的category为 生活 4 //1、创建QueryRunner 5 QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource()); 6 //2、执行sql 7 String sql = "update products set category=? where id=?"; 8 int update = runner.update(sql, "生活","100"); 9 System.out.println(update); 10 }
(3)更新数据的操(批量sql执行)
batch操作---同时执行sql结构相同的多条语句
参数:
Connection:数据库的连接对象 与无参的new QueryRunner()一起使用
sql:要执行sql语句 是必须有的
params:二维数组
一维代表是指定的sql
二维代表sql中的占位符的实际参数
例如:
sql:insert into products values(?,?,?);
param:
{
{500,ios入门,15},
{600,C#入门,28},
{700,ruby入门,45},
{800,hadoop入门,99}
}
insert语句执行几次:4次 每一次执行3个参数
需求:向products表中批量插入2条数据
1 //1、创建QueryRunner对象 2 QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource()); 3 //2、执行sql 4 String sql = "insert into products values(?,?,?,?,?,?,?)"; 5 //Object[][] params = new Object[2][7]; 6 //params[0][0]="500"; 7 Object[][] params = { 8 {"500","ruby入门",89,"感性",800,"bookcover/105.jpg","好书啊好书"}, 9 {"600","hadoop入门",89,"感性",800,"bookcover/106.jpg","好书啊好书"} 10 }; 11 int[] batch = runner.batch(sql, params); 12 //{1,1} 13 for(int i:batch){ 14 System.out.println(i); 15 }
(4)查询的操作query
query方法执行select语句
参数:
Connection:数据库的连接对象 与无参的new QueryRunner()一起使用
sql:要执行sql语句 是必须有的
params:代笔占位符的实际的参数
ResultSetHandelr:结果集封装的功能
1 @Test 2 public void test1() throws SQLException{ 3 //1、创建QueryRunner 4 QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource()); 5 //2、执行sql语句 6 String sql = "select * from products"; 7 List<Product> query = runner.query(sql, new ResultSetHandler<List<Product>>() { 8 @Override 9 public List<Product> handle(ResultSet rs) throws SQLException { 10 //写自己的封装的逻辑 11 List<Product> list = new ArrayList<Product>(); 12 while(rs.next()){ 13 Product pro = new Product(); 14 pro.setId(rs.getString("id")); 15 pro.setName(rs.getString("name")); 16 pro.setCategory(rs.getString("category")); 17 pro.setDescription(rs.getString("description")); 18 pro.setImgurl(rs.getString("imgurl")); 19 pro.setPnum(rs.getInt("pnum")); 20 pro.setPrice(rs.getDouble("price")); 21 list.add(pro); 22 } 23 return list; 24 } 25 26 }); 27 28 System.out.println(query); 29 }
二、ResultSetHandler接口的实现类
BeanListHandler:返回是List<T>
BeanHandler:返回的是T
MapListHandler:返回是List<Map<String,Object>>
MapHandler:返回是Map<String,Object>
ScalarHandler:返回的是一个object获得的是一个值 是查出的虚拟表的左上角的 值,常用在聚合函数查询中
---------------------------------------------------------------
ArrayListHandler:List<Object[]>
ArrayHandler:Object[]
ColumnListHandler:List<Object> 查询的是结构的某一列的数据集合
KeyedHandler:返回值Map<Object,Map<String,Object>>
{
200={id=200, category=生活, price=78.0, pnum=120, description=好书一本, name=android入门经典, imgurl=bookcover/102.jpg},
100={id=100, category=生活, price=88.0, pnum=100, description=好书一本, name=java入门经典, imgurl=bookcover/101.jpg}
}
DbUtils工具类:工具类,包括事务的提交,回滚和资源的关闭的工具方法,使用不多