DBUtils与JDBC使用

    科技2026-01-06  9

    *一、DBUtils

    DBUtils是一个为简化JDBC(Java数据库连接)操作的小类库。DBUtils就是JDBC的简化开发工具包。需要项目导入commons-dbutils-1.6.jar才能够正常使用DBUtils工具。 DBUtils是java编程中的数据库操作实用工具,小巧简单实用。 DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码。

    使用遵从以下步骤: 1.加载JDBC驱动程序类,并用DriverManager来得到一个数据库连接实例conn。 2.实例化 QueryRunner,得到实例化对象qRunner。 3. qRunner.update()方法,执行增改删的sql命令, qRunner.query()方法,得到结果集。

    二、DButils三个核心类或接口功能介绍 1、QueryRunner类中提供对sql语句操作的API.这个类使执行SQL查询简单化了,它与ResultSetHandler串联在一起有效地履行着一些平常的任务,它能够大大减少你所要写的编码。 QueryRunner类提供了两个构造器:其中一个是一个空构造器,另一个则拿一个 javax.sql.DataSource 来作为参数。 因此,在你不用为一个方法提供一个数据库连接来作为参数的情况下,提供给构造器的数据源(DataSource) 被用来获得一个新的连接并将继续进行下去。 (1)update(Connection conn, String sql, Object… params) ,用来完成表数据的增加、删除、更新操作 (2)query(Connection conn, String sql, ResultSetHandler rsh, Object… params) ,用来完成表数据的查询操作

    2、ResultSetHandler接口,结果集处理类,用于定义select操作后,怎样封装结果集.这一接口执行处理一个jaca.sql.ResultSet,将数据转变并处理为任何一种形式,这样有益于其应用而且使用起来更容易。 这一组件提供了ArrayHandler, ArrayListHandler, BeanHandler, BeanListHandler, MapHandler, MapListHandler, and ScalarHandler等执行程序。 ResultSetHandler接口提供了一个单独的方法:Object handle (java.sql.ResultSet .rs)。 因此任何ResultSetHandler 的执行需要一个结果集(ResultSet)作为参数传入,然后才能处理这个结果集,再返回一个对象。 因为返回类型是java.lang.Object,所以除了不能返回一个原始的Java类型之外,其它的返回类型并没有什么限制。 如果你发现这七个执行程序中没有任何一个提供了你想要的服务,你可以自己写执行程序并使用它。 (1) ArrayHandler 将结果集中的第一条记录封装到一个Object[]数组中,数组中的每一个元素就是这条记录中的每一个字段的值 (2)ArrayListHandler 将结果集中的每一条记录都封装到一个Object[]数组中,将这些数组在封装到List集合中。 (3)BeanHandler 将结果集中第一条记录封装到一个指定的javaBean中。 (4)BeanListHandler 将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中 (5)ColumnListHandler 将结果集中指定的列的字段值,封装到一个List集合中 (6)ScalarHandler 它是用于单数据。例如select count(*) from 表操作。 (7)MapHandler 将结果集第一行封装到Map集合中,Key 列名, Value 该列数据 (8)MapListHandler 将结果集第(每)一行封装到Map集合中,Key 列名, Value 该列数据,Map集合存储到List集合

    3、DBUtils类,它就是一个工具类,定义了关闭资源与事务处理的方法,做一些诸如关闭连接、装载JDBC驱动程序之类的常规工作提供有用方法的类,它里面所有的方法都是静态的。 (1)close():DbUtils类提供了三个重载的关闭方法。这些方法检查所提供的参数是不是NULL,如果不是的话,它们就关闭连接、声明和结果(ResultSet)。 (2)CloseQuietly:CloseQuietly这一方法不仅能在连接、声明或者结集(ResultSet)为NULL情况下避免关闭,还能隐藏一些在程序中抛出的SQLEeception。如果你不想捕捉这些异常的话,这对你是非常有用的。在重载CloseQuietly方法时,特别有用的一个方法是closeQuietly(Connection conn,Statement stmt,ResultSet rs),这是因为在大多数情况下,连接、声明和结果集(ResultSet)是你要用的三样东西,而且在最后的块你必须关闭它们。使用这一方法,你最后的块就可以只需要调用这一方法即可。 (3)CommitAndCloseQuietly(Connection conn):这一方法用来提交连接,然后关闭连接,并且在关闭连接时不向上抛出在关闭时发生的一些SQL异常。 (4)LoadDriver(String driveClassName):这一方法装载并注册JDBC驱动程序,如果成功就返回TRUE。使用这种方法,你不需要去捕捉这个异常ClassNotFoundException。使用loadDrive方法,编码就变得更容易理解,你也就得到了一个很好的Boolean返回值,这个返回值会告诉你驱动类是不是已经加载成功了。

    实例: 1、连接类ConnectDb:import java.sql.DriverManager;

    import java.sql.SQLException; import java.sql.Connection; public class ConnectDb { private static String driveClassName = "com.mysql.jdbc.Driver"; private static String url = "jdbc:mysql://192.168.1.161:3306/test?useUnicode=true&characterEncoding=utf8"; private static String user = "root"; private static String password = "e-playnow"; public static Connection Connect(){ Connection conn = null; //load driver try { Class.forName(driveClassName); } catch (ClassNotFoundException e) { System.out.println("load driver failed!"); e.printStackTrace(); } //connect db try { conn = DriverManager.getConnection(url, user, password); } catch (SQLException e) { System.out.println("connect failed!"); e.printStackTrace(); } return conn; } }

    2、数据库表

    1 CREATE TABLE `user` ( 2 `id` int(11) NOT NULL auto_increment, 3 `name` varchar(50) NOT NULL, 4 `age` tinyint(10) NOT NULL, 5 PRIMARY KEY (`id`) 6 ) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8

    3、Bean

    package Beans; public class UserBean { private int id; private String name; private int age; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }

    4、Demo

    import java.sql.Connection; import java.sql.SQLException; import java.util.List; import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanListHandler; import Beans.UserBean; public class main { public static void main(String[] args) throws SQLException { insert_test(); del_test(); } static void insert_test() throws SQLException{ Connection conn = ConnectDb.Connect(); //创建SQL执行工具 QueryRunner qRunner = new QueryRunner(); //执行SQL插入 int n = qRunner.update(conn, "insert into user(name,age) values('xxx',22)"); System.out.println("成功插入" + n + "条数据!"); //关闭数据库连接 DbUtils.closeQuietly(conn); } static void select_test() throws SQLException{ Connection conn = ConnectDb.Connect(); //创建SQL执行工具 QueryRunner qRunner = new QueryRunner(); @SuppressWarnings("unchecked") List<UserBean> list = (List<UserBean>) qRunner.query(conn, "select id,name,age from user", new BeanListHandler(UserBean.class)); //输出查询结果 for (UserBean user : list) { System.out.println(user.getAge()); } //关闭数据库连接 DbUtils.closeQuietly(conn); } static void update_test() throws SQLException{ Connection conn = ConnectDb.Connect(); //创建SQL执行工具 QueryRunner qRunner = new QueryRunner(); //执行SQL插入 int n = qRunner.update(conn, "update user set name = 'xxx',age=28"); System.out.println("成功更新" + n + "条数据!"); //关闭数据库连接 DbUtils.closeQuietly(conn); } static void del_test() throws SQLException{ Connection conn = ConnectDb.Connect(); //创建SQL执行工具 QueryRunner qRunner = new QueryRunner(); //执行SQL插入 int n = qRunner.update(conn, "DELETE from user WHERE name='xxx';"); System.out.println("删除成功" + n + "条数据!"); //关闭数据库连接 DbUtils.closeQuietly(conn); } }

    [

    代码出处](https://www.cnblogs.com/meiliguo/p/9097026.html)

    一、JDBC

    JDBC:Java DataBase Connectivity Java数据库的连接。是SUN公司统一提供的一套接口规范(JDBC).各个数据库生产商提供实现。Java提供访问数据库规范称为JDBC,而生产厂商提供规范的实现类称为驱动。驱动:两个硬件设备之间通信的桥梁。 JDBC是接口,驱动是接口的实现,没有驱动将无法完成数据库连接,从而不能操作数据库!每个数据库厂商都需要提供自己的驱动,用来连接自己公司的数据库,也就是说驱动一般都由数据库生成厂商提供。

    (1)JDBC概念:数据库操作的接口:api+不同的数据库操作

    List item

    提供了统一的入口 (2)一般性流程: 加载驱动(DriverManger) 获取连接(DriverManager,Connection) 获取执行sql对象(Statement,PrepareStatement) 解析结果集(ReslutSet) 释放资源(close()) 二、JDBC的基本使用 1、加载驱动: (1)DriverManger.registerDriver( new com.jdbc.mysql.Driver()); (2)Class.forName(“com.jdbc.mysql.Driver”); static{ DriverManger.registerDriver( new com.jdbc.mysql.Driver()); } 2、获取连接 Connection conn = DriverManager.getConnection( String url,String username,String password); url组成: 第一个部分:jdbc:(固定的) 第二个部分:数据的名称(mysql://) 第三个部分:数据库地址(由数据厂商来定): ip:端口//数据库名称 ur扩充:url?useUnicode=true &&charaterEncoding=UTF-8 Connection conn = DriverManager .getConnection(“jdbc:mysql://localhost:3306/javaweb”, “zfang”,“123456”); 3、获取执行sql的对象 (1)Statement: 获取: String sql = “select * from user”; Statement stat = conn.createStatement(sql); 常用方法: int executeUpdate();执行insert,delete,update ReslutSet executeQuery():执行select Boolean execute():执行所有 true:查询操作,继续调用getResultSet() false:更新的操作,继续调用getUpdateCount() 缺陷:sql注入的攻击 select * from user where username=“admin or 1” and password =“admin or 1” (2)PrepareStatement 获取: String sql = “select * from user where username =?and age> 0”; PrepareStatement pStat = conn. prepareStatement(sql); pStat.setXXX(位置,参数值) pStat.setString(1,“zfang”) pStat.setInt(2,24)

    常用方法: int executeUpdate();执行insert,delete,update ReslutSet executeQuery():执行select Boolean execute():执行所有 true:查询操作,继续调用getResultSet() false:更新的操作,继续调用getUpdateCount()

    4、获取结果集: 概念:内存中带游标的表 常用的方法: getObject(int columnIndex) getInt(int columnIndex) getDouble(int columnIndex) 获取数据的流程: while(rs.next()){ String username = rs.getString(1); int age = rs.getInt(2); } 5、释放资源 try{ rs.close(); }catch(Exception e){ throw new RuntimeException(); } rs.close(); stat.close(); conn.close();

    三、案例分析(Eclipse):模拟登录注册功能。 1、打开Eclispe->文件->新建->java project-> 输入项目名称(JavaWeb) JavaWeb src 2、创建包名: 右键src->新建->包->输入包名 JavaWeb src com.zfang.javaweb.service UserService com.zfang.javaweb.dao UserDao com.zfang.javaweb.test UserServiceTest com.zfang.javaweb.utils JDBCUtil com.zfang.javaweb.entity User 3、创建数据库和数据表 create database javaweb; use javaweb; create table user( id int primary key auto_increment, username varchar(32) not null, password varchar(32) not null ); 4、创建User对象(javabean) 右键com.zfang.javaweb.entity包->新建-》类,输入名称User public class User{ Integer id; private String username; private String password;

    public String getUsername(){ return username; } public void setUsername(String username){ this.username = username; } …

    } 在User类的空白处->右键->src(源码)-> generate->getter/setter 5、右键com.zfang.javaweb.service-》新建-》类-》输入名称 public class UserSerive{ private UserDao userDao = new UserDao(); public User login(String username,String password){ User user = userDao .findByUsernameAndPassword(username,password); return user; }

    public Boolean regist(User user){ Boolen result= userDao.save(user); return result; } } 6、右键com.zfang.javaweb.到-》新建-》类-》输入名称 public class UserDao{ private Connection conn; private PrepareStatement pStat; private ResultSet rs; private String sql = “”;

    public User findByUsernameAndPassword (String username,String password){

    User user; conn = JDBCUtil.getConnection(); sql = “select * from user where username = ? and password = ?”; pStat = conn.prepareStatement(sql); List users = new ArrayList(); ResultSet rs = pStat.executeQuery(); while(rs.next()){ User user = new User(); user.setUsername(rs.getString(2)); user.setPassword(rs.getString(3)); users.add(user); } if(users.size() == 0){ return null; }else{ users.get(0); } conn.release(); return user; }

    public Boolean save(User user){ Boolean result; conn = JDBCUtil.getConnection(); 获取执行sql对象(Statement,PrepareStatement) 解析结果集(ReslutSet) conn.release(); return result; }

    }

    6、导包:右键项目名称-》新建-》文件夹-》输入名称libs 包复制至libs文件夹–》右键包-》添加到构建路径

    7、右键-》com.zfang.javaweb.utils-》新建-》类-》输入名称 public class JDBCUtil{ private static Connection conn; priavte static final String ADDRESS= “jdbc:mysql://localhost:3306//javaweb”; priavte static final String PASSWORD=""; static{ Class.forName(“com.jdbc.mysql.Driver”); } public static Connection getConnection(){ conn = DriverManager .getConnection(ADDRESS,USERNAME,PASSWORD); } public static void release(Connection conn,ResultSet rs, PrepareStatement pStat){ if(conn != null){ try{ conn.close(); }catch(Exception e){ throw new RuntimeException(); } } if(rs != null){ try{ rs.close(); }catch(Exception e){ throw new RuntimeException(); } } if(pStat != null){ try{ pStat.close(); }catch(Exception e){ throw new RuntimeException(); } } }

    } 8、右键-》com.zfang.javaweb.test-》新建-》类-》输入名称 public class UserServiceTest{ @Test public void testLogin(){ UserSerive serivce = new UserService(); User user = service.login(“zfang”,“123456”); if(user == null){ System.out.println(“username or password error”); }else{ System.out.println(“welcome!”); } }

    }

    四、JavaBean(持久化的类–>数据库中的表对应) 普通的java类,需要满足以下要求: 1、需要实现Serializer接口 2、提供私有类型的参数 private 类型 数据名称 3、为private参数提供getter和setter方法 public getUsername(){ } 4、提供无参的构造方法

    Processed: 0.022, SQL: 9