【声明】

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

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

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

【正文】

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

我们在之前的几篇文章中学习了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)

 package com.util.db;

 import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ResourceBundle; /**
* 数据库操作工具类
*
* @author lamp
*
*/
public class DBUtils { // 数据库连接地址
public static String URL;
// 用户名
public static String USERNAME;
// 密码
public static String PASSWORD;
// mysql的驱动类
public static String DRIVER; private static ResourceBundle rb = ResourceBundle.getBundle("com.util.db.db-config");

private DBUtils() {
} // 使用静态块加载驱动程序
static {
URL = rb.getString("jdbc.url");
USERNAME = rb.getString("jdbc.username");
PASSWORD = rb.getString("jdbc.password");
DRIVER = rb.getString("jdbc.driver");
try {
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} // 定义一个获取数据库连接的方法
public static Connection getConnection() {
Connection conn = null;
try {
conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
} catch (SQLException e) {
e.printStackTrace();
System.out.println("获取连接失败");
}
return conn;
} // 关闭数据库连接
public static void close(ResultSet rs, Statement stat, Connection conn) {
try {
if (rs != null)
rs.close();
if (stat != null)
stat.close();
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
} }

注意: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)

 package com.vae.domain;

 public class Person {
private int id;
private String name;
private int age;
private String description; 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;
} public String getDescription() {
return description;
} public void setDescription(String description) {
this.description = description;
} public Person(int id, String name, int age, String description) {
super();
this.id = id;
this.name = name;
this.age = age;
this.description = description;
} public Person(String name, int age, String description) {
super();
this.name = name;
this.age = age;
this.description = description;
} public Person() {
super();
// TODO Auto-generated constructor stub
} @Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age
+ ", description=" + description + "]";
} }

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

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

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

 package com.vae.dao;

 import java.sql.SQLException;
import java.util.List; import com.vae.domain.Person; public interface PersonDao {
// 添加方法
public void add(Person p) throws SQLException; // 更新方法
public void update(Person p) throws SQLException; // 删除方法
public void delete(int id) throws SQLException; // 查找方法
public Person findById(int id) throws SQLException; // 查找所有
public List<Person> findAll() throws SQLException; // 查询有几条记录
public long personCount() throws SQLException; }

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

 package com.vae.dao;

 import java.sql.SQLException;
import java.util.List; import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler; import com.util.db.DBUtils;
import com.vae.domain.Person; public class PersonDaoImpl implements PersonDao {
private QueryRunner runner = null;//查询运行器
public PersonDaoImpl(){
runner = new QueryRunner();
} //方法:向数据库中添加一条记录
@Override
public void add(Person p) throws SQLException {
String sql = "insert into person(name,age,description)values(?,?,?)";
runner.update(DBUtils.getConnection(), sql, p.getName(), p.getAge(),p.getDescription());
} //方法:根据id向数据库中修改某条记录
@Override
public void update(Person p) throws SQLException {
String sql = "update person set name=?,age=?,description=? where id=?";
runner.update(DBUtils.getConnection(), sql, p.getName(),p.getAge(),p.getDescription(),p.getId());
} //方法:根据id删除数据库中的某条记录
@Override
public void delete(int id) throws SQLException {
String sql = "delete from person where id=?";
runner.update(DBUtils.getConnection(), sql, id);
} //方法:使用BeanHandler查询一个对象
@Override
public Person findById(int id) throws SQLException {
String sql = "select name,age,description from person where id=?";
Person p = runner.query(DBUtils.getConnection(), sql, new BeanHandler<Person>(Person.class),id);
return p;
} //方法:使用BeanListHandler查询所有对象
@Override
public List<Person> findAll() throws SQLException {
String sql = "select name,age,description from person";
List<Person> persons = runner.query(DBUtils.getConnection(), sql, new BeanListHandler<Person>(Person.class));
return persons;
} //方法:使用ScalarHandler查询一共有几条记录
@Override
public long personCount()throws SQLException{
String sql = "select count(id) from person";
return runner.query(DBUtils.getConnection(),sql, new ScalarHandler<Long>());
} } 

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

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

 package com.vae.test;

 import java.sql.SQLException;
import java.util.List; import com.vae.dao.PersonDao;
import com.vae.dao.PersonDaoImpl;
import com.vae.domain.Person; public class Test { public static void main(String[] args) throws SQLException {
PersonDao dao = new PersonDaoImpl(); //dao.add(new Person("生命叁号",22,"我是通过Java命令而增加的记录")); //dao.update(new Person(1,"生命壹号",23,"我是通过Java命令而修改的记录")); //dao.delete(4); //Person p = dao.findById(1);
//System.out.println(p); //List<Person> persons = dao.findAll();
//System.out.println(persons); long count = dao.personCount();
System.out.println(count);
} }

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

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

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

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

【工程文件】

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

密码:9wed

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

  1. MYSQL进阶学习笔记十二:MySQL 表分区!(视频序号:进阶_29,30)

    知识点十三:MySQL 表的分区(29) 一.什么要采用分区: 分区的定义: 当数据量过大的时候(通常是指百万级或千万级数据的时候),这时候需要将一张表划分几张表存储.一些查询可以得到极大的优化,这主 ...

  2. python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL

    python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL实战例子:使用pyspider匹配输出带.html结尾的URL:@config(a ...

  3. Go语言学习笔记十二: 范围(Range)

    Go语言学习笔记十二: 范围(Range) rang这个关键字主要用来遍历数组,切片,通道或Map.在数组和切片中返回索引值,在Map中返回key. 这个特别像python的方式.不过写法上比较怪异使 ...

  4. python学习笔记(十 二)、操作数据库

    每一种语言都少不了多数据库进行各种操作. python支持多种数据库.有关python支持的数据库清单,请参阅:https://wiki.python.org/moin/DatabaseInterfa ...

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

    二.SQL语句映射文件(2)增删改查.参数.缓存 2.2 select 一个select 元素非常简单.例如: <!-- 查询学生,根据id --> <select id=" ...

  6. 学习MyBatis必知必会(5)~了解myBatis的作用域和生命周期并抽取工具类MyBatisUtil、mybatis执行增删改查操作

    一.了解myBatis的作用域和生命周期[错误的使用会导致非常严重的并发问题] (1)SqlSessionFactoryBuilder [ 作用:仅仅是用来创建SqlSessionFactory,作用 ...

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

    数据备份 1.物理备份与逻辑备份 物理备份 物理备份就是将数据库的数据文件,配置文件,日志文件等复制一份到其他路径上,这种备份速度一般较快,因为只有I/O操作.进行物理备份时,一般都需要关闭mysql ...

  8. 数据库学习笔记(二)MySQL数据库进阶

    MySQL 进阶 关于连表 左右连表: join 上下连表: union #自动去重 (当两张表里的数据,有重复的才会自动去重) union all #不去重 #上下连表示例: select sid, ...

  9. Python学习笔记(十二)—Python3中pip包管理工具的安装【转】

    本文转载自:https://blog.csdn.net/sinat_14849739/article/details/79101529 版权声明:本文为博主原创文章,未经博主允许不得转载. https ...

  10. java jvm学习笔记十二(访问控制器的栈校验机制)

    欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 本节源码:http://download.csdn.net/detail/yfqnihao/4863854 这一节,我们 ...

随机推荐

  1. Android应用与系统安全防御

    来源:HTTP://WWW.CNBLOGS.COM/GOODHACKER/P/3864680.HTML ANDROID应用安全防御 Android应用的安全隐患包括三个方面:代码安全.数据安全和组件安 ...

  2. 【干货分享】Node.js 中文资料导航

    这篇文章与大家分享一批高质量的的 Node.js 中文资料.Node.js 是一个基于 Chrome JavaScript 运行时建立的一个平台, 用来方便地搭建快速的, 易于扩展的网络应用 Node ...

  3. SharePoint 2013 术语和术语集介绍

    托管元数据是一个集中管理的术语的分层集合,我们可以定义术语和术语集,然后将其用作 SharePoint Server 2013 中项目的属性.简单的说,术语是一个可与 SharePoint Serve ...

  4. SharePoint Iframe 报错“此内容不能显示在一个框架中”

    问题描述 我们SharePoint站点用Excel Service发布的Excel,需要Iframe到其他系统中,但是,Iframe的时候发现报错“此内容不能显示在一个框架中”. 后来,尝试在其他系统 ...

  5. PL/SQL基础2(笔记)

    1 第一个PL/SQL的程序 DECLARE BEGIN DBMS_OUTPUT.PUT_LINE('Hello World!'); END; / --2一个简单的PL/SQL程序 DECLARE v ...

  6. Mac上的软件的一些对开发者有用的使用技巧(持续更新)

    内容大纲: Google浏览器设置开发者模式 正文: 1.Google浏览器设置开发者模式

  7. Cocos2d入门--2--三角函数的应用

    其实,三角函数的知识点是初中的数学基础.但是在编程里合理的利用的话,也会很好玩的,可以制作出很多有趣的动画特效. 首先要注意的是 角度 和 弧度 的转换. 360度 = 2×PI弧度 180度 =   ...

  8. java 的方法注释写在哪里?

    如果有接口,写在接口方法上即可.鼠标滑过方法名时时会显示 如果没有接口,写在每个方法上方. eclipse 分三步 ① 找到方法,并将光标移动至方法名的上方 ②/** ③回车 那,效果是酱紫

  9. SoapUI接口测试实例(webservice接口)

    接口测试步骤 注:以测试queryHistoryAccepts接口作举例. 1. 用户登录获取SessionKey实体信息 注:由于大部分的接口都需要SessionKey实体的信息,因此测试那些接口都 ...

  10. Effective Java 29 Consider typesafe heterogeneous containers

    When a class literal is passed among methods to communicate both compile-time and runtime type infor ...