JSP:JDBC

JDBC(Java Data Base Connectivity的缩写)是Java程序操作数据库的API,也是Java程序与数据库相交互的一门技术。

JDBC是Java操作数据库的规范,由一组用Java语言编写的类和接口组成,它对数据库的操作提供基本方法,但对于数据库的细节操作由数据库厂商进行实现,使用JDBC操作数据库,需要数据库厂商提供数据库的驱动程序。

关于Java程序与数据库相交互的示意图如下图所示。

JDBC(Java Database Connectivity) Java数据库连接,是一组用来按照统一方式访问数据库的API。它向程序员提供了独立于数据库的统一接口,可以使开发人员不必考虑所用的特定数据库便可编写应用程序,实现了Java与数据库的互连。

由一组用Java语言编写的类和接口组成。它能够:与数据库建立连接、发送SQL语句、处理结果JDBC的主要接口

java.sql.Driver:任何驱动程序类都应该实现这个接口。读取数据库驱动器的信息、提供connect方法用于建立访问数据库所用的Connection对象

java.sql.DriverManager:用于管理JDBC驱动程序一个接口(使用此接口能够获得与相应数据库的连接)

java.sql.Connection:表示驱动程序与数据库之间的连接。(使用此连接可以创建一个Statement对象)

java.sql.Statement:能对数据库执行SQL语句,并得到返回的结果

java.sql.ResultSet:表示从数据库服务器返回的结果集。

ResultSet 有如下几个方法

  1. boolean next()

用于将 ResultSet定位到下一行。

ResultSet最初是定位在第0行上的,此时应该先调用 next()方法将其定位到第1行上,然后才可输出。当 ResultSet已经到了最后一行时,再调用next()方法,则返回 false。

2. getXXX()

当 ResultSet已经定位在某一行上时,使用 getXxx ()方法得到这一行上单个字段的值。针对不同的字段类型,调用不同的getXxx ()方法(getString(col), getDate(col), getInt(col),...)

例:如果表中的第一个字段,字段名为"name",是文本型的; 则可以使用getString

(1)或 getString("name")来得到它的值。

如果表中的第三个字段,字段名为"score",是数值型的; 则可以使用getFloat(3)或 getFloat("score")来得到它的值。显示结果集中所有记录的前两列:

while(rs.next())

{

name =rs.getString(1);

phone =rs.getString(2);

System.out.println(name+","+phone);

}

JDBC连接数据库的过程

在了解了JDBC与数据库后,下面向大家介绍使用JDBC操作数据的开发流程,其关键步骤如下:(1)注册数据库驱动 :加载数据库驱动,注册到驱动管理器Class.forName("com.mysql.jdbc.Driver");

(2)构建数据库连接URL "JDBC协议+IP地址或域名+端口+数据库名称"

MySQL连接URL的字符串为:"jdbc:mysql://localhost:3306/test"

(3)获取Connection对象

注册了数据库驱动及构建数据库URL后,通过驱动管理器获取数据库的连接Connection,Connection对象是JDBC封装的数据库连接对象,创建此对象后,才可以对数据库进行相关操作:DriverManager.getConnection(url, username, password);

使用JDBC驱动程序访问数据库

获取相应数据库的jdbc驱动程序,并将它们保存在指定的位置, 然后重新启动tomcat服务;

连接的具体步骤:以打电话通知同学为你带书为例...编写程序的具体步骤编写****程序

加载驱动程序;---打开手机、找到电话簿:亲人、同学、朋友

定义所要连接数据库的地址;---定位到同学

建立与数据库的连接;--拨号给他打电话

建立语句对象;--接通后,你(对象)可以跟他(数据库)交流了

声明并执行SQL语句;--任务:帮你带书

处理返回的结果; --给带或是不能带

关闭对象;--挂电话

首先应该导入java.sql包。语句为: <%@ page import="java.sql.*" %>

利用Class.forName()方法加载某一个数据库的驱动程序。

语法:Class.forName("JDBC驱动程序类");

方法:例1:使用JDBC/ODBC桥驱动程序:Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

例2:使用SQLServer的驱动程序:Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");

经过以上其中之一语句的声明后,驱动程序就会自动地加载。

注意:如果classpath路径中没有找到所需的驱动程序则会抛出 ClassNotFoundException异常。

通过此步骤,定义要连接的数据库资源

String ODBCURL= " jdbc:odbc:dbName";

String sqlserverURL= " jdbc:microsoft:sqlserver://host:1433;DatabaseName=dbName ";

String mysqlURL= "jdbc:mysql://host:port/dbName ";

String oracleURL= "jdbc:oracle:thin:@host:port:dbName ";

不同数据库连接的地址不同,这点需要特别注意

URL由3部分组成,各个部分用冒号间隔,格式如下:jdbc:<子协议>:<子名称>

JDBC URL的3部分可分解如下:jdbc:JDBC中的协议就是jdbc。

<子协议>:数据库驱动程序名或数据库连接机制的名称。子协议的典型示例为oracle,它用于连接oracle数据库。

<子名称>:一种标记数据库的方法。子名称根据子协议的不同而不同,使用子名称的目的是为定位数据库

例如 jdbc:oracle:thin:@[ip]:[port]:[sid]

**子协议现在是 oracle子名称现在由四部分构成:包括驱动程序类型thin数据库服务器的IP地址、**提供服务的端口号、数据库的名字

语法:Connection con=DriverManager.getConnection(url,"登录数据库用户名","登录密码");

例:以SQLServer连接数据库book为例,用户名为sa,密码为123

Class.forName(" com.microsoft.jdbc.sqlserver.SQLServerDriver ");

String connStr=" jdbc:microsoft:sqlserver://host:1433;DatabaseName=book";

Connection conn = DriverManager.getConnection(connStr, " sa", " 123");

利用 Connection接口à createStatement() 方法创建语句对象。

例:Statement stmt=conn.createStatement();

语句对象用于执行SQL语句。该对象负责将SQL语句传递给数据库管理系统执行;声明SQL语句,并将该语句通过Statement对象提交给服务器进行执行。

String sql= " SELECT * FROM book ";//上面的语句用于从book表中查询所有记录。

ResultSet resultSet=stmt.executeQuery(sql);//该语句将sql命令提交给数据库服务器进行执行,并将执行结果存储在ResultSet对象中进行执行。

Statement接口主要有如下三个方法:

  1. ResultSet executeQuery(String sql)以sql语句为参数,执行sql查询语句;

返回ResultSet结果集(一个二维表)

例如:

Statement stmt=con.createStatement();

Stringsql= " SELECT * FROM book ";

ResultSet rs=stmt.executeQuery(sql);

  1. int executeUpdate(String sql)

以sql语句为参数,执行sql更新语句及DDL语句,如添加、删除或修改操作,返回被受影响记录的条数。例如:

Statement stmt=con.createStatement();

String sql= " delete FROM book where bookid= " + " '12335' ";

int i=stmt.executeUpdate(sql);

System.out.println(i);

  1. boolean execute(String sql)

用于执行实现不知道类型的SQL语句,既可以执行查询语句,也可以执行更新语句。

常用于动态的处理未知的SQL语句,事先无法知道该SQL语句的具体类型及执行的返回值。

执行参数部分的SQL语句:

当SQL语句的执行结果是一个ResultSet结果集时,本方法返回true;并可以通过StatementàgetResultSet()方法得到返回的结果集

当SQL语句执行后没有返回的结果集时,该方法返回false

Statement对象负责将SQL语句传递给数据库管理系统执行,返回的是一个ResultSet的对象。 ResultSet对象,称为结果集,是符合条件的所有行的集合。

可以通过(first(), last(), previous(), next(), absolute(int), ...) 方法浏览可滚动结果集中的内容rs.close();//关闭结果集

stmt.close();//关闭语句对象

con.close();//关闭连接

将打开的资源关闭。注意:资源关闭的顺序和打开的顺序恰恰相反。

异常处理 数据库访问中可能会发生异常(如无法连接),需要做异常处理

编写Servlet时,需要将访问数据库代码放在try-catch结构中,

try { ...}catch(SQLExceptionex){ ...}

在编写JSP页面时,数据库操作可以不写try-catch, 服务器将JSP编译成Servlet时会自动加上try-catch

例7.2 通过JDBC连接MySQL数据库

(1)创建名称为10.1的动态Web项目,将MySQL数据库的驱动包添加至项目的构建路径,构建开发环境

(2) 创建程序中的主页index.jsp,在该页面中加载数据库驱动并创建数据库连接

**应用程序为了能和数据库交互信息,必须首先和数据库建立连接。目前在开发中常用的连接数据库的方式是加载****JDBC-**数据库驱动程序。

Java语言编写的数据库驱动程序称作****JDBC-数据库驱动程序。JDBC可以调用本地的JDBC-数据库驱动程序和相应的数据库建立连接,如图所示。

使用JDBC-数据库驱动程序方式和数据库建立连接需要经过2个步骤

**①加载JDBC-**数据库驱动程序

② 和指定的数据库建立连接。

**使用JDBC-数据库驱动程序访问数据库时,必须要保证连接数据库的应用程序所驻留的计算机上安装有相应JDBC-数据库驱动程序,比如,Tomcat服务器上的某个Web应用程序想访问MySQL数据库管理系统所管理的数据库,那么Tomcat服务器所驻留的计算机上必须要安装MySQL提供的****JDBC-**数据库驱动程序。

登录MySQL的官方网站www.mysql.com下载JDBC-数据库驱动程序(JDBC Driver for MySQL)。本教材下载的是mysql-connector-java-5.1.28.zip

**解压后的mysql-connector-java-5.1.28-bin.jar复制到Tomcat服务器所使用的JDK的扩展目录中。应用程序加载MySQLJDBC-**数据库驱动程序代码如下:

try{

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

**}**catch(Exception e){

}

Java.sql包中的DriverManager****类有两个用于建立连接的类方法:

ConnectiongetConnection(java.lang.String,java.lang.String,java.lang.String)

ConnectiongetConnection(java.lang.String)

数据库服务器占用的端口是3306,假设MySQL数据库服务器所驻留的计算机的IP地址是192.168.100.1。应用程序要和warehouse建立连接,用户的id和密码分别是root99

那么使用ConnectiongetConnection**(java.lang.String,java.lang.String,java.lang.String)**

方法建立连接的代码如下:

try{ Stringuri= "jdbc:mysql:// 192.168.100.1:3306/warehouse"

String user ="root";

String password ="99";

con =DriverManager.getConnection(uri,user,password);

**}**catch(SQLExceptione){

System.out.println**(e);**

}

使用ConnectiongetConnection**(java.lang.String)** 方法建立连接的代码如下:

try{ Stringuri=****"jdbc:mysql:// 192.168.100.1:3306/warehouse?user=root&password=99";

con =DriverManager.getConnection(uri);

**}**catch(SQLExceptione){

System.out.println**(e);**

}

在某些Web程序中需要避免操作数据库出现中文乱码**,**那么需要使用

ConnectiongetConnection(java.lang.String)方法建立连接,连接中的代码是(假设用户是root**,其密码是99):**

Stringuri= "jdbc:mysql://127.0.0.1/warehouse?"+****"user=root&password=&characterEncoding=gb2312";

con =DriverManager.getConnection(uri);

应用程序一旦和某个数据库建立连接,就可以通过****SQL语句和该数据库中的表交互信息,比如查询、修改、更新表中的记录

JDBCJava Web****中的应用

1、开发模式

在Java Web开发使用JDBC,应遵循MVC的设计思想,从而使用Web程序拥有一定的健壮性、可扩展性。JDBC应用于Java Web开发中,处于MVC之中的模型层位置,如下图所示。

2、分页查询

分页查询是Java Web开发之中十分常用的技术。在数据库量非常大的情况下,不适合将所有数据显示到一个页面之中,既给查看带来有便,又占用了程序及数据库的资源,此时就需要对数据进行分页查询。

通过JDBC实现分页查询的方法有很多种,而且不同的数据库机制也提供了不同的分页方式,两种非常典型的分页方法。

1、通过ResultSet的光标实现分页

2、通过数据库机制进行分页

连接MySQL数据库和连接Oracle数据库的方法非常类似。只是有两个地方需要注意一下

  1. 需要把MySQL的驱动程序mysql-connector-java-5.0.4-bin.jar部署到"/WEB-INF/lib/"下。(MySQL驱动程序可以从其官方网站www.mysql.com上下载)

2). 注册驱动程序和获取连接的语句变为:

Class.forName("com.mysql.jdbc.Driver");或者Class.forName("org.gjt.mm.mysql.Driver");

Connection con = DriverManager.getConnection("jdbc:mysql://[ip]:[port]/[sid]","Login","password");

例:

<%@page contentType="text/html; charset=GBK" %>

<%@page import="java.sql.*" %>

<%

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

Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/book","root","123");

Statement stmt = con.createStatement();

stmt.executeUpdate("create table table1(id int, name varchar(30))");

stmt.executeUpdate("insert into table1 values(10, 'java')");

stmt.executeUpdate("insert into table1 values(20, 'JSP')");

out.print("table1 has been created!");

stmt.close(); con.close();

%>

相关推荐
挺菜的7 分钟前
【算法刷题记录(简单题)003】统计大写字母个数(java代码实现)
java·数据结构·算法
掘金-我是哪吒1 小时前
分布式微服务系统架构第156集:JavaPlus技术文档平台日更-Java线程池使用指南
java·分布式·微服务·云原生·架构
亲爱的非洲野猪1 小时前
Kafka消息积压的多维度解决方案:超越简单扩容的完整策略
java·分布式·中间件·kafka
wfsm1 小时前
spring事件使用
java·后端·spring
微风粼粼2 小时前
程序员在线接单
java·jvm·后端·python·eclipse·tomcat·dubbo
缘来是庄2 小时前
设计模式之中介者模式
java·设计模式·中介者模式
rebel2 小时前
若依框架整合 CXF 实现 WebService 改造流程(后端)
java·后端
代码的余温3 小时前
5种高效解决Maven依赖冲突的方法
java·maven
慕y2743 小时前
Java学习第十六部分——JUnit框架
java·开发语言·学习
paishishaba3 小时前
Maven
java·maven