DBUtils与JDBC使用

*一、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、提供无参的构造方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值