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

【声明】

欢迎转载,但请保留文章原始出处→_→

生命壹号:http://www.cnblogs.com/smyhvae/

文章来源:http://www.cnblogs.com/smyhvae/p/4085684.html

联系方式:[email protected]

【正文】

这一周状态不太好,连续打了几天的点滴,所以博客中断了一个星期,现在继续。

我们在之前的几篇文章中学习了JDBC对数据库的增删改查。其实在实际开发中,一般都是使用第三方工具类,但是只有将之前的基础学习好了,在使用开源工具的时才能得心应手。如果对JDBC基础不太清楚,或者对本文看不太懂,建议先回顾一下本人之前的几篇和“MySQL数据库学习笔记”相关的文章。但是不管怎样,今后如果用到了数据库的增删改查,肯定是这篇文章中的代码用的最多。

一、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代码时,后台输出如下:

【工程文件】

链接:http://pan.baidu.com/s/1qWqKreO

密码:9wed

时间: 2024-07-30 22:28:15

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

《Hibernate学习笔记十二》学生、课程、分数关系的设计与实现

<Hibernate学习笔记十二>学生.课程.分数关系的设计与实现 这个马士兵老师的Hibernate视频学习的一个题目,这里面要用到多对多.多对一的关联关系以及联合主键,因此觉得挺好的,自己写篇博文来记录下. 先考虑数据库表 1.学生表:为简单起见,只考虑了学生id和学生姓名,其中id为主键 2.课程表:为简单起见,只考虑了课程id和课程名称,其中id为主键 3.分数表 分数表有两种解决方案 3.1 第一种为:使用联合主键:student_id 和 course_id 3.2 第二种:不使用

laravel3学习笔记(十二)

原作者博客:ieqi.net ==================================================================================================== 请求反射 HTTP 协议本身是无状态性的,但是在应用中处理各种业务逻辑时我们必须要有状态的把控,这样,折中的办法就是将状态进行标记然后嵌入到 HTTP 协议的请求中,然后应用根据这些标记来进行状态的串联以及处理.所以我们就要对请求进行反射处理以获取请求信息, Lara

Swift学习笔记十二:下标脚本(subscript)

下标脚本就是对一个东西通过索引,快速取值的一种语法,例如数组的a[0].这就是一个下标脚本.通过索引0来快速取值.在Swift中,我们可以对类(Class).结构体(structure)和枚举(enumeration)中自己定义下标脚本的语法 一.常规定义 class Student{ var scores:Int[] = Array(count:5,repeatedValue:0) subscript(index:Int) -> Int{ get{ return scores[index];

虚拟机VMWare学习笔记十二 - 将物理机抓取成虚拟机

1. 安装VMware vCenter Converter Standalone Client 运行虚拟机,File -- Virtualize a Physical Machine 这时如果电脑中没有VMware vCenter Converter Standalone Client ,则会进行安装. 安装过程 之后图标会出现在桌面上,双击运行 选择连接到本地服务器,登陆 点击转换计算机 这个,可以将本地计算机抓取成虚拟机,也可以将其他可以访问的计算机(需知道管理员用户名及密码)抓取成虚拟机.

SpringBoot快速上手——《二》:SpringBoot集成SSM,实现增删改查功能

SpringBoot集成SSM,实现增删改查功能 github源码:https://github.com/xivinChen/SpringBoot 一.先介绍创建模块的另一种方式 1.点击Maven -> 勾选Create from archetype -> 选择 maven-archetype-quickstart 有时会需要点击 自动导入 2.工程目录 可以看到,这样创建的模块是相对干净的,需要我们手动的编写程序启动入口类.需要配置时还得创建配置文件.下一步见证. 3.完善模块 添加依赖,

MySQL常用SQL语句(Python实现学生、课程、选课表增删改查)

以基本的学生选课为例,建立选课数据库,学生.班级.选课信息三张表,并分别对表进行插删改操作: import MySQLdb try: conn = MySQLdb.connect(host = 'localhost', user = 'root', passwd = 'root', db = 'xuanke', port = 3306) cur = conn.cursor() cur.execute("CREATE DATABASE xuanke") cur.execute("

MyBatis学习(二)、SQL语句映射文件(2)增删改查、参数、缓存

二.SQL语句映射文件(2)增删改查.参数.缓存 2.2 select 一个select 元素非常简单.例如: Xml代码   <!-- 查询学生,根据id --> <select id="getStudent" parameterType="String" resultMap="studentResultMap"> SELECT ST.STUDENT_ID, ST.STUDENT_NAME, ST.STUDENT_SEX

小白5分钟上手c#数据库操作(三) 使用VisualStudio 1分钟快速完成一张表增删改查

VisualStudio 为了节省开发人员时间,提供了很多对数据库的快捷操作: 下面介绍使用GUI,快速搭建数据库表的增删改查: SQlite: 前期准备: 1. VisualStudio 安装两个插件: 2. 数据源准备: SQlite 制作的数据库一个 步骤: 1. 新建 winform 工程 2.拖拽一个DataGridView 3.添加数据源 4.选择数据库 5. 选择DataSet 6. 首次添加数据源,选择New 7. 进入添加Connection 界面并选择SQlite 8. 选择

MySQL学习笔记十二:数据备份与恢复

数据备份 1.物理备份与逻辑备份 物理备份 物理备份就是将数据库的数据文件,配置文件,日志文件等复制一份到其他路径上,这种备份速度一般较快,因为只有I/O操作.进行物理备份时,一般都需要关闭mysql服务器,或者对需要备份的对象进行锁定,要不很容易造成备份的不一致性,恢复时可能会丢失数据.物理备份的方式有很多,如操作系统命令copy(cp),scp,mysqlbackup,以及MyISAM表的mysqlhotcopy. 逻辑备份 逻辑备份是对数据库的逻辑结构(create database,cr

MySql数据库学习笔记(二)—MySQL使用

1.基本命令 1. 连接数据库 mysql –u用户名 –p密码 –h主机IP 2. 创建数据库 mysql> create database 数据库名 3. 创建表 mysql> create table 表名(列名 类型 primary key(定义主键) auto_increment ) 4. 查看所有数据库 mysql> show databases; 5. 选择数据库 mysql> use 数据库名; 6. 查看数据库所有的表 mysql> show tables;