浅谈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 的编 ...
随机推荐
- IPV6入门篇
引言 由于互联网的快速发展与普及,原有的IPV4地址已不能满足网络用户的需求,虽然NAT可以缓解IPV4地址的耗尽,但NAT破坏了网络环境的开放.透明以及端到端的特性,因此IPV6地址协议应运而生.I ...
- Python之路第一课Day2--随堂笔记
入门知识拾遗 一.bytes类型 bytes转二进制然后转回来 msg="张杨" print(msg) print(msg.encode("utf-8")) p ...
- React独立组件间通信联动
React是现在主流的高效的前端框架,其官方文档 http://reactjs.cn/react/docs/getting-started.html 在介绍组件间通信时只给出了父子组件间通信的方法,而 ...
- 试验删除RAC(ORA10G)节点
1.环境概述 2.删除一个节点 本实验中以删除第二个节点为示例. 2.1删除数据库实例 在第一个节点上(存活的节点)上使用DBCA删除第二个节点的实例. 执行完以上操作可以看下crs_stat –t ...
- tomcat配置https
1.开启使用https协议 编辑tomcat目录下的conf/server.xml文件 <Connector port="443" protocol="HTTP/1 ...
- struts-json-plugin result中配置对象的序列化
注意: 在使用strtus-json-plugin序列化对象属性,配置result标签下includeProperties属性时使用 对象名.*或则指定属性名的方式,不能光写对象属性名. 问题: ac ...
- XSS漏洞
跨站脚本攻击(也称为XSS)指利用网站漏洞从用户那里恶意盗取信息 坚决不要相信任何用户输入并过滤所有特殊字符.这样既可消灭绝大部分的XSS攻击.另一个建议是输出页面时将 < 和 > 变换成 ...
- andriod逆向实验截图
- QList
#include <QCoreApplication> #include<QList> #include<QDebug> int main(int argc, ch ...
- angularJs之service
自定义服务: 方法一:controller中返回值,service中return <!DOCTYPE html> <html> <head> <meta ch ...