开源工具DbUtils的使用(数据库的增删改查)

一、DbUtils简介:

DBUtils是apache下的一个小巧的JDBC轻量级封装的工具包,其最核心的特性是结果集的封装,可以直接将查询出来的结果集封装成JavaBean,这就为我们做了最枯燥乏味、最容易出错的一大部分工作。

下载地址:http://commons.apache.org/proper/commons-dbutils/download_dbutils.cgi

下载上图中的红框部分,然后解压。解压之后的文件如下 :

上图中红框部分的文件就是我们所需要的内容。

二、核心方法:

DbUtils中的核心的类是QueryRunner类。来看一下里面的核心方法:

更新操作:

runner.update("delete from user where userName=?","用户名");

int rowEffects = runner.update("insert into user(userName,password,comment)values(?,?,?)", "用户名","密码","备注");

查询操作:

//返回bean
User user = runner.query("select * from user where userId=?",1,new BeanHandler<User>(User.class));

//返回beanlist
System.out.println("返回BeanList结果......");
List<User> beanListResult =runner.query("select * from user",new BeanListHandler(User.class)); 

//返回一个值
Object increaseId=runner.query("select last_insert_id()", new ScalarHandler()); 

 

三、代码实现:

下面来看一下DbUtils是怎么用的。先来看一下整个工程的文件结构:

  • DBUtils:初步封装的JDBC工具类;
  • db-config.properties:属性文件,方便修改配置信息;
  • Person类就是领域模型,表示是对它(数据库表)进行增删改查。
  • PersonDao接口:专门对Person类进行操作(例如增删改查)的接口。注:这里不直接写操作类,是因为接口利于维护,可以在这里写上公共的代码。一个领域模型对应一个Dao接口。
  • PeronDaoImpl类:实现上面的PeronDao接口(也就是在这里用到了DbUtils工具,避免了自己写很多代码)
  • Test类:测试代码的可用性。

步骤如下:

首先创建数据库表:person。字段:id,name,age,description。建表的命令如下:

CREATE TABLE person(
id int primary key auto_increment,
name varchar(20),
age int(2),
description varchar(100)
); 

然后往表中填入一些简单地数据,供稍后查询。最终效果如下:

接下来是具体的代码实现:

打开eclipse,新建Java工程DBTest,然后在根目录下新建一个文件夹libs,将mysql-connector-java-5.1.33-bin.jar和刚刚下载好的commons-dbutils-1.6.jar添加到工程的Build path中。(如果不想去官网下载,可以在本文末尾的工程文件中找到)

(1)先新建一个DBUtils工具类:(package com.util.db)

 1 package com.util.db;
 2
 3 import java.sql.Connection;
 4 import java.sql.DriverManager;
 5 import java.sql.ResultSet;
 6 import java.sql.SQLException;
 7 import java.sql.Statement;
 8 import java.util.ResourceBundle;
 9
10 /**
11  * 数据库操作工具类
12  *
13  * @author lamp
14  *
15  */
16 public class DBUtils {
17
18     // 数据库连接地址
19     public static String URL;
20     // 用户名
21     public static String USERNAME;
22     // 密码
23     public static String PASSWORD;
24     // mysql的驱动类
25     public static String DRIVER;
26
27     private static ResourceBundle rb = ResourceBundle.getBundle("com.util.db.db-config");
28
29     private DBUtils() {
30     }
31
32     // 使用静态块加载驱动程序
33     static {
34         URL = rb.getString("jdbc.url");
35         USERNAME = rb.getString("jdbc.username");
36         PASSWORD = rb.getString("jdbc.password");
37         DRIVER = rb.getString("jdbc.driver");
38         try {
39             Class.forName(DRIVER);
40         } catch (ClassNotFoundException e) {
41             e.printStackTrace();
42         }
43     }
44
45     // 定义一个获取数据库连接的方法
46     public static Connection getConnection() {
47         Connection conn = null;
48         try {
49             conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
50         } catch (SQLException e) {
51             e.printStackTrace();
52             System.out.println("获取连接失败");
53         }
54         return conn;
55     }
56
57     // 关闭数据库连接
58     public static void close(ResultSet rs, Statement stat, Connection conn) {
59         try {
60             if (rs != null)
61                 rs.close();
62             if (stat != null)
63                 stat.close();
64             if (conn != null)
65                 conn.close();
66         } catch (SQLException e) {
67             e.printStackTrace();
68         }
69     }
70
71 }

注意:27行中,注意获取属性文件的包名是否正确。稍后会定义这个属性文件。

29行:既然是工具类,一般不要实例化,此时可以采用单例设计模式,或者将构造方法私有化。

27行:很明显可以看到,我们是将连接数据库的URL、用户名,密码等信息编写在一个属性文件(jdbc.properties)中,稍后再来定义这个属性文件。

32行:为避免重复代码,使用静态代码块:只会在类加载的时候执行一次。

45行:定义一个获取数据库连接的方法

57行:关闭数据库连接

(2)接下来新建一个属性文件,new-->file,命名为:db-config.properties,代码如下:

jdbc.url=jdbc:mysql://localhost:3306/jdbcdb
jdbc.username=root
jdbc.password=smyh
jdbc.driver=com.mysql.jdbc.Driver

以后如果需要修改配置信息,只需要在这里改就行了。注意在上面的DBUtils类中是怎么来调用这个配置信息的。

(3)新建文件,定义好Person类:(package com.vae.domain)

 1 package com.vae.domain;
 2
 3 public class Person {
 4     private int id;
 5     private String name;
 6     private int age;
 7     private String description;
 8
 9     public int getId() {
10         return id;
11     }
12
13     public void setId(int id) {
14         this.id = id;
15     }
16
17     public String getName() {
18         return name;
19     }
20
21     public void setName(String name) {
22         this.name = name;
23     }
24
25     public int getAge() {
26         return age;
27     }
28
29     public void setAge(int age) {
30         this.age = age;
31     }
32
33     public String getDescription() {
34         return description;
35     }
36
37     public void setDescription(String description) {
38         this.description = description;
39     }
40
41     public Person(int id, String name, int age, String description) {
42         super();
43         this.id = id;
44         this.name = name;
45         this.age = age;
46         this.description = description;
47     }
48
49     public Person(String name, int age, String description) {
50         super();
51         this.name = name;
52         this.age = age;
53         this.description = description;
54     }
55
56     public Person() {
57         super();
58         // TODO Auto-generated constructor stub
59     }
60
61     @Override
62     public String toString() {
63         return "Person [id=" + id + ", name=" + name + ", age=" + age
64                 + ", description=" + description + "]";
65     }
66
67 }

这个Person类就是领域模型,表示是对它进行增删改查。

紧接着定义PersonDao接口:专门对Person类进行操作(例如增删改查)的接口(package com.vae.dao)

注意:是定义接口,不是定义类。代码如下:

 1 package com.vae.dao;
 2
 3 import java.sql.SQLException;
 4 import java.util.List;
 5
 6 import com.vae.domain.Person;
 7
 8 public interface PersonDao {
 9     // 添加方法
10     public void add(Person p) throws SQLException;
11
12     // 更新方法
13     public void update(Person p) throws SQLException;
14
15     // 删除方法
16     public void delete(int id) throws SQLException;
17
18     // 查找方法
19     public Person findById(int id) throws SQLException;
20
21     // 查找所有
22     public List<Person> findAll() throws SQLException;
23
24     // 查询有几条记录
25     public long personCount() throws SQLException;
26
27 }

(4)然后,定义PeronDaoImpl实现类 ,实现上面的PeronDao接口(package com.vae.dao)

 1 package com.vae.dao;
 2
 3 import java.sql.SQLException;
 4 import java.util.List;
 5
 6 import org.apache.commons.dbutils.QueryRunner;
 7 import org.apache.commons.dbutils.handlers.BeanHandler;
 8 import org.apache.commons.dbutils.handlers.BeanListHandler;
 9 import org.apache.commons.dbutils.handlers.ScalarHandler;
10
11 import com.util.db.DBUtils;
12 import com.vae.domain.Person;
13
14 public class PersonDaoImpl implements PersonDao {
15     private QueryRunner runner = null;//查询运行器
16     public PersonDaoImpl(){
17         runner = new QueryRunner();
18     }
19
20     //方法:向数据库中添加一条记录
21     @Override
22     public void add(Person p) throws SQLException {
23         String sql = "insert into person(name,age,description)values(?,?,?)";
24         runner.update(DBUtils.getConnection(), sql, p.getName(), p.getAge(),p.getDescription());
25     }
26
27     //方法:根据id向数据库中修改某条记录
28     @Override
29     public void update(Person p) throws SQLException {
30         String sql = "update person set name=?,age=?,description=? where id=?";
31         runner.update(DBUtils.getConnection(), sql, p.getName(),p.getAge(),p.getDescription(),p.getId());
32     }
33
34     //方法:根据id删除数据库中的某条记录
35     @Override
36     public void delete(int id) throws SQLException {
37         String sql = "delete from person where id=?";
38         runner.update(DBUtils.getConnection(), sql, id);
39     }
40
41
42      //方法:使用BeanHandler查询一个对象
43     @Override
44     public Person findById(int id) throws SQLException {
45         String sql = "select name,age,description from person where id=?";
46         Person p = runner.query(DBUtils.getConnection(), sql, new BeanHandler<Person>(Person.class),id);
47         return p;
48     }
49
50     //方法:使用BeanListHandler查询所有对象
51     @Override
52     public List<Person> findAll() throws SQLException {
53         String sql = "select name,age,description from person";
54         List<Person> persons = runner.query(DBUtils.getConnection(), sql, new BeanListHandler<Person>(Person.class));
55         return persons;
56     }
57
58     //方法:使用ScalarHandler查询一共有几条记录
59     @Override
60     public long personCount()throws SQLException{
61         String sql = "select count(id) from person";
62         return runner.query(DBUtils.getConnection(),sql, new ScalarHandler<Long>());
63     }
64
65 } 

核心代码:15行、17行、24行、31行、38行、46行、54行、62行。

(5)新建一个测试类Test.java(package com.vae.test)

 1 package com.vae.test;
 2
 3 import java.sql.SQLException;
 4 import java.util.List;
 5
 6 import com.vae.dao.PersonDao;
 7 import com.vae.dao.PersonDaoImpl;
 8 import com.vae.domain.Person;
 9
10 public class Test {
11
12     public static void main(String[] args) throws SQLException {
13         PersonDao dao = new PersonDaoImpl();
14
15          //dao.add(new Person("生命叁号",22,"我是通过Java命令而增加的记录"));
16
17          //dao.update(new Person(1,"生命壹号",23,"我是通过Java命令而修改的记录"));
18
19          //dao.delete(4);
20
21          //Person p = dao.findById(1);
22          //System.out.println(p);
23
24         //List<Person> persons = dao.findAll();
25         //System.out.println(persons);
26
27         long count = dao.personCount();
28         System.out.println(count);
29     }
30
31 }

经测试,上述15至28行的代码都能运行。

例如,当执行第21至22代码时,后台输出如下:

当执行第24至25代码时,后台输出如下:

当执行第27至28代码时,后台输出如下:

开源工具DbUtils的使用(数据库的增删改查)的更多相关文章

  1. IDEA中通过工具类实现对数据库的增删改查

    package com.hu.dao; import com.hu.entity.Student; import java.util.List;import java.util.Map; public ...

  2. MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  3. DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)

    DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类) 一.DAO模式简介 DAO即Data Access Object,数据访问接口.数据访问:故名思义就是与数据库打交道.夹在业务逻辑与数据 ...

  4. Android 系统API实现数据库的增删改查和SQLite3工具的使用

    在<Android SQL语句实现数据库的增删改查>中介绍了使用sql语句来实现数据库的增删改查操作,本文介绍Android 系统API实现数据库的增删改查和SQLite3工具的使用. 系 ...

  5. java jdbc 连接mysql数据库 实现增删改查

    好久没有写博文了,写个简单的东西热热身,分享给大家. jdbc相信大家都不陌生,只要是个搞java的,最初接触j2ee的时候都是要学习这么个东西的,谁叫程序得和数据库打交道呢!而jdbc就是和数据库打 ...

  6. 【转载】通过JDBC对MySQL数据库的增删改查

    通过JDBC进行简单的增删改查(以MySQL为例) 目录 前言:什么是JDBC 一.准备工作(一):MySQL安装配置和基础学习 二.准备工作(二):下载数据库对应的jar包并导入 三.JDBC基本操 ...

  7. java操作数据库:增删改查

    不多bb了直接上. 工具:myeclipse 2016,mysql 5.7 目的:java操作数据库增删改查商品信息 test数据库的goods表 gid主键,自增 1.实体类Goods:封装数据库数 ...

  8. 9.5Django操作数据库的增删改查

    2018-9-5 18:10:52 先贴上笔记 day61 2018-04-28 1. 内容回顾 1. HTTP协议消息的格式: 1. 请求(request) 请求方法 路径 HTTP/1.1\r\n ...

  9. ThinkPHP实现对数据库的增删改查

    好久都没有更新博客了,之前老师布置的任务总算是现在可以说告一段落了,今天趁老师还没提出其他要求来更新一篇博客. 今天我想记录的是我之前做项目,自己所理解的ThinkPHP对数据库的增删改查. 首先要说 ...

随机推荐

  1. 幻世(OurDream)2D图形引擎使用教程9——处理操作输入(3)

    声明:本教程版权归Lizcst Software Lab所有,欢迎转载,但是转载必须保留本段声明文字,并注明文章来源:http://blog.csdn.net/kflizcst 谢谢合作! 现在我们该 ...

  2. System.gc

    Java中的内存分配是随着new一个新的对象来实现的,这个很简单,而且也还是有一些可以“改进”内存回收的机制的,其中最显眼的就是这个System.gc()函数. 乍一看这个函数似乎是可以进行垃圾回收的 ...

  3. Java里的日期和时间学习

    Date date = new Date();//yyyy-mm-dd hh:mm:ss[.fffffffff] SimpleDateFormat sdf = new SimpleDateFormat ...

  4. Eclipse选项卡式的属性视图(The Eclipse Tabbed Properties View)

    Eclipse工作台提供了一个性能视图用于查看(和/或编辑)选定项目的属性. 在本文中,您将学习怎样使用选项卡式的属性视图创建一个性能增强的用户界面视图. 1.引言 Eclipse工作台提供了一个属性 ...

  5. Get Cordova Ready for Grunt and CoffeeScript

    Cordova, Grunt and Coffee You may reference to below if you deside to work with coffee instead of Ja ...

  6. KMP原理、分析及C语言实现

    (是在matrix67博客基础上整理而来,整理着:华科小涛@http://www.cnblogs.com/hust-ghtao/) 有些算法可以让人发疯,KMP算法就是一个.在网上找了很多资料讲的都让 ...

  7. ALV前导零的问题

    ALV的IT_FIELDCAT参数中L_ZERO 选项置位的话,对NUM类型的前导0是可以输出的,但是有个很重要的前提条件,NO_ZERO不可以置位,否则L_ZERO是失效的.

  8. hdu1114

    完全背包的水题,不过今天才学动态规划,就这样啦……hahahah!!! 完全背包跟普通背包的区别是普通背包从后往前循环,以防止被替换 完全背包是从前往后循环,后面的状态会跟着之前状态的改变而改变…… ...

  9. 综述-如何克服HTML5的“性工能”障碍

    http://ask.dcloud.net.cn/docs HTML5自出现以来,几经风雨,虽看似很有前途,但实际使用问题太多,DCloud为此踩了无数坑.但我们从未放弃,我们加入了W3C,发起了 H ...

  10. 【UVA】12299-RMQ with Shifts(线段树)

    改动的时候因为数据非常小,所以能够直接暴力改动,查询的时候利用线段树即可了. 14337858 option=com_onlinejudge&Itemid=8&page=show_pr ...