JDBC访问数据库的步骤有:注册和加载驱动、获取连接、Connection获取Statement对象、使用Statement对象执行SQL语句、返回结果集、释放资源。如果只使用JDBC开发,会有很多重复的代码,可以把这些公共代码抽取出来。
如果一个功能经常用到,可以把这个功能做成一个工具类,在不同的地方使用。
DBUtils是将一些公共代码抽取出来,使用更少量的代码实现连接数据库的功能。DBUtils是一种数据库工具类,它简化了JDBC应用程序的开发。
获取数据库的连接getConnection()、关闭所有打开的资源close()会有很多重复的代码。
DBUtils的使用,可以很大程度上避免程序员写大量重复的代码,简化程序员的操作,使程序员仅关注数据库的增删改查问题,提升开发效率。
使用DBUtils需要了解它的两个类(DbUtils和QuerryRunner)和一个接口(ResultSethandler)。 1、DbUtils 数据库操作基本类,提供了数据库连接相关操作的静态方法。 2、QuerryRunner 提供对sql语句操作的API。 3、ResultSethandler 用于定义select操作后,怎样封装结果集
代码如下:
CREATE TABLE flower( id INT PRIMARY KEY AUTO_INCREMENT, fname VARCHAR(32), price INT ); INSERT INTO flower(fname,price) VALUES('rose',50), ('paeony',10), ('tulip',30), ('oleander',79); SELECT * FROM flower;commons-dbutils-1.4.jar
代码如下
package cn.itcast.jdbc; import cn.itcast.util.JDBCUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.commons.dbutils.handlers.ScalarHandler; import java.sql.Connection; import java.sql.SQLException; import java.util.List; public class testDbUtils { public static void main(String[] args) { QueryRunner qr = new QueryRunner(); Connection conn = null; int row = 0; int row2 = 0; int row3 = 0; try { conn = JDBCUtils.getConnection(); //增加数据 String sql="insert into flower (fname,price) values(?,?)"; row = qr.update(conn, sql, "水仙", 93); System.out.println(row); //更改数据 String sql2="update flower set pname = ? where price = ?"; row2 = qr.update(conn, sql, "水仙",50); System.out.println(row2); //删除数据 row3=qr.update(conn,"delete from flower where id in (?,?)",2,3); System.out.println(row3); //查询 Object q =qr.query(conn,"select count(price) from flower where id = ?",new ScalarHandler(),1); System.out.println(q); } catch (SQLException e) { e.printStackTrace(); } JDBCUtils.close(conn); } }代码如下
package cn.itcast.util; import java.io.FileReader; import java.io.IOException; import java.net.URL; import java.sql.*; import java.util.Properties; /** * JDBC工具类 */ public class JDBCUtils { private static String url; private static String user; private static String password; private static String driver; /** * 文件的读取,只需要读取一次即可拿到这些值。使用静态代码块 */ static { //读取资源文件,获取值。 try { //1.创建properties 集合类 Properties pro=new Properties(); //获取src路径下的文件的方式--->classLoader类加载器 ClassLoader classLoader = JDBCUtils.class.getClassLoader(); URL res = classLoader.getResource("jdbc.properties"); String path = res.getPath(); //System.out.println(path); //2.加载文件 pro.load(new FileReader(path)); //3.获取数据 url=pro.getProperty("url"); user=pro.getProperty("user"); password=pro.getProperty("password"); driver=pro.getProperty("driver"); //4.注册驱动 try { Class.forName(driver); } catch (ClassNotFoundException e) { e.printStackTrace(); } } catch (IOException e) { e.printStackTrace(); } } /** * 获取连接 * @return 连接对象 */ public static Connection getConnection() throws SQLException { return DriverManager.getConnection(url,user,password); } /** * 释放资源 * @param stmt * @param conn */ public static void close(ResultSet rs,Statement stmt, Connection conn){ if(rs != null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if(stmt != null){ try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if(conn != null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } public static void close(Statement stmt,Connection conn){ if(stmt != null){ try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if(conn != null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } public static void close(Connection conn){ if(conn != null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }代码如下
url=jdbc:mysql:///db1 user=root password=root driver=com.mysql.jdbc.DriverDBUtils最大的优势是查询,DBUtils为我们提供了大量的结果集处理器,使我们可以很方便的将查询到结果转换为各种对象。