一、DBUtils是什么?
DBUtils是一个对JDBC进行简单封装的开源工具类库。
二、其优点是什么?
对JDBC进行了简单封装,使用方便,提高开发效率。
三、DBUtils快速入门:
准备工作:
1、项目导入c3p0,DBUtils,mysql连接驱动的jar包,并配置c3p0。ps:不会配置c3p0的童鞋可以看这里:了解与学习c3p0。
2、新建表:
1 create table user( 2 uid int, 3 uname varchar(55), 4 upassword varchar(55) 5 );
3、在你的类中新建一个QueryRunnerl类的成员变量用于方便测试:
比如我的是这样子的:
1 package test; 2 3 import org.apache.commons.dbutils.QueryRunner; 4 5 public class Main { 6 public static QueryRunner qr = new QueryRunner(C3p0.getDataSource()); //传递c3p0连接池对象 7 }
四、使用DBUtils执行DML(增、删、改)操作:
1、添加数据:
1 public static void insert() throws SQLException { 2 String sql = "insert into user values(?,?,?)"; 3 int row = qr.update(sql,1001,"张三"); 4 if(row>0) { 5 System.out.println("执行操作成功!"); 6 }else { 7 System.out.println("执行操作失败!!!"); 8 } 9 }
查看控制台输出:
查看user表:
代码分析:主要使用到了QueryRunner中的update方法,第一个参数传递的是sql语句,第二个与其后的参数对应的是sql中的?占位符。
update返回的参数类型为int型,若返回的参数>0则表示操作成功。
另一种写法:
1 public static void insert() throws SQLException { 2 String sql = "insert into user values(?,?,?)"; 3 Object[] paramsArr = {1002,"李四","qwer1122"}; 4 int row = qr.update(sql,paramsArr); 5 if(row>0) { 6 System.out.println("执行操作成功!"); 7 }else { 8 System.out.println("执行操作失败!!!"); 9 } 10 }
查看控制台输出:
查看user表:
代码分析:
与第一种写法不同的是,update传递的的参数sql后面的参数变为一个类型为Object的对象数组,这个对象数组封装了要传递的参数。
你认为哪种方式更好呢?
2、删除数据:
1 public static void delete() throws SQLException { 2 String sql = "delete from user where uname = ?"; 3 int row = qr.update(sql,"张三"); 4 if(row>0) { 5 System.out.println("执行操作成功!"); 6 }else { 7 System.out.println("执行操作失败!!!"); 8 } 9 }
查看控制台输出:
查看user表:
代码分析:看了添加数据的操作,这里估计也能看懂了吧?滑稽.jpg
3、修改数据:
1 public static void update() throws SQLException { 2 String sql = "update user set uname=? where uid = ?"; 3 int row = qr.update(sql,"小天琪",1002); 4 if(row>0) { 5 System.out.println("执行操作成功!"); 6 }else { 7 System.out.println("执行操作失败!!!"); 8 } 9 }
直接查看user表:
代码分析:你懂的~~狗头.jpg保命。
五、使用DBUtils进行DQL(查询操作) 重点:
先向user表中添加几行数据:
1 insert into user values(1003,"王二","ew123"); 2 insert into user values(1004,"麻子","aab111"); 3 insert into user values(1005,"狗子","aac122");
查看一波user表:
1、第一种处理方式使用ArrayHandler(返回查询结果的第一行数据):
1 public static void dqlUseArrayHandler() throws SQLException { //查询结果为一个对象数组,存的是查询结果的第一行 2 String sql = "select * from user"; 3 Object[] resultsArr = qr.query(sql,new ArrayHandler()); 4 for(Object obj : resultsArr) { //遍历结果数组 5 System.out.print(obj+" "); 6 } 7 }
控制台输出:
2、第二种处理方式使用ArrayListHandler(返回一个存有对象数组的集合,对象数组存的是每行数据):
1 public static void dqlUseArrayListHandler() throws SQLException{ //查询结果为一个List集合,存的是对象数组,而对象数组存的是查询到的每行数据 2 String sql = "select * from user"; 3 List<Object[]> resultsArr = qr.query(sql,new ArrayListHandler()); 4 for(Object[] objArr : resultsArr) { //遍历结果 5 for(Object obj : objArr) { 6 System.out.print(obj+" "); 7 } 8 System.out.println(); 9 } 10 }
查看控制台输出:
3、使用BeanHandler(返回查询到的第一行数据封装为一个javaBean):
先创建一个javaBean,名称为:User.java。字段名与user表的字段一致。
我这里建的为:
1 package test; 2 3 public class User { 4 private int uid; 5 private String uname; 6 private String upassword; 7 public User() {} 8 public int getUid() { 9 return uid; 10 } 11 public void setUid(int uid) { 12 this.uid = uid; 13 } 14 public String getUname() { 15 return uname; 16 } 17 public void setUname(String uname) { 18 this.uname = uname; 19 } 20 public String getUpassword() { 21 return upassword; 22 } 23 public void setUpassword(String upassword) { 24 this.upassword = upassword; 25 } 26 @Override 27 public String toString() { 28 return "User [uid=" + uid + ", uname=" + uname + ", upassword=" + upassword + "]"; 29 } 30 31 }
ps:javaBean其实就是一个类,与普通类相比具有的特征:
- 提供一个默认的无参构造函数。
- 需要被序列化并且实现了 Serializable 接口。
- 可能有一系列可读写属性。
- 可能有一系列的 getter 或 setter 方法。
使用BeanHandler的查询处理方式:
1 public static void dqlUseBeanHandler() throws SQLException { //将查询结果的第一行数据封装为javaBean 2 String sql = "select * from user"; 3 User user = qr.query(sql,new BeanHandler<User>(User.class)); 4 System.out.println(user); 5 }
控制台输出:
4、第四种方式使用BeanListHandler(将查询结果封装为javaBean并存入到一个List集合中):
1 public static void dqlUseBeanListHandler() throws SQLException { //将所有的查询结果封装为javaBean,每个javaBean存入到一个list集合中 2 String sql = "select * from user"; 3 List<User> listUser = qr.query(sql,new BeanListHandler<User>(User.class)); 4 for(User user : listUser) { //遍历结果 5 System.out.println(user); 6 } 7 }
控制台输出:
5、第5种处理方式使用ColumnLIstHandler(传递一个列名,查询结果为该列下的所有数据,存入一个List集合中):
1 public static void dqlUseColumnListHandler() throws SQLException { //传递一个列名,查询结果为该列下的所有数据,存入一个List集合中 2 String sql = "select * from user"; 3 List<Object> listUser = qr.query(sql,new ColumnListHandler("uname")); 4 for(Object obj : listUser) { 5 System.out.println(obj); 6 } 7 }
控制台输出:
6、第6种方式使用ScalarHandler(查询结果只有一个):
1 public static void dqlUseScalarHandler() throws SQLException { //查询结果只有一个 2 String sql = "select count(*) from user"; 3 Object count = qr.query(sql,new ScalarHandler()); 4 System.out.println(count); 5 }
控制台输出:
7、第7种处理方式使用MapHandler(将查询第一条数据的列名与值存入一个Map集合):
1 public static void sqlUserMapHandler() throws SQLException { //查询结果的第一条数据存入一个map集合种 2 String sql = "select * from user"; 3 Map<String,Object> map = qr.query(sql,new MapHandler()); 4 for(String key : map.keySet()) { //遍历结果集 5 System.out.print(key + " "+map.get(key)+" "); 6 } 7 }
控制台输出:
8、第8种处理方式使用MapHandler(将查询到的结果存入一个map集合中):
1 public static void sqlUserMapListHandle() throws SQLException { //将查询到的所有结果的列名与对应的值存入map集合中,map过多存入list集合 2 String sql = "select * from user"; 3 List<Map<String,Object>> list = qr.query(sql,new MapListHandler()); 4 for(Map<String,Object> map : list) { //遍历集合 5 for(String key : map.keySet()) { 6 System.out.print(map.get(key) + " "); 7 } 8 System.out.println(" "); 9 } 10 }
控制台输出: