1、什么是DbUtils?
Commons DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能。
2、DbUtils出现的前提。
1、原生jbdc开发步骤多, 代码复杂度高,jdbc的代码关联性强,前后步骤固定。
2、原生jdbc中对于查询结果集的封装过于繁琐,支持不友好
3、Dbutils中的核心对象
1)、QueryRunner对象,替换了原生的jdbc中的语句平台,支持?的绑定数据,可以有效的防止sql的注入
2)、ResultSetHandler,这个借口专门用于封装查询结果!提供了八大实现类,用于封装各种类型的查询结果(对于单行单列,单列多行等,都提供了封装的实现类)
3)、DbUtils,主要是用来释放资源,处理事务。
4、DbUtils的使用
2、创建工程 将jar包 add to build path
3、使用DbUtils完成对于数据库的增删改查。
步骤:1、 创建数据库的连接 Connection connection = JDBCUtils.getConnection();
2、 创建QueryRunner对象 QueryRunner qRunner = new QueryRunner();
此对象替换了Statement 以及 PreparedStatement
3、 使用QueryRunner对象执行sql语句 QueryRunner对象在执行增删改时,执行的方法都是update()
update()方法的返回值为整型数字,代表sql语句影响的数据行数 1、 update(connection, sql) 传递连接对象,以及sql语句,此时的sql中没有?
例子 (增加操作)
Object[] objs = {"王二驴子", "456", "女"};
int row = qRunner.update(connection, "insert into user values (null, ?, ?, ?)", objs);*/
第一种:直接传数组,sql语句中有几个?,那么数组中就有几个元素,而且?上的数据类型一定要与数组对应元素的类型一致
2、 update(connection, sql, Object...) 此时的sql语句中可以使用?绑定数据,只需要在sql语句 后,指定数据即可
int row = qRunner.update(connection, "insert into user values (null, ?, ?, ?)",
"张三麻子", "888", "妖");
第二种:将需要绑定的?数据,挨着写在sql语句后面,以逗号隔开,此时依旧需要注意
类型顺序与数量要与?一致!
4、 处理结果 System.out.println(row > 0 ? "添加成功" : "添加失败");
5、 释放资源 DbUtils.close(connection);
5、修改,删除操作 ,跟增加的操作相似,内容跟上面的一样
修改操作:
public static void updateDemo() {
Connection connection = JDBCUtils.getConnection();
QueryRunner qRunner = new QueryRunner();
try {
int row = qRunner.update(connection, "update user set pwd = ? where uid = ?", "789", 5);
System.out.println(row > 0 ? "修改成功" : "修改失败");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
DbUtils.close(connection);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
6、 删除操作
//使用DbUtils完成删除操作
public static void deleteDemo() {
Connection connection = JDBCUtils.getConnection();
QueryRunner qRunner = new QueryRunner();
try {
int row = qRunner.update(connection, "delete from user where uid = ?", 8);
System.out.println(row > 0 ? "删除成功" : "删除失败");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
DbUtils.close(connection);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
7、查询操作: 使用query
1)、ResultSetHandler 此接口是DbUtils专门用于封装结果集的对象
2)、
ArrayHandler |
将结果集中的第一条记录封装到一个Object[]数组中,数组中的每一个元素就是这条记录中的每一个字段的值 |
ArrayListHandler |
将结果集中的每一条记录都封装到一个Object[]数组中,将这些数组在封装到List集合中。 |
BeanHandler |
将结果集中第一条记录封装到一个指定的javaBean中。 |
BeanListHandler |
将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中 |
ColumnListHandler |
将结果集中指定的列的字段值,封装到一个List集合中 |
ScalarHandler |
它是用于单数据。例如select count(*) from 表操作。 |
MapHandler |
将结果集第一行封装到Map集合中,Key 列名, Value 该列数据 |
MapListHandler |
将结果集每一行封装到Map集合中,Key 列名, Value 该列数据,Map集合存储到List集合 |
其中主要的几个为BeanHandler,BeanListHandler,ScalarHandler 分别是一条记录,每条记录,和单个数据的封装
8、javaBean是类的设计规范,与反射联用,为了保证类对象的创建以及赋值成功,要求类必须存在以下的内容
1、类使用public修饰,公开
2、属性私有化,使用private修饰
3、为私有属性提供对应的setter,getter方法,方便取值和赋值
4、必须保证类中的无参数构造方法的存在
9、多态的分类:继承多态、接口多态
继承多态:父类引用指向子类对象 Animal animal = new Dog();
接口多态:接口的引用指向了实现了此接口类的对象 Test t = new Person();
query(connection, sql, 结果集) 此方法中的sql语句不能书写?
query(connection, sql, 结果集, 可变参数) 此方法中的sql支持?绑定数据
query()方法的返回值具体是什么类型,取决于参数中结果集使用哪一个!!!
10、结果集使用BeanHandler时,传入了一个类.class,此时用到了反射,反射此时做了以下的操作
1、反射找到类中的无参数构造方法,创建了对象!
2、通过反射找到了类中的setter方法,为对象的属性完成了赋值(赋值的内容就是表中字段的值)
所以一定要注意,使用的时候
1、一定要保证无参数构造方法的存在
2、为了保证属性的赋值的成功,需要属性名与表中的字段名一致。
User user = qRunner.query(connection, "select * from user where uid = ?",new BeanHandler
3、BeanListHandler 的使用,对于多行多列数据的封装到list集合去
/*
BeanListHandler 将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中
*/
public static void beanListHandlerDemo() {
Connection connection = JDBCUtils.getConnection();
QueryRunner qRunner = new QueryRunner();
try {
List users = qRunner.query(connection, "select * from user",
new BeanListHandler(User.class));
for (User user : users) {
System.out.println(user);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
DbUtils.close(connection);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}