浅谈JDBC编程
一、概述
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编程的更多相关文章
- 浅谈Socket编程
浅谈Socket编程 说到Socket,想必大家会觉得陌生又熟悉.许多同学听说过Socket,但仅仅知道它翻译成中文叫做套接字,除此之外似乎并没有太多的了解了.那么今天我就来抛砖引玉地聊一聊Socke ...
- 浅谈JDBC(一)
一.JDBC技术引言 1.什么是JDBC技术 提供了一套接口规范,利用java代码进行数据库操作. 2.JDBC技术的核心思想 对于程序员来说,代码访问数据库分为三个步骤:1.通过数据库的账号密码.2 ...
- 浅谈JDBC访问MySQL数据库
经过我自己的总结后,其实很简单,只需要记住四个步骤,JDBC这部分的学习就可以掌握差不多了,请多多指教. 加载注册JDBC驱动: 打开数据库: 创建向数据库发送sql语句的statement: Res ...
- iOS开发--浅谈CocoaAsyncSocket编程
Socket就是一种特殊的文件.它是一个连接了两个用户的文件,任何一个用户向Socket里写数据,另一个用户都能看得到,不管这两个用户分布在世界上相距多么遥远的角落,感觉就像坐在一起传纸条一样. 这么 ...
- 浅谈JDBC(二)
JDBC中的事务 简单来说,事务就是要保证一组DAO方法的操作,要么一起成功要么一起失败. 1.事务控制的位置 在Service中的业务方法内进行事务控制. 2.事务控制的代码 a.注意:JDBC会自 ...
- day10 浅谈面向对象编程
面向对象编程:第一步找名词,名词是问题域中的. 第二步概括名词设计成类.某些名词可以浓缩包含到其它名词中,成为其属性. 第三步找动词,动词也是问题域中的. 第四步概括动词设计成方法.动作的产生往往 ...
- 浅谈React编程思想
React是Facebook推出的面向视图层开发的一个框架,用于解决大型应用,包括如何很好地管理DOM结构,是构建大型,快速Web app的首选方式. React使用JavaScript来构建用户界面 ...
- 浅谈 JDBC 中 CreateStatement 和 PrepareStatement 的区别与优劣
先说下这俩到底是干啥的吧.其实这俩干的活儿都一样,就是创建了一个对象然后去通过对象调用executeQuery方法来执行sql语句.说是CreateStatement和PrepareStatement ...
- 浅谈 JavaScript 编程语言的编码规范
对于熟悉 C/C++ 或 Java 语言的工程师来说,JavaScript 显得灵活,简单易懂,对代码的格式的要求也相对松散.很容易学习,并运用到自己的代码中.也正因为这样,JavaScript 的编 ...
随机推荐
- Redis安装部署
Redis是一种高级key-value数据库.它跟memcached类似,不过数据 可以持久化,而且支持的数据类型很丰富.有字符串,链表,集 合和有序集合.支持在服务器端计算集合的并,交和补集(dif ...
- SQL Server 存储过程
Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这样就可以提高存储过程的性能. Ø ...
- Android sdk资源包res里面的drawable(ldpi、mdpi、hdpi、xhdpi、xxhdpi)
(1)drawable-hdpi里面存放高分辨率的图片,如WVGA (480x800),FWVGA (480x854) (2)drawable-mdpi里面存放中等分辨率的图片,如HVGA (320x ...
- 用 Python 排序数据的多种方法
用 Python 排序数据的多种方法 目录 [Python HOWTOs系列]排序 Python 列表有内置就地排序的方法 list.sort(),此外还有一个内置的 sorted() 函数将一个可迭 ...
- AADC安装指南
可选功能中,”密码哈希同步“可以将本地域账号的密码默认每三小时同步到O365:”密码回写“则是反过来,但是世纪互联的答复是”此功能需要Auzre AD Service功能,目前国内版还不支持使用,国际 ...
- 【iCore3双核心板】发布 iCore3 应用开发平台硬件原理图
原理图PDF下载地址:http://pan.baidu.com/s/1jHY0hNK iCore3应用开发平台购买地址:https://item.taobao.com/item.htm?spm=a1 ...
- SQL CREATE TABLE 语句\SQL 约束 (Constraints)\SQL NOT NULL 约束\SQL UNIQUE 约束
CREATE TABLE 语句 CREATE TABLE 语句用于创建数据库中的表. SQL CREATE TABLE 语法 CREATE TABLE 表名称 ( 列名称1 数据类型, 列名称2 数据 ...
- 自动化测试selenium----css选择器总结
选择器 示例 描述 * * 匹配任何元素 element DIV 标签选择器,匹配所有使用DIV标签的元素 .class .tips class选择器,匹配所有class属性中包含info的元素 ...
- Scala的trait
一:说明 1.介绍 2.功能 二:具体解释功能 1.定义接口 2.定义方法 3.定义字段 4.定义抽象字段 5.混合trait
- java 基础一
一.Java命名规则 Java命名规则有两种,第一种匈牙利命名要求望名知意,第二种驼峰命名要求首字母大写(关键单词) 类名必须首字母大写,方法名首字母小写后面的单词首字母大写 .类名和方法名要用英文开 ...