Java——DBUtils的使用(简化了JDBC操作,可以少写代码)
DBUtils
如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC开发,我们采用apache commons组件一个成员:DBUtils。
DBUtils是java编程中的数据库操作实用工具,小巧简单实用。
DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码。
Dbutils三个核心功能
- QueryRunner中提供对sql语句操作的API.
- ResultSetHandler接口,用于定义select操作后,怎样封装结果集.
- DbUtils类,它就是一个工具类,定义了关闭资源与事务处理的方法
QueryRunner核心类
-
update(Connection conn, String sql, Object... params) ,用来完成表数据的增加、删除、更新操作
-
query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) ,用来完成表数据的查询操作
一、QueryRunner实现增删改操作
使用格式:
update (Connection con,String sql,Object...param)
private static void func() throws SQLException { //创建QueryRunner对象 QueryRunner qr = new QueryRunner(); //书写sql语句 //String sql = "insert into sort(sname,sprice,sdesc)VALUES(?,?,?)"; // 增 //String sql = "UPDATE sort SET sname=?,sprice=?,sdesc=? WHERE sid=?"; // 改 String sql = "DELETE FROM sort WHERE sid=?"; // 删 //将三个?占位符的实际参数,写在数组中 Object[] params = {2}; //调用QueryRunner类的方法update执行SQL语句,返回受影响的函数 int row = qr.update(conn, sql, params); //打印行数 System.out.println(row); /* * 判断insert,update,delete执行是否成功 * 对返回值row判断 * if(row>0) 执行成功 */ //关闭连接 DbUtils.closeQuietly(conn); }
1 package cn.x5456.demo; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.sql.Connection; 6 import java.sql.DriverManager; 7 import java.util.Properties; 8 9 public class JDBCUtils { 10 private JDBCUtils(){} 11 private static Connection conn ; 12 private static String dirverClass; 13 private static String url; 14 private static String username; 15 private static String password; 16 17 // 静态代码块,调用就执行 18 static{ 19 try{ 20 func(); 21 Class.forName(dirverClass); 22 conn = DriverManager.getConnection(url, username, password); 23 }catch(Exception ex){ 24 throw new RuntimeException(ex+"数据库连接失败"); 25 } 26 } 27 28 29 private static void func() throws IOException { 30 // 获取类的加载器 返回指定资源的输入流 31 InputStream in = JDBCUtils.class.getClassLoader().getResourceAsStream("database.properties"); 32 33 Properties prop = new Properties(); 34 prop.load(in); 35 36 dirverClass = prop.getProperty("dirverClass"); 37 url = prop.getProperty("url"); 38 username = prop.getProperty("username"); 39 password = prop.getProperty("password"); 40 } 41 42 /* 43 * 定义静态方法,返回数据库的连接对象 44 */ 45 public static Connection getConnection(){ 46 return conn; 47 } 48 }
1 dirverClass=com.mysql.jdbc.Driver 2 url=jdbc:mysql://127.0.0.1:3306/testdb 3 username=root 4 password=xxx
二、QueryRunner实现查询操作
query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params)
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集合 |
1) ArrayHandler
/* * 结果集第一种处理方法, ArrayHandler * 将结果集的第一行存储到对象数组中 Object[] */ public static void arrayHandler() throws SQLException { QueryRunner qr = new QueryRunner(); String sql = "SELECT * FROM sort"; Object[] result = qr.query(conn,sql,new ArrayHandler()); // 返回一个Object数组 for (Object obj : result){ System.out.print(obj+"\t"); } }
结果
1 书 9.9 年终大促
2)ArrayListHandler
/* * 结果集第二种处理方法,ArrayListHandler * 将结果集的每一行,封装到对象数组中, 出现很多对象数组 * 对象数组存储到List集合 */ public static void arrayListHandler() throws SQLException { QueryRunner qr = new QueryRunner(); String sql = "SELECT * FROM sort"; List<Object[]> result = qr.query(conn,sql,new ArrayListHandler()); // 返回一个Object数组 for (Object[] objs : result){ for (Object obj : objs){ System.out.print(obj+"\t"); } System.out.println(); } }
结果
1 书 9.9 年终大促
3 椅子 998.0 只要998
5 体育用品 289.32 购买体育用品
JavaBean
JavaBean就是一个类,在开发中常用封装数据。具有如下特性
- 需要实现接口:java.io.Serializable ,通常实现接口这步骤省略了,不会影响程序。
- 提供私有字段:private 类型字段名。
- 提供getter/setter方法。
- 提供无参构造。
全部可以使用IDE自动生成
3)beanHandler
/* * 结果集第三种处理方法,BeanHandler * 将结果集的第一行数据,封装成JavaBean对象 * 注意: 被封装成数据到JavaBean对象, Sort类必须有空参数构造 */ private static void beanHandler() throws SQLException { QueryRunner qr = new QueryRunner(); String sql = "SELECT * FROM sort"; Sort s = qr.query(conn,sql,new BeanHandler<Sort>(Sort.class)); //传递Sort的class文件的对象,目的是反射创建对象 System.out.println(s); }
1 package cn.x5456.bean; 2 3 public class Sort { 4 private int sid; 5 private String sname; 6 private double sprice; 7 private String sdesc; 8 9 public Sort(int sid, String sname, double sprice, String sdesc) { 10 this.sid = sid; 11 this.sname = sname; 12 this.sprice = sprice; 13 this.sdesc = sdesc; 14 } 15 16 public Sort() { 17 } 18 19 public int getSid() { 20 return sid; 21 } 22 23 public String getSname() { 24 return sname; 25 } 26 27 public double getSprice() { 28 return sprice; 29 } 30 31 public String getSdesc() { 32 return sdesc; 33 } 34 35 public void setSid(int sid) { 36 this.sid = sid; 37 } 38 39 public void setSname(String sname) { 40 this.sname = sname; 41 } 42 43 public void setSprice(double sprice) { 44 this.sprice = sprice; 45 } 46 47 public void setSdesc(String sdesc) { 48 this.sdesc = sdesc; 49 } 50 51 @Override 52 public String toString() { 53 return "Sort{" + 54 "sid=" + sid + 55 ", sname='" + sname + '\'' + 56 ", sprice=" + sprice + 57 ", sdesc='" + sdesc + '\'' + 58 '}'; 59 } 60 }
结果
Sort{sid=1, sname='书', sprice=9.9, sdesc='年终大促'}
4)beanListHandler
/* * 结果集第四种处理方法, BeanListHandler * 结果集每一行数据,封装JavaBean对象 * 多个JavaBean对象,存储到List集合 */ private static void beanListHandler() throws SQLException { QueryRunner qr = new QueryRunner(); String sql = "SELECT * FROM sort"; List<Sort> list = qr.query(conn,sql,new BeanListHandler<Sort>(Sort.class)); //传递Sort的class文件的对象,目的是反射创建对象 for (Sort s : list){ System.out.println(s); } }
结果
Sort{sid=1, sname='书', sprice=9.9, sdesc='年终大促'}
Sort{sid=3, sname='椅子', sprice=998.0, sdesc='只要998'}
Sort{sid=5, sname='体育用品', sprice=289.32, sdesc='购买体育用品'}
5)ColumnListHandler
/* * 结果集第五种处理方法,ColumnListHandler * 结果集,指定列的数据,存储到List集合 * List<Object> 每个列数据类型不同 */ private static void columnListHandler() throws SQLException { QueryRunner qr = new QueryRunner(); String sql = "SELECT * FROM sort"; //调用方法 query,传递结果集实现类ColumnListHandler //实现类构造方法中,使用字符串的列名 List<String> list = qr.query(conn,sql,new ColumnListHandler<String>("sname")); for(String str : list){ System.out.println(str); } }
结果
书
椅子
体育用品
6)ScalarHandler
/* * 结果集第六种处理方法,ScalarHandler * 对于查询后,只有1个结果 */ private static void scalarHandler() throws SQLException { QueryRunner qr = new QueryRunner(); String sql = "SELECT count(*) FROM sort"; //调用方法query,传递结果集处理实现类ScalarHandler long count = qr.query(conn,sql,new ScalarHandler<Long>()); System.out.println(count); }
7)MapHandler
/* * 结果集第七种处理方法,MapHandler * 将结果集第一行数据,封装到Map集合中 * Map<键,值> 键:列名 值:这列的数据 */ public static void mapHandler()throws SQLException{ QueryRunner qr = new QueryRunner(); String sql = "SELECT * FROM sort"; //调用方法query,传递结果集实现类MapHandler //返回值: Map集合,Map接口实现类, 泛型 Map<String,Object> map = qr.query(conn, sql, new MapHandler()); //遍历Map集合 for(String key : map.keySet()){ System.out.println(key+".."+map.get(key)); } }
结果
sid..1
sname..书
sprice..9.9
sdesc..年终大促
8)MapListHandler
/* * 结果集第八种处理方法,MapListHandler * 将结果集每一行存储到Map集合,键:列名,值:数据 * Map集合过多,存储到List集合 */ public static void mapListHandler()throws SQLException{ QueryRunner qr = new QueryRunner(); String sql = "SELECT * FROM sort"; //调用方法query,传递结果集实现类MapListHandler //返回值List集合, 存储的是Map集合 List<Map<String,Object>> list = qr.query(conn, sql, new MapListHandler()); //遍历集合list for( Map<String,Object> map : list ){ for(String key : map.keySet()){ System.out.print(key+"..."+map.get(key)); } System.out.println(); } }
结果
sid...1sname...书sprice...9.9sdesc...年终大促
sid...3sname...椅子sprice...998.0sdesc...只要998
sid...5sname...体育用品sprice...289.32sdesc...购买体育用品