一、概述

1.为什么要用JDBC

数据库是程序不可或缺的一部分,每一个网站和服务器的建设都需要数据库。对于大多数应用程序员(此处不包含数据库开发人员)来说,我们更多的不是在DBMS中对数据库进行操纵,而是在我们编写的程序中对数据库进行访问,Java程序中一般都是通过JDBC来连接服务器并进行增删改查操作的。下面,就来具体介绍一下JDBC编程。

2.SQL语言的分类

根据所进行操作种类的不同,结构化查询语言SQL分为三类,分别为:

(1)DQL:数据查询语言    例:select

(2)DML:数据操纵语言      例:insert、update、delete

(3)DDL:数据定义语言       例:create

二、JDBC编程所需要的准备

1.开发环境准备

首先需要配置集成开发环境,本例中使用的IDE为MyEclipse2014,数据库为MySQL数据库。在我们进行编程之前,首先还要引用MySQL官方提供的jar包,该包中提供了数据库驱动,数据库驱动的加载是JDBC编程必不可缺的步骤。

引用jar包的步骤(在MyEclipse中):

(1)在项目路径下建立lib文件夹

(2)下载获得jar包,并复制到lib文件夹下

(3)右键单击导入到lib文件夹中的jar包,选择Build Path,之后添加到Build Path,添加到引用列表

在配置好了集成开发环境并引入MySQL的jar包后,我们就可以开始我们的JDBC编程了。

2.数据库准备

我们建立了一个存储员工的WORKER表,建表语句如下:

 create table WORKER (
worker_num varchar(10),
worker_name varchar(20) not null,
worker_dept int(3),
worker_address varchar(50),
worker_sal int(5),
worker_level varchar(10),
constraint pk_worker_num primary key(worker_num),
);

三、开始编写第一个JDBC程序

1.JDBC程序编写流程:

(1)加载数据库驱动

数据库驱动,就是应用于特定数据库的一套实现了JDBC接口的类集。我们在准备的时候加载了mysql数据库对应的jar包,其中就有数据库驱动。只有加载了数据库驱动,才能够继续进行对数据库的操作。

 //加载数据库驱动的代码如下
Class.forName("com.mysql.jdbc.Driver");

其中,forName方法的参数由不同的数据库决定,这里我们加载的是MySQL数据库的驱动。

(2)定义数据库的url(统一资源定位符)

url是获取连接的必须要素,其格式如下:协议、IP地址、端口号、数据库名

我们定义的url如下:

String url = “jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8”

其中,jdbc:mysql为协议部分;localhost为IP地址,此处是本机;3306为MySQL的默认端口号;mydb为数据库名;问号后面部分的作用是防止乱码。

(3)获得数据库连接(Connection对象)

要想进行对数据库的操作,首先需要获得数据库的连接对象,JDBC中我们使用DriverManager的静态方法进行连接对象的初始化。

 //获得数据库连接对象的代码如下:
Connection conn = DriverManager.getConnection(url, userName, passWord);

    其中getConnection方法有三个String类型的参数,分别为数据库连接的url,数据库登陆的用户名和数据库登陆的密码。

(4)创建Statement并初始化

Statement是用来执行语句的,我们利用Connection的内置方法对Statement进行初始化,之后通过Statement对象执行SQL语句。

//创建Statement对象的代码如下:
Statement stmt = conn.createStatement();

  其中,conn为已经获得的Connection对象

(5)执行SQL语句

(6)释放数据库资源

数据库资源是有限的,如果一直不释放连接对象,那么一旦达到上限,则之后的应用无法获取连接对象,也就无法继续程序的执行;同理,Statement对象会占用内存,一旦内存使用完毕,也会阻碍程序的执行。因此,我们要在每次使用完这些对象后进行关闭。

2.一个对数据库进行DQL操作的例子

 1 //连接数据库,并进行查询
2 public class JdbcTest {
3 public static void main(String[] args) {
4 String url = "jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8";
5 String user = "root";
6 String psw = "root";
7 String sql = "select * from WORKER";
8 Connection conn = null;
9 Statement stmt = null;
10 ResultSet rs = null;
11 try {
12 Class.forName("com.mysql.jdbc.Driver");
13 conn = DriverManager.getConnection(url, user, psw);
14 stmt = conn.createStatement();
15 rs = stmt.executeQuery(sql);
16 while(rs.next()) {
17   String workerNumber = rs.getString("worker_num");
18 System.out.println(workerNumber);
19 }
20
21 } catch (ClassNotFoundException e) {
22 e.printStackTrace();
24 } catch (SQLException e) {
25 e.printStackTrace();
26 }finally {
27 try {
28 stmt.close();
29 conn.close();
30 } catch (SQLException e) {
31 e.printStackTrace();
32 }
33 }
36 }
37 }

  其中,ResultSet是结果集对象,用来接收查询的结果,最后从结果集中获得查询到的数据,进行输出。

四、JDBC程序编写的改进

1.将配置文件与程序分离

工具类的抽象方法是将一段需要执行多次的代码抽象出来,形成工具方法。除却此改进外,JDBC程序还可以利用配置文件,来将配置信息与程序分隔开来(这种方法被称为软编码),这样能够避免在修改配置信息的时候修改程序,导致需要大量的对程序的重新测试。

常用的配置文件有两种类型,一种是.xml文件,另一种是.properties文件。在这里由于我们需要的配置都是一些二维的基本字符串,所以可以采用.properties文件进行配置。

配置文件如下:

 #db.properties
driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8
username = root
password = root

2.对可复用代码的封装

仔细想一想JDBC程序的执行过程,会发现有很多操作是每次进行数据库连接都需要做的:如果我们有几个需要操作数据库的类需要连接相同的数据库并对其执行数据操作,那么我们就可以把获得Connection对象的功能抽象出来,形成一个单独的工具类。具体如下:

 //工具类的编写
public class JDBCUtils {
private static String driverClass;
private static String url;
private static String userName;
private static String passWord;
static {
       //对资源文件的读取
Properties p = new Properties();
try {
p.load(JDBCUtils.class.getResourceAsStream("db.properties"));
} catch (IOException e) {
e.printStackTrace();
}
driverClass = p.getProperty("driver");
url = p.getProperty("url");
userName = p.getProperty("username");
passWord = p.getProperty("password");
try {
Class.forName(driverClass);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection(){
Connection conn = null;
try {
conn = DriverManager.getConnection(url, userName, passWord);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
public static void closeAll(ResultSet result, Statement stmt, Connection conn) {
try {
result.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void closeAll(PreparedStatement stmt, Connection conn) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}

  工具类的编写中,我们用到了static块,此处static块中包含的部分是只需要在类加载的时候执行的类,同时们把工具方法设置成静态方法,方便调用。

3.改进后的JDBC程序

 public class NewGetWorker {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
ResultSet result = null;
String sql = "select * from WORKER";
conn = JDBCUtils.getConnection();
try {
stmt = conn.createStatement();
result = stmt.executeQuery(sql);
while(result.next()) {
String workerNum = result.getString("worker_num");
String workerName = result.getString("worker_name");
String workerAddress = result.getString("worker_address");
String workerLevel = result.getString("worker_level");
System.out.println(workerNum + " " + workerName + " " + workerAddress + " " + workerLevel);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUtils.closeAll(result, stmt, conn);
} }
}

  由改进后的程序中可以看到,我们可以直接调用工具类中的方法获取连接对象,同时在finally块中调用工具类的close方法对对象进行关闭,这样做有效的增加了代码的复用性。

五、总结

JDBC是Java提供的一套与数据库进行连接的API的集合。利用这些API,已经可以满足日常开发中Java程序连接数据库的需求。关于JDBC的内容远不止于这一篇博文的介绍,还有很多后续知识的介绍。相信看过了这篇博文,大家会对JDBC程序的编写已有了初步的了解,后续还会写更多文章进行介绍。

ps.博主也是正在学习路上的菜鸟,有想一起学习的小伙伴欢迎交流哈。

浅谈JDBC编程的更多相关文章

  1. 浅谈Socket编程

    浅谈Socket编程 说到Socket,想必大家会觉得陌生又熟悉.许多同学听说过Socket,但仅仅知道它翻译成中文叫做套接字,除此之外似乎并没有太多的了解了.那么今天我就来抛砖引玉地聊一聊Socke ...

  2. 浅谈JDBC(一)

    一.JDBC技术引言 1.什么是JDBC技术 提供了一套接口规范,利用java代码进行数据库操作. 2.JDBC技术的核心思想 对于程序员来说,代码访问数据库分为三个步骤:1.通过数据库的账号密码.2 ...

  3. 浅谈JDBC访问MySQL数据库

    经过我自己的总结后,其实很简单,只需要记住四个步骤,JDBC这部分的学习就可以掌握差不多了,请多多指教. 加载注册JDBC驱动: 打开数据库: 创建向数据库发送sql语句的statement: Res ...

  4. iOS开发--浅谈CocoaAsyncSocket编程

    Socket就是一种特殊的文件.它是一个连接了两个用户的文件,任何一个用户向Socket里写数据,另一个用户都能看得到,不管这两个用户分布在世界上相距多么遥远的角落,感觉就像坐在一起传纸条一样. 这么 ...

  5. 浅谈JDBC(二)

    JDBC中的事务 简单来说,事务就是要保证一组DAO方法的操作,要么一起成功要么一起失败. 1.事务控制的位置 在Service中的业务方法内进行事务控制. 2.事务控制的代码 a.注意:JDBC会自 ...

  6. day10 浅谈面向对象编程

    面向对象编程:第一步找名词,名词是问题域中的. 第二步概括名词设计成类.某些名词可以浓缩包含到其它名词中,成为其属性. 第三步找动词,动词也是问题域中的.   第四步概括动词设计成方法.动作的产生往往 ...

  7. 浅谈React编程思想

    React是Facebook推出的面向视图层开发的一个框架,用于解决大型应用,包括如何很好地管理DOM结构,是构建大型,快速Web app的首选方式. React使用JavaScript来构建用户界面 ...

  8. 浅谈 JDBC 中 CreateStatement 和 PrepareStatement 的区别与优劣

    先说下这俩到底是干啥的吧.其实这俩干的活儿都一样,就是创建了一个对象然后去通过对象调用executeQuery方法来执行sql语句.说是CreateStatement和PrepareStatement ...

  9. 浅谈 JavaScript 编程语言的编码规范

    对于熟悉 C/C++ 或 Java 语言的工程师来说,JavaScript 显得灵活,简单易懂,对代码的格式的要求也相对松散.很容易学习,并运用到自己的代码中.也正因为这样,JavaScript 的编 ...

随机推荐

  1. C#对图片的操作

    1.根据图片路径返回字节 public static byte[] getImageByte(string imagePath) { FileStream files = new FileStream ...

  2. css样式

    这是CSS的定义经常用到的样式: body{ width:100%; background:#000; text-align:center;font:12px "宋体", Aria ...

  3. Ext之ExtGrid增删改查询回顾总结

    学习Ext已经有些许时间了,发现实际运用过程中ExtGrid系列还是最为常用的,本来想自己写些话语来总结的,无意间看到有位仁兄早就总结了,故冒犯贴在此处,以便以后翻阅,还望见谅 Ext - Grid  ...

  4. Git 常用命令行

    最近在公司的服务器上安装了Git Sever,开始从SVN转向到Git了,整理了一些在Git常用的命令. 取得Git仓库 初始化一个版本仓库 git initClone远程版本库 git clone ...

  5. Ubuntu使用阿里云软件源

    如果在安装Ubuntu时,选择的地区为美国,建议更新为阿里云或国内 软件源 sudo sed -i s/archive.ubuntu.com/mirrors.aliyun.com/g /etc/apt ...

  6. E/dalvikvm: Could not find class...

    logcat日志输出信息: - ::-/net.chiangfai I/dalvikvm: Could not find method android.content.res.Resources.ge ...

  7. mysql大表myisam的导入

    在my.cnf中增大以下参数 myisam_sort_buffer_size = 1024Mtmp_table_size = 256M tmpdir = /home/tmpmyisam_max_sor ...

  8. Selenium2学习-042-Selenium3启动Firefox Version 48.x浏览器(ff 原生 geckodriver 诞生)

    今天又被坑了一把,不知谁把 Slave 机的火狐浏览器版本升级为了 48 的版本,导致网页自动化测试脚本无法启动火狐的浏览器,相关的网页自动化脚本全线飘红(可惜不是股票,哈哈哈...),报版本不兼容的 ...

  9. 在Update表数据同时将数据备份

    分享一条有意思的SQL语句,也是前两天有个朋友在面试的时候碰到的,他当时没有做出来,回来之后问我, 如何在同一条语句中实现,更新表的时候同时备份更新前的记录数据. --在修改数据前,先要把修改前的数据 ...

  10. 就publish/subscribe功能看redis集群模式下的队列技术(一)

    Redis 简介 Redis 是完全开源免费的,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中 ...