浅谈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 的编 ...
随机推荐
- Linux安装软件时缺少依赖包的简单较完美解决方法!
大家在linux下源码安装时,有木有经常碰到缺少这个包那个包的,然后不知所措?看到最近有几个筒子安装thrift,安装python因缺少依赖包而进行不下去了.我用的是红帽,装系统的时候习惯把所有的有的 ...
- ANSI_NULLS和QUOTED_IDENTIFIER
这些是 SQL-92 设置语句,使 SQL Server 2000/2005 遵从 SQL-92 规则. 当 SET QUOTED_IDENTIFIER 为 ON 时,标识符可以由双引号分隔,而文字必 ...
- iOS宏和__attribute__
本文目录 iOS宏的经典用法 Apple的习惯 __attribute__ iOS宏的经典用法 1.常量宏.表达式宏 #define kTabBarH (49.0f) #define kScreenH ...
- NSNotification\KVO\block\delegate的区别和用法
在开发ios应用的时候,我们会经常遇到一个常见的问题:在不过分耦合的前提下,controllers间怎么进行通信.在IOS应用不断的出现三种模式来实现这种通信: 1.委托delegation: 2.通 ...
- SQLite的原子提交原理
本文描述了sqlite为保证数据库文件不被损坏而采取的种种手段.. 以下是原译者的摘要:http://www.kuqin.com/shuoit/20150618/346693.html 摘要: 本文源 ...
- Struts2+jQuery+Json零配置实现ajax
(一)Jsp页面代码 <%@ page language="java" import="java.util.*" pageEncoding="U ...
- Oracle总结
摘自:http://www.cnblogs.com/linjiqin/category/283838.html oracle decode用法 select decode( x , 1 , ‘x is ...
- C#拾遗-边边角角
1.扩展方法 public static 方法返回值类型 扩展方法名(this 要扩展类型 obj,调用扩展方法时需要的参数){ return "返回值"} 2.运算符重载 pub ...
- ios中调用友盟分享时qq可以分享但是微信失败,只显示文字,网页链接没有出现
问题如下,最后在老大各种替换的情况下,找到了原因,是因为图片失效了,友盟分享微信时必须需要图片才可以,如果服务器图片失效,则会失败: 注意下面的图片是否能够获取???????????????????? ...
- apachetop 实时监控apache指定日志
编译安装,压缩包戳我下载 帮助文档 # apachetop -h ApacheTop v0.12.6 - Usage: File options: -f logfile open logfile (a ...