博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
开源工具DbUtils的使用(数据库的增删改查)
阅读量:6874 次
发布时间:2019-06-26

本文共 8531 字,大约阅读时间需要 28 分钟。

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

一、DbUtils简介:

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

下载地址:

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

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

 

二、核心方法:

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

更新操作:

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

查询操作:

//返回beanUser user = runner.query("select * from user where userId=?",1,new BeanHandler
(User.class)); //返回beanlist System.out.println("返回BeanList结果......"); List
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/jdbcdbjdbc.username=rootjdbc.password=smyhjdbc.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
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.class),id); 47 return p; 48 } 49 50 //方法:使用BeanListHandler查询所有对象 51 @Override 52 public List
findAll() throws SQLException { 53 String sql = "select name,age,description from person"; 54 List
persons = runner.query(DBUtils.getConnection(), sql, new BeanListHandler
(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
()); 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
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代码时,后台输出如下:

转载地址:http://etofl.baihongyu.com/

你可能感兴趣的文章
Android 面试(六):你已经用 SharedPrefrence 的 apply() 替换 commit() 了吗?
查看>>
第82天:jQuery中prop()和attr()的区别
查看>>
一入前端深似海,从此红尘是路人系列第十弹之如何合理利用Git进行团队协作(一)...
查看>>
数据库实践如何解决互联网架构转型中的痛点!
查看>>
OpenCV使用python实现限制对比度的自适应直方图均衡化
查看>>
浪潮“计算+”:聚焦三大计算,打造数据社会原动力
查看>>
「镁客·请讲」梦之墨陈柏炜:基于液态金属的价值点,让电子制造打破时空限制...
查看>>
Java学习笔记--可变参数
查看>>
Splunk:勒索病毒之战尚未成功
查看>>
全球数据分析之王:中国数据分析市场正在爆发
查看>>
「镁客·请讲」维睛视空赵金辉:技术是初心,硬件是未来
查看>>
Facebook将未来押注在AR/VR
查看>>
「镁客·请讲」阿凡达机器人黄婷钰:定位儿童机器人,从硬件到软件、内容构建全面生态系统...
查看>>
郁金香商业辅助教程 2016 笔记 1~5
查看>>
区块链每日一问丨怎样防止一个比特币被使用两次?
查看>>
招商银行为什么选用MySQL
查看>>
PostgreSQL删除父表
查看>>
“风口”只是一方面,看家电电商如何玩转立体化营销问鼎第一渠道
查看>>
Linux下使用make install安装的软件如何卸载
查看>>
【阿里云流计算】- 电商每天成交总额案例
查看>>