版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第10章JDBC·JDBC·JDBCAPI·实现JDBC程序10.1什么是JDBCJDBC的全称是Java数据库连接(JavaDatabaseConnectivity),它是一套用于执行SQL语句的JavaAPI。应用程序可通过这套API连接到关系型数据库,并使用SQL语句完成对数据库中数据的新增、删除、修改和查询等操作。10.1什么是JDBC不同的数据库(如MySQL、Oracle等)在内部处理数据的方式是不同的,如果直接使用数据库厂商提供的访问接口操作数据库,应用程序的可移植性就会变得很差。JDBC要求各个数据库厂商按照统一的规范提供数据库驱动,在程序中由JDBC和具体的数据库驱动联系,因此用户不必直接与底层的数据库交互,这使得代码的通用性更强。10.1什么是JDBC应用程序使用JDBC访问数据库的方式如下图。10.2JDBC常用API在开发JDBC程序前,先了解一下JDBC常用的API。JDBCAPI主要位于java.sql包中,该包定义了一系列访问数据库的接口和类。(1)Driver接口Driver接口是所有JDBC驱动程序必须实现的接口,该接口专门提供给数据库厂商使用。需要注意的是,在编写JDBC程序时,必须要把所使用的数据库驱动程序或类库加载到项目的classpath中(这里指MySQL驱动JAR包)。10.2JDBC常用API(2)DriverManager接口DriverManager接口用于加载JDBC驱动、创建与数据库的连接。在DriverManager接口中,定义了两个比较重要的静态方法方法名称功能描述static
voidregisterDriver(Driverdriver)用于向DriverManager注册给定的JDBC驱动程序static
ConnectiongetConnection(Stringurl,Stringuser,Stringpwd)用于建立和数据库的连接,并返回表示连接的Connection对象10.2JDBC常用API(3)Connection接口Connection接口用于处理与特定数据库的连接,Connection对象是表示数据库连接的对象,只有获得该连接对象,才能访问并操作数据库。Connection接口的常用方法如下表。方法名称功能描述StatementcreateStatement()用于创建一个Statement对象将SQL语句发送到数据库PreparedStatementprepareStatement(Stringsql)用于创建一个PreparedStatement对象将参数化的SQL语句发送到数据库CallableStatement
prepareCall(Stringsql)用于创建一个CallableStatement对象来调用数据库存储过程10.2JDBC常用API(4)Statement接口Statement接口用于执行静态的SQL语句,并返回一个结果对象。Statement接口对象可以通过Connection实例的createStatement()方法获得,该对象会把静态的SQL语句发送到数据库中编译执行,然后返回数据库的处理结果。10.2JDBC常用APIStatement接口提供了3个常用的执行SQL语句的方法。方法名称功能描述booleanexecute(Stringsql)用于执行各种SQL语句。该方法返回一个boolean类型的值,如果为true,表示所执行的SQL语句有查询结果,可以通过Statement的getResultSet()方法获得查询结果。intexecuteUpdate(Stringsql)用于执行SQL中的insert、update和delete语句。该方法返回一个int类型的值,表示数据库中受该SQL语句影响的记录条数。ResultSetexecuteQuery(Stringsql)用于执行SQL中的select语句。该方法返回一个表示查询结果的ResultSet对象。10.2JDBC常用API(5)PreparedStatement接口Statement接口封装了JDBC执行SQL语句的方法,可以完成Java程序执行SQL语句的操作。然而在实际开发过程中往往需要将程序中的变量作为SQL语句的查询条件,而使用Statement接口操作这些SQL语句会过于繁琐,并且存在安全方面的问题。针对这一问题,JDBCAPI提供了扩展的PreparedStatement接口。10.2JDBC常用APIPreparedStatement是Statement的子接口,用于执行预编译的SQL语句。PreparedStatement接口扩展了带有参数SQL语句的执行操作,该接口中的SQL语句可以使用占位符“?”代替参数,然后通过setter()方法为SQL语句的参数赋值。10.2JDBC常用APIPreparedStatement接口提供了一些常用方法,如下表。方法名称功能描述intexecuteUpdate()在PreparedStatement对象中执行SQL语句,SQL语句必须是一个DML语句或者是无返回内容的SQL语句,如DDL语句。ResultSetexecuteQuery()在PreparedStatement对象中执行SQL查询,该方法返回的是ResultSet对象。voidsetInt(int
parameterIndex,int
x)将指定参数设置成给定的int值。voidsetString(intparameterIndex,Stringx)将指定参数设置成给定的String值。10.2JDBC常用API通过setter()方法为SQL语句中的参数赋值时,可以通过已定义的SQL类型参数兼容输入参数。例如,如果参数具有的SQL类型为Integer,那么应该使用setInt()方法或setObject()方法设置多种类型的输入参数,具体示例如下所示:Stringsql="INSERTINTOusers(id,name,email)VALUES(?,?,?)";PreparedStatementpreStmt=conn.prepareStatement(sql);preStmt.setInt(1,1); //使用参数的已定义SQL类型preStmt.setString(2,"zhangsan"); //使用参数的已定义SQL类型preStmt.setObject(3,"zs@"); //使用setObject()方法设置参数preStmt.executeUpdate();10.2JDBC常用API(6)ResultSet接口ResultSet接口用于保存JDBC执行查询时返回的结果集,该结果集封装在一个逻辑表格中。在ResultSet接口内部有一个指向表格数据行的游标(或指针),ResultSet对象初始化时,游标在表格的第一行之前,调用next()方法可以将游标移动到下一行。如果下一行没有数据,则返回false。在应用程序中经常使用next()方法作为while循环的条件来迭代ResultSet结果集。10.2JDBC常用APIResultSet接口的常用方法如下表。方法名称功能描述StringgetString(intcolumnIndex)用于获取指定字段的String类型的值,参数columnIndex代表字段的索引。StringgetString(StringcolumnName)用于获取指定字段的String类型的值,参数columnName代表字段的名称。intgetInt(intcolumnIndex)用于获取指定字段的int类型的值,参数columnIndex代表字段的索引。intgetInt(StringcolumnName)用于获取指定字段的int类型的值,参数columnName代表字段的名称。booleannext()将游标从当前位置向下移一行。10.2JDBC常用API从上个表格中可以看出,ResultSet接口中定义了一些getter方法,而采用哪种getter方法获取数据取决于字段的数据类型。程序既可以通过字段的名称来获取指定数据,也可以通过字段的索引来获取指定的数据,字段的索引是从1开始编号的。例如,数据表的第一列字段名为id,字段类型为int,那么既可以使用getInt(1)获取该列的值,也可以使用getInt(“id”)获取该列的值。10.3实现第一个JDBC程序使用JDBC的常用API实现JDBC程序的步骤如下图。10.3实现第一个JDBC程序接下来分步骤讲解使用JDBC的API连接数据库的过程。(1)加载并注册数据库驱动
在连接数据库之前,要加载数据库的驱动到JVM(Java虚拟机)。加载操作可以通过java.lang.Class类的静态方法forName(String
className)或DriverManager类的静态方法registerDriver(Driverdriver)实现,具体示例如下所示:DriverManager.registerDriver(Driver
driver);或Class.forName("DriverName");10.3实现第一个JDBC程序在实际开发中,我们常用第2种方式注册数据库驱动,DriverName表示数据库的驱动类。以MySQL数据库为例,MySQL驱动类在6.0.2版本之前为com.mysql.jdbc.Driver,而在6.0.2版本之后为com.mysql.cj.jdbc.Driver,我们要根据自己数据库版本选择对应的驱动类。10.3实现第一个JDBC程序(2)通过DriverManager获取数据库连接获取数据库连接的具体方式如下:Connectionconn=DriverManager.getConnection(Stringurl,Stringuser,Stringpwd);从上述代码可以看出,getConnection()方法有3个参数,分别表示连接数据库的地址、登录数据库的用户名和密码。以MySQL数据库为例,MySQL数据库地址的书写格式如下:jdbc:mysql://hostname:port/databasename10.3实现第一个JDBC程序在上面代码中,jdbc:mysql:是固定的写法,mysql指的是MySQL数据库,hostname指的是主机的名称(如果数据库在本机中,hostname可以为localhost或;如果要连接的数据库在其他电脑上,hostname为所要连接电脑的IP),port指的是连接数据库的端口号(MySQL端口号默认为3306),databasename指的是MySQL中相应数据库的名称。10.3实现第一个JDBC程序通过Connection对象获取Statement对象Connection创建Statement对象的方法有以下3个:●createStatement():创建基本的Statement对象。●prepareStatement():创建PreparedStatement对象。●prepareCall():创建CallableStatement对象。以创建基本的Statement对象为例,创建方式如下:Statementstmt=conn.createStatement();10.3实现第一个JDBC程序(4)使用Statement执行SQL语句所有的Statement都有以下3种执行SQL语句的方法:●execute():可以执行任何SQL语句。●executeQuery():通常执行查询语句,执行后返回代表结果集的ResultSet对象。●executeUpdate():主要用于执行DML和DDL语句。执行DML语句,如INSERT、UPDATE或DELETE时,返回受SQL语句影响的行数;执行DDL语句返回0。10.3实现第一个JDBC程序以executeQuery()方法为例,executeQuery()方法调用形式如下://执行SQL语句,获取结果集ResultSetResultSetrs=stmt.executeQuery(sql);10.3实现第一个JDBC程序(5)操作ResultSet结果集如果执行的SQL语句是查询语句,执行结果将返回一个ResultSet对象,该对象保存了SQL语句查询的结果。程序可以通过操作该ResultSet对象取出查询结果。(6)关闭连接,释放资源每次操作数据库结束后都要关闭数据库连接,释放资源,关闭顺序和声明顺序相反。需要关闭的资源包括ResultSet、Statement和Connection等。10.3实现第一个JDBC程序接下来,依照上面所讲解的步骤编写Java程序演示JDBC的使用,该程序从users表中读取数据,并将结果打印在控制台,具体步骤如下所示。(1)搭建数据库环境在MySQL中创建一个名称为jdbc的数据库,然后在jdbc数据库中创建一个users表,创建数据库和表的SQL语句如下所示:10.3实现第一个JDBC程序CREATEDATABASEjdbc;USEjdbc;CREATETABLEusers( idINTPRIMARYKEYAUTO_INCREMENT, nameVARCHAR(40), passwordVARCHAR(40), emailVARCHAR(60), birthdayDATE);10.3实现第一个JDBC程序jdbc数据库和users表创建成功后,再向users表中插入3条数据,插入的SQL语句如下所示:INSERTINTOusers(NAME,PASSWORD,email,birthday)VALUES('zhangs','123456','zs@','1980-12-04'),('lisi','123456','lisi@','1981-12-04'),('wangwu','123456','wangwu@','1979-12-04');10.3实现第一个JDBC程序为了查看数据是否添加成功,使用SELECT语句查询users表中的数据,执行结果如下图。10.3实现第一个JDBC程序(2)创建项目环境,导入数据库驱动在IDEA中新建一个名称为chapter10的Java项目,使用鼠标右键单击项目名称,选择【New】→【Directory】,在弹出窗口中将该文件夹命名为lib,项目根目录中就会出现一个名称为lib的文件夹。10.3实现第一个JDBC程序将下载好的MySQL数据库驱动文件mysql-connector-java-8.0.1.jar复制到项目的lib目录中,并把jar包添加到项目里。使用鼠标单击File菜单栏,选择【ProjectStructure】→【Modules】→【Dependencies】,单击最右侧加号后选择第一项:JARsordirectories…,在弹出框中选择下载好的Jar包确认。10.3实现第一个JDBC程序最后可以看到mysql-connector-java-8.0.1.jar包添加到IDEA的依赖项中,添加成功界面如右图。10.3实现第一个JDBC程序在上图中,mysql-connector-java-8.0.1.jar包添加到依赖项之后,单击【Apply】后再单击【OK】,可以看到在Externallibraries下已经存在刚刚添加的jar包。至此,jar包添加成功。加入数据库驱动后的项目结构如下图。10.3实现第一个JDBC程序(3)编写JDBC程序在项目chapter10的src目录下,新建一个名称为cn.itcast.jdbc.example的包,在该包中创建类Example01,Example01类用于读取数据库中的users表,并将结果输出到控制台。10.3实现第一个JDBC程序1importjava.sql.*;2publicclassExample01{3publicstaticvoidmain(String[]args)throwsSQLException{4Statementstmt=null;5ResultSetrs=null;6Connectionconn=null;7try{8//1.注册数据库的驱动9Class.forName("com.mysql.cj.jdbc.Driver");10//2.通过DriverManager获取数据库连接11Stringurl=12"jdbc:mysql://localhost:3306/jdbc13?serverTimezone=GMT%2B8&useSSL=false";14Stringusername="root";15Stringpassword="root";
10.3实现第一个JDBC程序16conn=DriverManager.getConnection(url,username,password);17//3.通过Connection对象获取Statement对象18stmt=conn.createStatement();19//4.使用Statement执行SQL语句。20Stringsql="select*fromusers";21rs=stmt.executeQuery(sql);22//5.操作ResultSet结果集23System.out.println("id | name | password"24+"| email | birthday");25while(rs.next()){26intid=rs.getInt("id");//通过列名获取指定字段的值27Stringname=rs.getString("name");28Stringpsw=rs.getString("password");29Stringemail=rs.getString("email");10.3实现第一个JDBC程序30Datebirthday=rs.getDate("birthday");31System.out.println(id+" | "+name+" | "+psw+32" | "+email+" | "+birthday);33}34}catch(ClassNotFoundExceptione){35e.printStackTrace();36}finally{37//6.回收数据库资源38if(rs!=null){39try{40rs.close();41 }catch(SQLExceptione){42e.printStackTrace();43}10.3实现第一个JDBC程序44stmt=null;45}46if(conn!=null){47try{48conn.close();49}catch(SQLExceptione){50e.printStackTrace();51}52conn=null;53}54}55}56}10.3实现第一个JDBC程序在上述代码中,在第9行代码中通过Class的forName()方法注册了MySQL数据库驱动;在第11~16行代码中通过DriverManager的getConnection()方法获取数据库的连接;第18行代码中通过Connection对象获取Statement对象,第20~21行代码使用Statement的executeQuery()方法执行SQL查询语句;第23~33行代码使用ResultSet操作结果集,并用while循环获取所有数据库数据,第38~62行代码使用close()方法将Statement、ResultSet和Connection都关闭并置空。10.3实现第一个JDBC程序程序运行结果如下图。10.3实现第一个JDBC程序在实现第一个JDBC程序时,还有以下3点需要注意:1、注册驱动虽然使用DriverManager.registerDriver(newcom.mysql.cj.jdbc.Driver())方法也可以完成注册,但这种方式会使数据库驱动被注册两次。因为在Driver类的源码中,已经在静态代码块中完成了数据库驱动的注册。为了避免数据库驱动被重复注册,只需要在程序中使用Class.forName()方法加载驱动类即可。10.3实现第一个JDBC程序2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论