1、概述
(1)如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC开发,本案例我们讲采用apache commons组件一个成员:DBUtils ;
(2)DBUtils就是JDBC的简化开发工具包。需要项目导入commons-dbutils-1.6.jar才能够正常使用DBUtils工具。
(3)commons-dbutils-1.6-bin.zip 链接:commons-dbutils-1.6-bin.zip 密码:r1z4 ;
(4)DBUtils是java编程中的数据库操作实用工具,小巧简单实用;
(5)DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码;
(6)Dbutils三个核心功能介绍:
①QueryRunner中提供对sql语句操作的API;
②ResultSetHandler接口,用于定义select操作后,怎样封装结果集;
③DbUtils类,它就是一个工具类,定义了关闭资源与事务处理的方法。
2、QueryRunner核心类
(1)update(Connection conn, String sql, Object... params) ,用来完成表数据的增加、删除、更新操作;
(2)query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) ,用来完成表数据的查询操作。
3、QueryRunner实现添加、更新、删除操作
(1)update(Connection conn, String sql, Object... params) ,用来完成表数据的增加、删除、更新操作;
(2)添加
1 import java.sql.Connection; 2 import java.sql.SQLException; 3 4 import org.apache.commons.dbutils.QueryRunner; 5 6 public class TestDBUtils { 7 public static void main(String[] args) { 8 try { 9 // 获取一个用来执行SQL语句的对象 QueryRunner 10 QueryRunner qr = new QueryRunner(); 11 12 String sql = "INSERT INTO sort(sname) VALUES(?)"; 13 Object[] params = { "电视机" }; 14 Connection conn = JDBCUtils.getConnection(); 15 int line = qr.update(conn, sql, params);// 用来完成表数据的增加、删除、更新操作 16 // 结果集处理 17 System.out.println("line = " + line); 18 19 } catch (SQLException e) { 20 throw new RuntimeException(e); 21 } 22 23 } 24 25 }
(3)更新
1 import java.sql.Connection; 2 import java.sql.SQLException; 3 4 import org.apache.commons.dbutils.QueryRunner; 5 6 public class TestDBUtils { 7 public static void main(String[] args) { 8 try { 9 // 获取一个用来执行SQL语句的对象 QueryRunner 10 QueryRunner qr = new QueryRunner(); 11 12 String sql = "UPDATE sort set sid=sid+1 WHERE sname=?"; 13 Object[] params = { "电视机" }; 14 Connection conn = JDBCUtils.getConnection(); 15 int line = qr.update(conn, sql, params);// 用来完成表数据的增加、删除、更新操作 16 // 结果集处理 17 System.out.println("line = " + line); 18 19 } catch (SQLException e) { 20 throw new RuntimeException(e); 21 } 22 23 } 24 25 }
(4)删除
1 import java.sql.Connection; 2 import java.sql.SQLException; 3 4 import org.apache.commons.dbutils.QueryRunner; 5 6 public class TestDBUtils { 7 public static void main(String[] args) { 8 try { 9 // 获取一个用来执行SQL语句的对象 QueryRunner 10 QueryRunner qr = new QueryRunner(); 11 12 String sql = "DELETE FROM sort WHERE sname=?"; 13 Object[] params = { "电视机" }; 14 Connection conn = JDBCUtils.getConnection(); 15 int line = qr.update(conn, sql, params);// 用来完成表数据的增加、删除、更新操作 16 // 结果集处理 17 System.out.println("line = " + line); 18 19 } catch (SQLException e) { 20 throw new RuntimeException(e); 21 } 22 23 } 24 25 }
4、QueryRunner实现查询操作
(1)query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) ,用来完成表数据的查询操作;
(2)ResultSetHandler结果集处理类
(3)JavaBean
JavaBean就是一个类,在开发中常用封装数据。具有如下特性:
①需要实现接口:java.io.Serializable ,通常实现接口这步骤省略了,不会影响程序;
②提供私有字段:private 类型 字段名;
③提供getter/setter方法;
④提供无参构造。
1 public class Sort { 2 private int sid; 3 private String sname; 4 5 public Sort() { 6 super(); 7 } 8 9 public int getSid() { 10 return sid; 11 } 12 13 public void setSid(int sid) { 14 this.sid = sid; 15 } 16 17 public String getSname() { 18 return sname; 19 } 20 21 public void setSname(String sname) { 22 this.sname = sname; 23 } 24 25 @Override 26 public String toString() {// 该方法可以省略 27 return "Sort[sid=" + sid + ",sname=" + sname + "]"; 28 } 29 }
(4)ArrayHandler与ArrayListHandler查询
①ArrayHandler:将结果集中的第一条记录封装到一个Object[]数组中,数组中的每一个元素就是这条记录中的每一个字段的值。
1 import java.sql.Connection; 2 import java.sql.SQLException; 3 import java.util.Arrays; 4 5 import org.apache.commons.dbutils.QueryRunner; 6 import org.apache.commons.dbutils.handlers.ArrayHandler; 7 import org.junit.Test; 8 9 public class ArrayHandlerDemo { 10 11 @Test 12 public void method() { 13 try { 14 // 获取QueryRunner对象 15 QueryRunner qr = new QueryRunner(); 16 // 执行SQL语句 17 String sql = "SELECT * FROM sort"; 18 Object[] params = {}; 19 Connection conn = JDBCUtils.getConnection(); 20 Object[] objArray = qr.query(conn, sql, new ArrayHandler(), params); 21 // 结果集的处理 22 System.out.println(Arrays.toString(objArray)); 23 24 conn.close(); 25 } catch (SQLException e) { 26 e.printStackTrace(); 27 } 28 } 29 }
运行结果:
②ArrayListHandler:将结果集中的每一条记录都封装到一个Object[]数组中,将这些数组在封装到List集合中。
1 import java.sql.Connection; 2 import java.sql.SQLException; 3 import java.util.Arrays; 4 import java.util.List; 5 6 import org.apache.commons.dbutils.QueryRunner; 7 import org.apache.commons.dbutils.handlers.ArrayListHandler; 8 import org.junit.Test; 9 10 public class ArrayListHandlerDemo { 11 @Test 12 public void method() { 13 try { 14 // 获取QueryRunner对象 15 QueryRunner qr = new QueryRunner(); 16 // 执行SQL语句 17 String sql = "SELECT * FROM sort WHERE sid>?"; 18 Object[] params = { 4 }; 19 Connection conn = JDBCUtils.getConnection(); 20 List<Object[]> list = qr.query(conn, sql, new ArrayListHandler(), 21 params); 22 // 结果集的处理 23 for (Object[] objArray : list) { 24 System.out.println(Arrays.toString(objArray)); 25 } 26 27 conn.close(); 28 } catch (SQLException e) { 29 e.printStackTrace(); 30 } 31 } 32 }
运行结果:
(5)BeanHandler与BeanListHandler查询
①BeanHandler:将结果集中第一条记录封装到一个指定的javaBean中。
1 import java.sql.Connection; 2 import java.sql.SQLException; 3 4 import org.apache.commons.dbutils.QueryRunner; 5 import org.apache.commons.dbutils.handlers.BeanHandler; 6 7 public class BeanHandlerDemo { 8 public static void main(String[] args) { 9 10 try { 11 // 获取QueryRunner 12 QueryRunner qr = new QueryRunner(); 13 // 执行SQL语句 14 String sql = "SELECT * FROM sort WHERE sname=?"; 15 Object[] params = { "冰箱" }; 16 Connection conn = JDBCUtils.getConnection(); 17 Sort s = qr.query(conn, sql, new BeanHandler<Sort>(Sort.class), 18 params); 19 // 结果集处理 20 System.out.println(s); 21 22 conn.close(); 23 } catch (SQLException e) { 24 throw new RuntimeException(e); 25 } 26 27 } 28 }
运行结果:
②BeanListHandler:将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中。
1 import java.sql.Connection; 2 import java.sql.SQLException; 3 import java.util.List; 4 5 import org.apache.commons.dbutils.QueryRunner; 6 import org.apache.commons.dbutils.handlers.BeanListHandler; 7 import org.junit.Test; 8 9 public class BeanListHandlerDemo { 10 @Test 11 public void method() { 12 try { 13 // 获取QueryRunner 14 QueryRunner qr = new QueryRunner(); 15 // 执行SQL语句 16 String sql = "SELECT * FROM Sort WHERE sid>?"; 17 Object[] params = { 4 }; 18 Connection conn = JDBCUtils.getConnection(); 19 List<Sort> list = qr.query(conn, sql, new BeanListHandler<Sort>( 20 Sort.class), params); 21 // 结果集处理 22 for (Sort s : list) { 23 System.out.println(s); 24 } 25 26 conn.close(); 27 } catch (SQLException e) { 28 throw new RuntimeException(e); 29 } 30 } 31 }
运行结果:
温馨提示:使用DBUtils查询数据,如果使用ArrayListHandler等都能够返回正确值,<br>但使用BeanListHandler 和 BeanHandler则一直返回null,请检查保证实体类的属性名称必须要同数据库中的字段一模一样(区分大小写)。
(6)ColumnListHandler与ScalarHandler查询
①ColumnListHandler:将结果集中指定的列的字段值,封装到一个List集合中。
1 import java.sql.Connection; 2 import java.sql.SQLException; 3 import java.util.List; 4 5 import org.apache.commons.dbutils.QueryRunner; 6 import org.apache.commons.dbutils.handlers.ColumnListHandler; 7 import org.junit.Test; 8 9 public class ColumnListHandlerDemo { 10 @Test 11 public void method() { 12 try { 13 // 获取QueryRunner对象 14 QueryRunner qr = new QueryRunner(); 15 // 执行SQL语句 16 String sql = "SELECT sname FROM Sort WHERE sid>?"; 17 Object[] params = { 4 }; 18 Connection conn = JDBCUtils.getConnection(); 19 List<String> list = qr.query(conn, sql, 20 new ColumnListHandler<String>(), params); 21 // 结果集的处理 22 for (String str : list) { 23 System.out.println(str); 24 } 25 26 conn.close(); 27 } catch (SQLException e) { 28 e.printStackTrace(); 29 } 30 } 31 }
运行结果:
②ScalarHandler:它是用于单数据。例如select count(*) from 表操作。
1 import java.sql.Connection; 2 import java.sql.SQLException; 3 4 import org.apache.commons.dbutils.QueryRunner; 5 import org.apache.commons.dbutils.handlers.ScalarHandler; 6 import org.junit.Test; 7 8 public class ScalarHandlerDemo { 9 @Test 10 public void method() { 11 try { 12 // 获取QueryRunner对象 13 QueryRunner qr = new QueryRunner(); 14 15 // 执行SQL语句 16 String sql = "SELECT MAX(sid) FROM Sort"; 17 Object[] params = {}; 18 Connection conn = JDBCUtils.getConnection(); 19 Integer max = qr.query(conn, sql, new ScalarHandler<Integer>(), 20 params); 21 // 结果集的处理 22 System.out.println("max=" + max); 23 24 conn.close(); 25 } catch (SQLException e) { 26 e.printStackTrace(); 27 } 28 } 29 }
运行结果: