Download presentation
Presentation is loading. Please wait.
1
Chapter13 Java数据库连接 授课教师:赵小敏 浙江工业大学 软件学院
2
学习目标 了解JDBC技术及Java.sql包的类和接口 理解使用Java.sql包的类进行基本的数据库查询
3
JDBC技术 JDBC本省是一个产品的商品名,它可被看做Java数据库连接的简称(Java DataBase Connectivity)。
JDBC是一组用java语言编写的类组成,它已成为一种供数据库开发者使用的标准API,用户可以用纯JAVA API来编写数据库应用。
4
JDBC的基本功能 建立与数据库的连接; 发送SQL语句; 处理数据库操作结果。
5
JDBC在数据库访问的两层与三层模型
6
JDBC接口概貌 JDBC接口分为两个层次:一个是面向程序开发人员的JDBC API,另一个是底层的JDBC Driver API
7
JDBC接口定义 JDBC API在java.sql包的主要类有:
1、DriverManager类:处理驱动程序的装入,为新的数据库连接提供支持,驱动程序要向该类注册后才能被使用,当进行连接时该类根据JDBC URL选择匹配的驱动程序; 2、java.sql.Driver类:驱动程序接口,负责确认URL与驱动程序的匹配,建立到数据库的连接等;
8
JDBC接口定义 3、java.sql.Connection类:表示到特定数据库的连接,其中的方法需要有相应的驱动程序实现;
4、java.sql.Statement类:为SQL语句提供一个容器,包括执行SQL语句、取得查询结果等方法;其中java.sql.Statement又有两个子类: Java.sql.PreparedStatement用于执行预编译的SQL语句; Java.sql.CallableStatement用于执行对一个数据库内嵌过程的调用
9
JDBC接口定义 5、java.sql.ResultSet类:提供对结果集进行处理的手段。 6、JDBC API其它的类和接口查看API
10
数据库连接 建立一个连接用户在访问数据库时要在JDBC管理层java.sql.DriverManager。getConnection方法产生一个java.sql.Connection对象。该方法使用一个URL串作为地址参数。 选择合适的驱动程序。在数据库URL中,可以指定驱动程序的名称,也可不指定。 数据库URL在连接时,由数据库URL指定要连接的数据库,此时可称为JDBC URL,其格式为: jdbc:<子协议>:<子名称> 子协议odbc表示对odbc数据源的访问,其格式为: jdbc:odbc<数据源名>[:<属性名>=<属性值>]
11
如何建立数据源? 开始->控制面板->管理工具-> ODBC数据源进入,选择“系统DSN”项,点击“添加…”
12
数据传递和结果接收 1、查询 执行一条查询语句后,返回的是由java.sql.ResultSet对象访问的行的集合。在该对象中提供了一系列get方法,访问当前的每一个数据项,ResultSet.next方法可实现在结果集的记录之间移动,可以使用数据项。 2、输入参数(IN) Java.sql.PrepareStatement接口提供了一系列setXXX方法向SQL语句传递输入参数,实现动态的SQL语句。在传递参数时,必须满足数据类型一致的要求。
13
数据传递和结果接收 3、输出参数(OUT) 在调用一个存储过程时,可用setXXX方法传递输入参数,使用输出参数接收返回结果。在使用时,必须先调用CallableStatement.registerOutParameter方法为每一个输出参数进行类型注册,然后执行该过程调用语句,最后使用getXXX方法取出输出参数的结果。
14
数据传递和结果接收 4、数据截断 如果使用Statement.setMaxFieldSize设置了列值的最大长度时,数据超过设置的最大长度将被截断。 5、SQL数据类型到Java类型的转换 SQL数据类型与Java类型的差异较大,JDBC提供了详细的SQL类型与Java类型转换的方法。常见JDBC类型与Java类型对照表见P365
15
JDBC应用 一、与数据库建立连接: 1、加载驱动程序
JDBC-ODBC桥接驱动程序,或由数据库厂商提供的驱动程序,或通过设置Java属性中的sql.driver来指定驱动程序。 加载驱动程序的两种基本方法: DriverManager类的静态方法registerDriver java.lang.Class类的forName方法
16
加载Oracle JDBC驱动程序 DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); 或 Class.forName(“oracle.jdbc.driver.OracleDriver”)
17
加载MS SQL Server JDBC驱动程序
DriverManager.registerDriver(new com.microsoft.jdbc.sqlserver.SQLServerDriver ()); 或 Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver”)
18
加载IBM DB2驱动程序 DriverManager.registerDriver(new com.ibm.db2.jdbc.app.DB2Driver ()); 或 Class.forName(“com.ibm.db2.jdbc.app.DB2Driver ”)
19
加载IBM Informix驱动程序 DriverManager.registerDriver(new com.informix.jdbc.IfxDriver ()); 或 Class.forName(“com.informix.jdbc.IfxDriver”)
20
加载Sybase驱动程序 DriverManager.registerDriver(new com.sybase.jdbc.SybDriver ()); 或 Class.forName(“com.sybase.jdbc.SybDriver”)
21
加载MySQL驱动程序 DriverManager.registerDriver(new org.gjt.mm.mysql.Driver()); 或 Class.forName(“org.gjt.mm.mysql.Driver”)
22
加载Access驱动程序 DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver()); 或 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver") ;
23
与数据库建立连接 2、建立连接 DriverManager类的getConnection方法用于建立与某个数据源的连接。若与由URL对象指定的数据源建立连接成功,则返回一个Connection类的对象
24
连接Oracle8/8i/9i数据库(用thin模式)
Class.forName(“oracle.jdbc.driver.OracleDriver”); //test为数据库的SID String user=“admin"; String password=“admin1234"; Connection conn= DriverManager.getConnection(url,user,password); Statement stmt=conn.createStatement(); String sql="select * from student"; ResultSet rs=stmt.executeQuery(sql);
25
连接MS SQL Server7.0/2k数据库 Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver”).; String url=“jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=test”; //test为数据库名 String user="sa"; String password=""; Connection conn= DriverManager.getConnection(url,user,password); Statement stmt=conn.createStatement(); String sql="select * from student"; ResultSet rs=stmt.executeQuery(sql);
26
连接IBM DB2数据库 Class.forName("com.ibm.db2.jdbc.app.DB2Driver "); String url="jdbc:db2://localhost:5000/test"; //test为数据库名 String user="admin"; String password=""; Connection conn= DriverManager.getConnection(url,user,password); Statement stmt=conn.createStatement(); String sql="select * from student"; ResultSet rs=stmt.executeQuery(sql);
27
连接MySQL数据库 Class.forName("org.gjt.mm.mysql.Driver"); String url ="jdbc:mysql://localhost/test?user=root&password=‘’&useUnicode=true&characterEncoding=bgk" //test为数据库名 Connection conn= DriverManager.getConnection(url); Statement stmt=conn.createStatement(); String sql="select * from student"; ResultSet rs=stmt.executeQuery(sql);
28
连接Access数据库 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver") ;
String url="jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ=test.mdb"; Connection conn = DriverManager.getConnection(url,"","");
29
与数据库建立连接 3、检查警告信息 若连接失败,则产生SQLException异常。成功时也可能产生一些警告信息 4、获得关于数据库的信息
用如下语句获取关于数据库表结构的信息: DatabaseMetaData dma=con.getMetaData();
30
与数据库建立连接 5、关闭连接 close()方法实现关闭连接 6、捕获异常 在建立连接和对数据库进行操作过程中,都可能产生异常
7、获取和设置连接选项 对一个连接可设置一些连接选项,如是否只读,是否自动提交,是否自动关闭等。如setReadOnly用户设置只读,而isReadOnly用于获得连接是否只读。
31
JDBC应用 二 、查询处理 JDBC中查询语句的执行方法可分为三类: Statement PreparedStatement
CallableStatement
32
Statement类 (1)创建Statement对象 Statement对象主要用于语句的查询。建立一个Statement对象语句如下:
Statement stmt=con.CreateStatement(); (2)执行查询语句 在Statement对象上,可使用executeQuery方法来执行一查询语句,如: ResultSet rs=stmt.executeQuery(“Select * from Authors”);
33
Statement类 (3)获取和设置选项 SetMaxRows:设置结果能容纳的最多行数
getMaxRows:返回目前结果集能容纳的最多行数 setQueryTimeOut:设置一个语句的执行等待时间 (4)关闭Statement 用语句stmt.close()关闭Statement
34
PreparedStatement类 Statement对象在每次执行SQL语句时都将该语句转给数据库,在多次执行同一语句时,效率较低。
使用PreparedStatement对象可以提高效率。若数据库支持预编译,它可以将SQL语句传给数据库做预编译,提高速度。 PreparedStatement对象的SQL语句还可以接收参数
35
PreparedStatement类 PreparedStatement类是Statement类派生的子类。
从一个Connection对象可以创建一个PreparedStatement对象。在创建时,应给出预编译的SQL语句,如: PreparedStatement stmt=con. PreparedStatement (“Select * from Authors”);
36
PreparedStatement类 (2)执行查询 使用execQuery方法来执行一查询语句,如:
ResultSet rs=stmt. executeQuery(); (3)获取和设置选项 用父类Statement类的相应方法来获取和设置选项 (4) 关闭对象 用close()方法关闭
37
CallableStatement类 CallableStatement对象用于执行数据库中的存储过程。
38
JDBC应用 三、检索结果集 ResultSet对象包括一个由查询语句返回的一个表,这个表包含所有的查询结果。对ResultSet对象的处理必须逐条记录进行,而对每一记录中的各个数据项,可按任何顺序处理。
39
检索结果集的例子 假设表table由数据项a,类型为int;数据项b,类型为String,数据项c,类型为byte
Statement stmt=con.createStatement(); ResultSet r=stmt.executeQuery(“select a,b,c from table”); while(r.next()){ int i=r.getInt(1); String s=r.getString(“b”); byte b[]=r.getBytes(3); System.out.println(i+s+b[0]); }
40
更新数据库操作 (1)对表中记录的操作 对一个表中的记录可以进行修改、插入和删除操作,分别对应SQL的update、Insert和Delete操作。 可用executeUpdate方法实现上述操作,它的参数是String对象,即要执行的SQL语句,返回的不是ResultSet对象,而是一个整数。对于不返回值的SQL语句, executeUpdate方法的返回值为0。
41
更新数据库操作 (2) 创建和删除表 创建表:Create table 表名 删除表:Drop table 表名
如创建数据库表Authors: stmt.executeUpdate(“create table Authors(AuthorID int, FirstName char(20), LastName char(20), YearBorn int”); 删除表Authors的语句: stmt.executeUpdate(“drop table Authors“);
42
增加和删除表结构中的数据项 对一个表的数据项进行修改操作使用SQL的Alter table语句。
如在表Authors中增加一数据项Address: stmt.executeUpdate(“alter table Authors add column Address varchar(50)”); 删除表中一列: stmt.executeUpdate(“alter table Authors drop column Address”);
43
用JDBC访问数据库示例 例1:用户登录:Access版、MySQL版
44
用JDBC访问数据库示例 例2:显示Books.mdb数据库中Authors的内容 该Access数据库中有四个表: - Authors
- Publishers - AuthorISBN - Titles
45
表Authors
46
表Publishers
47
表AuthorISBN
48
表Titles
49
数据库Books.mdb各表之间的关系 主关键字唯一地标识了表中的记录,每个记录的主关键字字段都必须有一个唯一的值,这叫实体完整性规则。
50
用JDBC访问数据库示例 程序步骤: (1)加载驱动连接数据库或设置系统的ODBC数据源后建立数据库的连接
开始->设置->控制面板->ODBC数据源进入,选择“系统DSN”项,点击“添加…” (2) 发送访问、操作数据库的SQL语句 加载JDBC-ODBC桥驱动程序用class.forName方法来完成:Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" ); (3)处理对数据库访问的结果 源程序TableDisplay.java
51
性能优化 预编译语句 SQL语句批处理机制 stmt=c.createStatement();
sql="INSERT INTO film1 (filmdata) VALUES (?)"; stmt=c.prepareStatement(sql); for (int i=1;i<=20000;i++){ stmt.setString(1,""+i); stmt.executeUpdate(); } SQL语句批处理机制 stmt=c.createStatement(); sql="INSERT INTO film1 (filmdata) VALUES ('"+i+"')"; stmt.addBatch(sql); stmt.executeBatch();
52
作业 1、已知有一个Access数据库文件StuMngSys.xls,里面有一张学生表stu,stu的各字段含义如下表所示。
请编写一个Java程序将学生名字为“张三”的信息插入表中,信息如下表所示。
53
作业 2、编写一个从MS SQLServer数据库的学生表中查询20岁以下的学生信息的程序,其中数据库名为StuMngSys,学生表名为stu,stu的各字段含义如下表所示。
Similar presentations