24.【实现第一个JDBC程序】_聊城云在天的博客-程序员秘密

技术标签: web应用开发  

任务目标

1.了解数据库在web应用中的作用。
2.了解什么是JDBC
3.了解JDBC常用的API
4.利用JDBC能独立编写调用数据库记录的案例

数据库在web应用中的作用

  1. 平时见到的网站:学校网站、网易等。
  2. 本课程完成项目:web书城网站

JDBC简介

JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC为工具/数据库开发人员提供了一个标准的API,据此可以构建更高级的工具和接口,使数据库开发人员能够用纯 Java API 编写数据库应用程序。
不同种类的数据库(如MySQL、Oracle等)在其内部处理数据的方式是不同的。如果直接使用数据库厂商提供的访问接口操作数据库,应用程序的可移植性就会变得很差。例如,用户当前在程序中使用是MySQL提供的接口操作数据库,如果换成Oracle数据库,则需要重新使用Oracle 数据库提供的接口,这样代码的改动量会非常大。有了JDBC后,这种情况就不复存在了,因为它要求各个数据库厂商按照统一的规范来提供数据库驱动联系,所以用户就不必直接与底层的数据库交互,这使得代码的通用性更强。

在这里插入图片描述
从图中要以看出,JDBC在应用程序与数据库之间起到了一个桥梁作用。当应用程序使用JDBC访问特定的数据库时,需要通过不同数据库驱动与不同的数据库进行连接,连接后即可对该数据库进行相应的操作

创建JDBC程序的步骤

1.加载并注册驱动

注册数据库驱动的具体方式如下:
DriverManager.registerDriver(Driver driver);
或者
Class.forName(“DriverName”);
在注册数据库驱动时,虽然两种方法可以完成,但第一种会使数据库驱动被注册两次。这是因为Drive类的源码中,已经在静态代码块中完成了数据库驱动的注册。所以,为了避免数据库驱动被重复注册,我们一般都使用第二种方式Class.forName(“DriverName”);

2.通过DriverManager获取数据库连接

具体方式:
Connection conn=DriverManager.getConnection(String url,String user,String pwd)
说明:
(1)DriverManager类用于加载JDBC驱动并且创建与数据库的连接。在DriverManager类中的getConnection方法用于建立和数据库的连接,并且返回连接的Connection对象。
3个参数:
url:表示连接数据库的URL地址。书写格式如下:
jdbc:mysql://hostname:port/databasename
mysql批的是mysql数据库。Hostname指的是主机的名称(如果数据库在本机中,hostname可以为localhost或127.0.0.1; 如果要连接的数据库在其他电脑上hostname为所要连接电脑的IP),Port指的是连接数据库的端口号(mysql默认为3306),databasename指的是mysql中相应的数据库的名称。
User:登录数据库名
Pwd: 登录数据库密码
如果连接本机名为jdbc的数据库,代码如下:

Connection conn=DriverManager.getConnection(“jdbc:mysql://localhost:3306/jdbc”,”sa”,”sa”)

(2)Connection接口代表Java程序和数据库的连接,只有获得该连接对象后才能访问数据库,并操作数据库。

3.通过connection对象创建statement对象

Statement用于执行静态的sql语句,并返回一个结果对象,该接口的对象通过connection实例的createStatement()方法获得。利用该对象把静态的sql语句发送到数据库编译执行,然后返回数据库的处理结果。
Connection创建statement的方式有如下3种:
createStatement():创建基本的Statement对象
prepareStatement():创建PreparedStatement对象
prepareCall():创建CallableStatement 对象

4.使用statement执行sql语句

所有的Statement都有如下3种执行sql语句的方法。
Execute():可以执行任何sql语句
executeQuery():通常执行查询语句,执行后返回代表结果集的ResultSet对象
executeUpdate():主要用于执行DML的DDL语句。执行DML语句,如 insert、update或delete时,返回受sql语句影响的行数,执行ddl语句返回0(ddl:create table ,drop table等)
以executeQuery方法为例,其使用方式如下:
ResultSet rs=stmt.executeQuery(sql)

5.执行ResultSet结果集

如果执行的sql语句是查询语句,执行结果将返回一个ResultSet对象,该对象里保存了sql语句查询的结果。程序可以通过操作该ResultSet对象来取出查询结果

6.关闭连接,释放资源

每次操作数据库结束后都要关闭数据库连接,释放资源,包括关闭ResultSet、Statement和Connection等资源。
至此,JDBC程序大致实现步骤已经讲解完成。接下来,依照上面所讲解的步骤来演示JDBC的使用。

五、第一个JDBC程序实现

1. 数据库环境搭建

数据库驱动jar包
数据库创建代码

/*在MySQL中创建一个名称为chapter01的数据库,
  然后在该数据库中创建一个users表,SQL语句如下所示*/
CREATE DATABASE jdbc;
USE jdbc;
CREATE TABLE users(
		id INT PRIMARY KEY AUTO_INCREMENT,
		name VARCHAR(40),
		password VARCHAR(40),
		email VARCHAR(60),
		birthday DATE 
)CHARACTER SET utf8 COLLATE utf8_general_ci;

/*数据库和表创建成功后,再向users表中插入3条数据,SQL语句如下所示*/
INSERT INTO users(NAME,PASSWORD,email,birthday) 
VALUES('zs','123456','[email protected]','1980-12-04');
INSERT INTO users(NAME,PASSWORD,email,birthday) 
VALUES('lisi','123456','[email protected]','1981-12-04');
INSERT INTO users(NAME,PASSWORD,email,birthday) 
VALUES('wangwu','123456','[email protected]','1979-12-04');
/*为了查看数据是否添加成功,使用SELECT语句查询users表,SQL语句如下所示*/
SELECT * FROM users;

2.创建项目环境,导入数据库驱动

3.编写JDBC程序

public static void main(String[] args) throws SQLException {
		Statement stmt = null;
		ResultSet rs = null;
		Connection conn = null;
		try {
			// 1. 注册数据库的驱动
			Class.forName("com.mysql.jdbc.Driver");
			// 2.通过DriverManager获取数据库连接
			String url = "jdbc:mysql://localhost:3306/jdbc";
			String username = "root";
			String password = "root";
			conn = DriverManager.getConnection (url, username, 
		     			password);
			// 3.通过Connection对象获取Statement对象
			 stmt = conn.createStatement();
			// 4.使用Statement执行SQL语句。
			String sql = "select * from users";
			rs = stmt.executeQuery(sql);
			// 5. 操作ResultSet结果集
			System.out.println("id | name   | password | email  | birthday");
			while (rs.next()) {
				int id = rs.getInt("id"); // 通过列名获取指定字段的值
				String name = rs.getString("name");
				String psw = rs.getString("password");
				String email = rs.getString("email");
				Date birthday = rs.getDate("birthday");
				System.out.println(id + " | " + name + " | " + psw + " | " + email
							+ " | " + birthday);
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} finally{
			// 6.回收数据库资源
			if(rs!=null) {
				try {
					rs.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
				rs = null;
			}
			if(stmt!=null) {
				try {
					stmt.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
				stmt = null;
			}
			if(conn!=null) {
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
				conn = null;
			}
		}		
	}
}

ResultSet对象

Statement stmt=conn.createStatement(参数一,参数二)

createStatement返回的Statement对象是执行sql语句用的

第一个参数可以取值为

ResultSet.RTYPE_FORWORD_ONLY,只可向前滚动,也就是只能从第一个一直移动到最后一个。该选项为默认选项。(针对jdbc2.0)

ResultSet.TYPE_SCROLL_INSENSITIVE,双向滚动,但不及时更新,就是如果数据库里的数据修改过,并不在ResultSet中反应出来。

ResultSet.TYPE_SCROLL_SENSITIVE,双向滚动,并及时跟踪数据库的更新,以便更改ResultSet中的数据。

第二个参数可以取值为

ResultSet.CONCUR_READ_ONLY:这是缺省值,指定不可以更新 ResultSet

ResultSet.CONCUR_UPDATABLE:指定可以更新 ResultSet

public static void main(String[] args) {

Connection conn = null;

Statement stmt = null;

try {

   Class.forName("com.mysql.jdbc.Driver");

   String url = "jdbc:mysql://localhost:3306/chapter01";

   String username = "root";

   String password = "root";

   conn = DriverManager.getConnection(url, username, password);

   String sql = "select * from users";

            Statement st =conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

ResultSet rs = st.executeQuery(sql);

System.out.print("第2条数据的name值为:");

rs.absolute(2);        //将指针定位到结果集中第2行数据

System.out.println(rs.getString("name"));

System.out.print("第1条数据的name值为:");

rs.beforeFirst();      //将指针定位到结果集中第1行数据之前

rs.next();              //将指针向后滚动

System.out.println(rs.getString("name"));

             rs.previous();

             System.out.print("pervious name值为:");

System.out.print("第4条数据的name值为:");

rs.afterLast();        //将指针定位到结果集中最后一条数据之后

rs.previous();         //将指针向前滚动

System.out.println(rs.getString("name"));

} catch (Exception e) {

e.printStackTrace();

} finally { // 释放资源

if (stmt != null) {

try {

stmt.close();

} catch (SQLException e) {

e.printStackTrace();

}

stmt = null;

}

if (conn != null) {

try {

conn.close();

} catch (SQLException e) {

e.printStackTrace();

}

conn = null;

}

}

}

附recordset相关方法:
public boolean previous() 将游标向上移动,该方法返回boolean型数据,当移到结果集第一行之前时,返回false。

public void beforeFirst 将游标移动到结果集的初始位置,即在第一行之前。

public void afterLast() 将游标移到结果集最后一行之后。

public void first() 将游标移到结果集的第一行。

public void last() 将游标移到结果集的最后一行。

public boolean isAfterLast() 判断游标是否在最后一行之后。

public boolean isBeforeFirst() 判断游标是否在第一行之前。

public boolean ifFirst() 判断游标是否指向结果集的第一行。

public boolean isLast() 判断游标是否指向结果集的最后一行。

public int getRow() 得到当前游标所指向行的行号,行号从1开始,如果结果集没有行,返回0。

public boolean absolute(int row) 将游标移到参数row指定的行号。如果row取负值,就是倒数的行数,absolute(-1)表示移到最后一行,absolute(-2)表示移到倒数第2行。当移动到第一行前面或最后一行的后面时,该方法返回false

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lcachang/article/details/82946657

智能推荐

腾讯面试题:10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。_鸘鸘的博客-程序员秘密

腾讯面试题:10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写出思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存)。关于中位数:数据排序后,位置在最中间的数值。即将数据分 成两部分,一部分大于该数值,一部分小于该数值。

GitHub 的中国乱象:刷星、高仿、骂街和版聊_H.A.N的博客-程序员秘密

今天,我们关注一下人称全球最大程序员交友社区的 GitHub。这两天有朋友问我:你有关注前端圈最近的娱乐大新闻吗?然后扔给我一个网站,名叫前端娱乐圈:点进去看了下,是另一个程序员社区“掘金”的页面。ID 名为“花裤衩”的用户放了一张截图:虽然硅星人自己不是程序员,倒也还是对 GitHub 稍有了解的。这个 Trending 是统计项目每日增加的星数 (Star) 得来的,而在 GitH...

TSung 对Openfire测试_codeHH的博客-程序员秘密

我运行TSung的机器装的是Ubuntu 10.04 Server amd64。以下是从安装Tsung到使用Tsung对Openfire进行压力测试的步骤。1. 下载并安装Tsung.//安装Erlang及相关组件(必装)apt-get install erlang erlang-nox erlang-dev erlang-parsetools//安装生成报表必须的软件apt-

习题4.8 计算并输出一个整数各位数字之和。如,5423的各位数字之和为5+4+2+3。_Navigator_Z的博客-程序员秘密

Java程序设计基础(第5版) 陈国君 清华大学出版社 个人设计习题4.8 计算并输出一个整数各位数字之和。如,5423的各位数字之和为5+4+2+3。代码块:package App;import java.util.*;public class App1 { public static void main(String[] args) { int num; Scanner ...

gbk maven 打包_使用Maven编译项目遇到——“maven编码gbk的不可映射字符”解决办法-Fun言..._weixin_39688035的博客-程序员秘密

一、问题描述今天在MyEclipse中使用Maven编译项目源代码时,结果如下了如下的错误 百思不得其解啊,java源代码在MyEclipse中显示是没有任何错误的,可是执行”maven install”命令编译项目时就会出现上述的错误,导致项目编译失败。这个问题还是第一次遇到,还好在这里http://capslk.iteye.com/blog/1419958看到了解决问题的办法。二、解决办法解决...

Python3刷LeetCode基础用法回顾汇总(持续更新)_leecode python语法_mathlxj的博客-程序员秘密

笔者从2019年三月开始日刷一条LeetCode题目,LeetCode汇总了公司面试中常见的题目,免费题目有很多,分Easy,Medium,Hard等级,由于笔者对Python的很多常见用法未做过总结,借此机会总结用到的基本用法,算作学习笔记使用.LeetCode的网址为:https://leetcode.com/建议新手都可以从刷题开始,一开始的代码肯定不是最优的,在有好的想法时可以提升代码...

随便推点

技巧大集合,熬夜总结53个 Python 使用技巧和高性能方法_Python数据挖掘的博客-程序员秘密

大家好,今天给大家总结的一些干货技巧,非常有价值,尤其是对比c/c++有其他语言编程基础的小伙伴,记得收藏哦!干货推荐Python数据分析三剑客真香啊,还有高清思维导图绝了,这6个精挑细选的机器学习资料简直太香了Python编程从入门到实战,看这一篇足够了1. 易混淆操作本节对一些 Python 易混淆的操作进行对比。1.1 有放回随机采样和无放回随机采样import randomrandom.choices(seq, k=1) # 长度为k的list,有放回采样random.sa

POJ - 2888 Magic Bracelet burnside引理 有限制的计数_风所在的街道的博客-程序员秘密

因为珠子之间有限制,不能利用polya,我们只能回归到最原始的burnside引理看看能不能解决问题burnside引理说的是什么那,,就是你只要给我每个置换对应的不动点个数,我就可以给你方案数我们来尝试找出一个置换对应的不动点因为只有旋转,所以,对于旋转k次这个置换,置换群被分为g=gcd(n,k)个循环,我们会发现,对于不动点,每个循环中柱子应该是一样的,所以我们只需要看连续的长为

ARM 交叉编译移植mqtt并验证通信_mqtt arm_寒听雪落的博客-程序员秘密

其英文名称是:“Internet of things(IoT)”。顾名思义,物联网就是物物相连的互联网。于信息传输,MQTT是一种合适的协议工具。MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。1,下载paho.mqtt.-master.tar.gz,并

Windows7关闭默认共享_a5222885的博客-程序员秘密

注意:禁用默认共享会导致安装ORACLE时执行先决条件检测不通过,要想安装ORACLE得先打开共享。1、win+r 运行里输入compmgmt.msc进入计算机管理,在共享文件夹里,去掉所有的盘共享(这一步一定要干,不然后面的设置没效)2、win+r运行里输入regedit进入注册表编辑器,定位到HKEY_LOCAL_MACHINE---SYSTEM---CurrentCo...

centos普通用户解压缩报错:Cannot open: No such file or directory_centos 下压缩报错:无法 open: 没有那个文件或目录 tar: error is not _赵厚雄的博客-程序员秘密

使用普通用户解压缩文件,在tar命令前需要赋予命令sudo,否则会报Cannot open: No such file or directory错误。就是一个权限问题。sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等。这样不仅减少了root用户的登录 和管理时间,同样也提高了安全性。sudo不是对shell的一...

解决苹果电脑OS X 10.8.5或10.7.5 老版本系统升级问题_osx1085怎么升级 错误102_牛大胆的博客-程序员秘密

前置:准备把一个2012 late imac , 版本为 OS X 10.8.5的系统 升级到最新版本。结果 app store更新 报错(102)下载失败。下了最新固件做了启动盘。通过U盘安装后 系统版本没有变更 还是10.8.5,我当时一脸懵逼。通过app store下载一些辅助工具,提示我请先把系统升级到10.9以上。 各条路 都给我堵死了。通过我不断的在网上冲浪、冲浪、冲浪。终于找到了个靠谱的办法。分享一下;访问下面的技术支持地址:https://support.a.

推荐文章

热门文章

相关标签