• 1. JDBC 基础知识
  • 2. 2本章目标了解JDBC的概念及必要性 了解JDBC驱动程序类型 理解JDBC 程序的结构 运用JDBC进行数据库编程
  • 3. 3目录JDBC技术介绍 使用JDBC访问数据库的步骤 JDBC中各个类的介绍 使用JDBC连接不同的数据库 使用JDBC进行增删改查 总结
  • 4. 41 JDBC 技术介绍JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。 JDBC是一套面向对象的应用程序接口,它制定了统一的访问各类关系数据库的标准接口,为各个数据库厂商提供了标准接口的实现。通过使用JDBC技术,开发人员可以用纯Java语言和标准的SQL语句编写完整的数据库应用程序,并且真正的实现了软件的跨平台型。同时,JDBC也是个商标名。
  • 5. 5JDBC技术介绍 JDBC是用于执行SQL语句的API类包,由一组用Java语言编写的类和接口组成。JDBC提供了一种标准的应用程序设计接口,通过它可以访问各类关系数据库。通常情况下使用JDBC完成以下操作: (1)同数据库建立连接; (2)向数据库发送SQL语句; (3)处理从数据库返回的结果。
  • 6. 6数据库访问技术简介客户机/服务器 应用程序 数据库编程ODBCJDBC两个常用的API数据库执行 SQL 语句检索查询结果 在Jsp页面上可以通过ODBC或 JDBC来对数据库进行访问
  • 7. 7数据库ODBC客户机/服务器 GUI应用程序ODBC (开放式数据库连接) (Microsoft 提供)插 入删 除修 改应用程序编程接口 查询
  • 8. 8JDBC JDBC (Java 数据库连接) (sun公司提供)Java 应用程序编程接口Java应用程序数据库 插 入修 改删 除查询
  • 9. 9JDBC技术介绍ODBC 可能是使用最广的、用于访问关系数据库的编程接口。它能在几乎所有平台上连接几乎所有的数据库。Java 可以使用 ODBC,但最好是在 JDBC 的帮助下以 JDBC-ODBC 桥的形式使用。ODBC 不适合直接在 Java 中使用,因为它使用 C 语言接口。从Java 调用本地 C 代码在安全性、实现、坚固性和程序的自动移植性方面都有许多缺点。从 ODBC C API 到 Java API 的字面翻译是不可取的。例如,Java 没有指针,而 ODBC 却对指针用得很广泛(包括很容易出错的指针"void *")。您可以将 JDBC 想象成被转换为面向对象接口的 ODBC,而面向对象的接口对 Java 程序员来说较易于接收。   JDBC 尽量保证简单功能的简便性。如果使用ODBC,就必须手动地将 ODBC 驱动程序管理器和驱动程序安装在每台客户机上。如果完全用 Java 编写 JDBC 驱动程序则 JDBC 代码在所有 Java 平台上(从网络计算机到大型机)都可以自 动安装、移植并保证安全性。   JDBC 保留了 ODBC 的基本设计特征。它们之间最大的区别在于:JDBC 以 Java 风格与优点为基础并进行优化,因此更加易于使用。
  • 10. 10JDBC技术介绍 JDBC具有下列优点:(1)JDBC与ODBC十分相似,便于软件开发人员理解; (2)JDBC使软件开发人员从复杂的驱动程序编写工作中解脱出来,可以完全专著与业务逻辑的开发; (3)JDBC支持多种关系型数据库,大大增加了软件的可移植性; (4)JDBC API是面向对象的,软件开发人员可以将常用的方法进行二次封装,从而提高代码的重用性。
  • 11. 11JDBC技术介绍 与此同时,JDBC也具有下列缺点:(1)通过JDBC访问数据库时速度将受到一定影响; (2)虽然JDBC API是面向对象的,但通过JDBC访问数据库依然是面向关系的; (3)JDBC提供了对不同厂家的产品的支持,这将对数据源带来影响。
  • 12. 12JDBC技术介绍 JDBC是一种底层API,在访问数据库时需要在业务逻辑中直接嵌入SQL语句。由于SQL语句是面向关系的,依赖于关系模型,所以JDBC传承了简单直接的优点,特别是对于小型应用程序十分方便。需要注意的是,JDBC不能直接访问数据库,必须依赖于数据库厂商提供的JDBC驱动程序。
  • 13. 13JDBC 驱动程序的类型JDBC 驱动程序 的类型 JDBC-ODBC桥驱动程序及ODBC驱动程序 本地API部分Java驱动程序 JDBC-Net 纯Java驱动程序 本地协议纯Java驱动程序 每种不同的数据库的驱动程序都不同,但从类型上分为四类
  • 14. 14数据库驱动程序 使用JDBC操作数据库首先必须要安装驱动程序,大多数数据库都有JDBC驱动程序,常见的驱动程序如表所示。 数据库名称 类包名 驱动名称与URL地址 SQL Server2000 msbase.jar、mssqlserver.jar、msutil.jar com.microsoft.jdbc.sqlserver.SQLServerDriver jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=数据库名称 SQL Server2005 sqljdbc.jar com.microsoft.sqlserver.jdbc.SQLServerDriver jdbc:sqlserver://localhost:1433;databaseName=数据库名称 MYSQL mysql-connector-java-3.0.16-ga-bin.jar com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/数据库名称 oracle class12.jar oracle.jdbc.driver.OracleDriver jdbc:oracle:thin:@dssw2k01:1521:数据库名称 DB2 db2jcc.jar com.ibm.db2.jdbc.net.DB2Driver jdbc:db2://localhost:6789/数据库名称 Derby derby.jar org.apache.derby.jdbc.EmbeddedDriver jdbc:derby://localhost:1527:数据库名称;create=false
  • 15. 15连接数据库的方式Java或JSP中连接数据库的方式主要有两种: JDBC-ODBC桥 专用的JDBC驱动程序示例:JDBC—ODBC连接access数据库示例:JDBC—ODBC连接SQL数据库
  • 16. 16目录JDBC技术介绍 使用JDBC访问数据库的步骤 JDBC中各个类的介绍 使用JDBC连接不同的数据库 使用JDBC进行增删改查 总结
  • 17. 17JDBC 程序访问数据库的步骤开 始导入 java.sql包 加载并注册驱动程序创建一个 Connection 对象创建一个 Statement 对象执行语句关闭ResultSet 对象关闭Statement对象关闭连接结 束使用ResultSet对象
  • 18. 18JDBC-ODBC桥 装载驱动程序并建立连接。 1.创建数据源 2.装载驱动程序 成功加载后,会将加载的驱动类注册给DriverManager类,如果加载失败,将抛出ClassNotFoundException异常,即未找到指定的驱动类,所以需要在加载数据库驱动类时捕捉可能抛出的异常。 try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); } catch (ClassNotFoundException e) { System.out.println("加载数据库驱动时抛出异常,内容如下:"); e.printStackTrace(); }
  • 19. 193. 用适当的驱动程序类与 DBMS 建立一个连接。   Connection con = DriverManager.getConnection(url, "myLogin", "myPassword"); 在上面的代码中,url指要连接的数据源,登录用户为myLogin ,密码为myPassword 。
  • 20. 204.读取数据 Statement stmt = con.createStatement(); Statement 接口提供了3种执行SQL语句的方法: executeQuery()将返回一个ResultSet型的结果集,其中不仅包含所有满足查询条件的记录,还包含相应数据表的相关信息,例如,列的名称、类型和列的数量等。 executeUpdate() 将返回一个int型数值,代表影响数据库记录的条数,即插入、修改或删除记录的条数。 execute() 返回类型boolean,代表执行此语句是否有resultset 返回,有就是ture。用于执行返回多个结果集、多个更新计数或二者组合的语句
  • 21. 215.处理数据库的返回结果 ResultSet rs=stmt.executeQuery(“查询语句”); 6.关闭连接对象 con.close(); con.isClosed();
  • 22. 22 Statement 接口提供了3种执行SQL语句的方法: executeQuery() executeUpdate() execute() 4 处理数据库的返回结果 ResultSet rs=stmt.executeQuery(“SELECT * FROM teacher”);
  • 23. 235 关闭连接对象 con.close(); con.isClosed(); 6 JSP针对几种数据库的连接方法
  • 24. 24目录JDBC技术介绍 使用JDBC访问数据库的步骤 JDBC中各个类的介绍 使用JDBC连接不同的数据库 使用JDBC进行增删改查 总结
  • 25. 25驱动器接口:Driver 任何一种数据库驱动程序都提供一个java.sql.Driver接口的驱动类,在加载某个数据库驱动程序的驱动类时,都创建自己的实例对象并向java.sql.DriverManage类注册该实例对象。数据库驱动加载在DriverManage类的执行过程如图所示。 返回
  • 26. 26驱动管理类:DriverManager 2.建立连接 加载驱动类并在DriverManager类中注册后,即可用来与数据库建立连接。当调用 DriverManager类中getConnection()方法发出连接请求时,DriverManager类将检查每个驱动程序,并查看该类是否可以建立连接。例如,通过SQL Server2000数据库的驱动和URL获取数据库的连接。 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver "); String url = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=wy_userInfo"; DriverManager.getConnection(url,"user","password"); DriverManager类除了getConnection()方法外,还存在其他的方法,如表所示。 方法名称 功能描述 setLoginTimeout(int second) 该方法是静态方式,表示等待数据库建立连接的时间 setLogWriter(java.io.PrintWriter out) 该方法是静态方式,表示设置日志输出流对象 println(String messages) 该方法是静态方式,表示输出指定消息 返回
  • 27. 27执行静态SQL语句接口:Statement (1) java.sql.Statement接口用来执行静态的SQL语句,并返回执行结果。处理静态的SQL语句主要分为3种Statement对象:Statement、PreparedStatement、CallableStatement。它们作为在指定连接上执行SQL语句的容器。这3种Statement对象的关系如图所示。
  • 28. 28执行静态SQL语句接口:Statement (2)1.创建Statement对象 取得数据库连接对象后,就可以通过该连接发送SQL语句。Statement对象可以通过Connection对象中的createStatement()方法进行创建,例如: Connection con = DriverManager.getConnection(url, "sa",""); //取得数据库连接 Statement stmt = con.createStatement(); //获取Statement对象 为了执行Statement对象,被发送到数据库的SQL语句将被作为参数提供给Statement类中的指定方法。例如,通过Statement对象执行查询的SQL语句: ResultSet rs = stmt.executeQuery("select * from wy_user");
  • 29. 29执行静态SQL语句接口:Statement (3)2.使用Statement对象执行SQL语句 Statement接口提供了3种执行语句的方法,如表所示。 方法名称 功能描述 executeQuery(String sql) 用于产生单个结果集的语句,例如,执行SELECT查询语句 executeUpdate(String sql) 用于执行INSERT、UPDATE或DELETE语句以及SQL DDL(数据定义语言)语句,例如,CREATE TABLE和DROP TABLE。INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个整数,指示受影响的行数(即更新计数)。对于 CREATE TABLE 或 DROP TABLE 等不操作行的语句,executeUpdate 的返回值总为零 execute(String sql) 用于执行返回多个结果集、多个更新计数或二者组合的语句 3.SQL语句执行完成 当连接处于自动提交模式时,其中所执行的SQL语句在完成时将自动提交或还原。 4.关闭Statement对象 Statement对象将由Java垃圾收集程序自动关闭。
  • 30. 30返回查询结果集接口:ResultSet (1) java.sql.ResultSet接口类似于一个数据表,通过该接口的实例可以获得检索结果集以及对应的数据表相关信息。Result实例通过执行查询数据库的语句生成。一个Statement对象在同一时刻只能打开一个ResultSet对象。可以通过字段的序号或者字段的名字来制定获取某个字段的值。ResultSet对象的常用方法如表所示。 方法名称 功能描述 next()得到查询结果数实例。ResultSet初始化时定位于它的第一行数据之前;使用next方法可以将第一行数据放到ResultSet对象当中,通过该实例对象的getXXX()方法得到数据close()用来释放ResultSet占用的系统资源 getBigDecimal(int,int)取得指定列值的java.lang.BigDecimal类型数据。第一个参数是列对应的位置,第二个参数是小数点后面的位数getBigDecimal(String,int)取得指定列值的java.lang.BigDecimal类型数据。第一个参数是字段的名称,第二个参数是小数点后面的位数getBinaryStream(int)获取列值为字节流的数据,参数是指定字段的位置 getBinaryStream(String)获取列值为字节流的数据,参数是指定字段的名称
  • 31. 31使用结果集 3-1 ResultSet 对象完全依赖于 Statement 对象和 Connection 对象 每次执行 SQL 语句时,都会用新的结果重写结果集。 当相关的 Statement 关闭时,ResultSet 对象会自动关闭Next( )get()此方法将光标从 当前位置下移一行 从 ResultSet 对象返回数据
  • 32. 32使用结果集 3-2 它演示对当前行的处理 使用 next() 方法时,记录是按顺序处理的 必须按照数据返回的顺序处理每行中的数据… ResultSet rset = stmt.getResultSet(); rs = stmt.executeQuery(sql); while(rset.next()) { String dept_name = rset.getString(1); } …
  • 33. 33使用结果集 3-3 演示对当前列的处理 使用 get() 方法可以直接访问列 … Statement stmt = con.createStatement(); Stmt.executeQuery("Select emp_id, fname from Employee") ; ResultSet rset = stmt.getResultSet(); while(rset.next()) { String ename = rset.getString ("fname"); out.println ( ename) ; } …… Statement stmt = con.createStatement(); stmt.executeQuery("Select emp_id, fname from Employee"); ResultSet rset = stmt.getResultSet(); while(rset.next()) { String employeeid = rset.getString (1); } …以下代码显示值 1 被作为参数传递给 getString() 方法, 这实际上指列 emp_id 的索引
  • 34. 34ResultSetMetaDataResultSetMetaData对象保存了所有ResultSet对象中关于字段的信息,并提供了许多方法来获取这些信息。 1.getColumCount()方法:返回所有字段的数目 2.getColumName(int)方法 :根据字段的索引值取得字段的名称。 3.getColumType(int)方法 :返回此列的 SQL 数据类型 4. isAutoIncrement(int); 如果此列自动递增,则返回 true。这类列通常为键,而且始终是只读的。 5. getColumnDisplaySize(int) 方法:根据字段的索引值取得字段最大的字符数目。
  • 35. 35结果集的类型可滚动不可滚动光标仅向前移动光标可前后移动,也可移动 至与当前位置相对的某一行如果对数据库做了更改, 则新值是可见的结果集 TYPE_SCROLL_INSENSITIVE TYPE_SCROLL_SENSITIVE TYPE_FORWARD_ONLY
  • 36. 36在Statement可以滚动的情况下:  boolean first() 游标移至第一个记录的位置,如果ResultSet是空的,返回false boolean last() 游标移至最后一个记录的位置,如果ResultSet是空的,返回false boolean isFirst() 如果现在游标在第一个记录的位置,返回true boolean isLast() 如果现在游标在最后一个记录的位置,返回true void beforeFirst() 游标移至第一个记录之前的位置 void afterLast() 游标移至最后一个记录之后的位置 boolean isBeforeFirst() 如果现在游标在第一个记录之前的位置,返回true boolean isAfterLast() 如果现在游标在最后一个记录之后的位置,返回true boolean previous() 游标移至上一个记录的位置,如果上一个记录不存在,返回false int getRow() 获得游标当前行的号码,从1开始 boolean absolute(int) 若参数为正,游标移至第参数个记录的位置上,若为负,移至倒数第参数个记录的位置上,如果移动之后,游标指向的位置有记录,返回true. boolean relative(int) 若参数为政,游标自当前位置向后移动参数个位置,若为负,向前移,如果移动之后,游标指向的位置有记录,返回true.
  • 37. 37ResultSet几个比较有用的方法 boolean  absolute(  int  row )throws  SQLException; 移到指定行 void  afterLast()  throws  SQLException;   移到最后一条记录后面 void  beforeFirst()  throws  SQLException; 移到第一条记录前面 boolean  first()  throws  SQLException;      移到第一条记录上 boolean  last()  throws  SQLException;    移到最后一条记录上 boolean  isBeforeFirst()  throws  SQLException;    指针是否在第一条记录前面 boolean  isAfterLast()  throws  SQLException;    指针是否在最后一条记录后面
  • 38. 38目录JDBC技术介绍 使用JDBC访问数据库的步骤 JDBC中各个类的介绍 使用JDBC连接不同的数据库 使用JDBC进行增删改查 总结
  • 39. 39 在上面的URL中,“127.0.0.1”为数据库所在机器的IP地址,该IP代表本机,也可替换为“localhost”;“1433”为SQL Server 2000数据库默认的端口号;“db_database08”为数据库名。SQL Server 2000数据库的连接String driverClass="com.microsoft.jdbc.sqlserver.SQLServerDriver"; SQL Server 2000数据库的驱动为: 连接SQL Server 2000数据库需要用到的包有msbase.jar,mssqlserver.jar和msutil.jar。 连接SQL Server 2000数据库的URL为:String url = "jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=db_database08";
  • 40. 40SQL Server数据库 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=test"; //test为数据库名 String user="sa"; String password="123456"; Connection conn= DriverManager.getConnection(url,user,password);
  • 41. 41 由于在上面的URL中采用的是系统默认的连接Access数据库的驱动Microsoft Access Driver(*.mdb),所以不需要手动配置ODBC驱动;“E:/db_database08.mdb”为Access数据库的绝对存放路径,在实际程序中,可以通过request对象的相关方法获取数据库文件的存放路径。Access数据库的连接String driverClass="sun.jdbc.odbc.JdbcOdbcDriver"; Access数据库的驱动为: 连接Access数据库需要通过JDBC-ODBC方式,不需要引入任何包。 连接Access数据库的URL为:String url = "jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=E:/db_database08.mdb";
  • 42. 42了解JDBC的概念及必要性 了解JDBC驱动程序类型 理解JDBC 程序的结构 运用JDBC进行数据库编程 使用JDBC进行增删改查 总结
  • 43. 43JDBC 查询2-1SQL 查询字符串 executeQuery() 方法 作为参数传递ResultSet 返回查询数据SELECT name, email, phone FROM colleagues;使用 SQL 语句,查询可编写为: String str = "SELECT emp_id, lname, fname FROM colleagues"; Statement stmt = con.createStatement(); ResultSet rset = stmt.executeQuery(str); 使用 JDBC 编写此查询,则代码为:Statement接口
  • 44. 44JDBC 查询2-2它演示 SQL 中 sum( ) 方法的用法演示:示例 2/** * Jdbctest2 */ import java.sql.SQLException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; import java.sql.ResultSet; /** 这个类演示 SQL 中 sum() 方法的用法 * @version 1.0, 2005 年 8 月 26 日 * @author Ben */ class Jdbctest2 { /** 构造方法*/ protected Jdbctest2() { }try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); } catch (ClassNotFoundException ce) { System.out.println(ce); } try { String url = "jdbc:odbc:test"; Connection con = DriverManager.getConnection(url); Statement s = con.createStatement(); ResultSet rs = s.executeQuery( "select hiredate, sum(salary) from friends group by hiredate"); while (rs.next()) { out.print(rs.getDate(1) + “ "); out.print(rs.getInt(2) + " "); out.println(" "); } rs.close; s.close(); con.close(); } catch (SQLException ce) { System.out.println(ce); } } }
  • 45. 45更新数据库可以通过两种方法更新数据库 1. 调用Statement对象的ExecuteUpdate()方法执行SQL语句 2.创建可更新的结果集ResultSet执行更新
  • 46. 46添加操作 JDBC中也提供了两种实现数据添加操作的方法,一种是通过Statement对象执行静态的SQL语句实现;另一种是通过PreparedStatement对象执行动态的SQL语句实现。 通过Statement对象和PreparedStatement对象实现数据添加操作的方法同实现查询操作的方法基本相同,所不同的就是执行的SQL语句及执行方法不同,实现数据添加操作时采用的是executeUpdate()方法,而实现数据查询时使用的是executeQuery()方法。实现数据添加操作使用的SQL语句为INSERT语句,其语法格式如下:
  • 47. 47添加操作Statement stmt=conn.createStatement(); int rtn= stmt.executeUpdate("insert into tb_user (name,pwd) values('hope','111')"); 应用Statement对象向数据表tb_user中添加数据的关键代码如下:利用PreparedStatement对象向数据表tb_user中添加数据的关键代码如下:PreparedStatement pStmt = conn.prepareStatement("insert into tb_user (name,pwd) values(?,?)"); pStmt.setString(1,"dream"); pStmt.setString(2,"111"); int rtn= pStmt.executeUpdate();
  • 48. 48演示:示例 3它演示 SQL 中 INSERT 语句的用法JDBC 插入数据实现try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); } catch (ClassNotFoundException ce) { out.println(ce); } try { String url = "jdbc:odbc:test"; String str = "INSERT INTO “ + friends(name,address,salary)“ + "VALUES(‘朱八‘,’深圳 ‘,25690)"; Connection con = DriverManager.getConnection(url); Statement s = con.createStatement(); int rowcount = s.executeUpdate(str); String str1 = "select name, sum(salary) “ +from friends" + " group by name"; ResultSet rs = s.executeQuery(str1); while (rs.next()) { out.print(rs.getString(1) + "\t"); out.print(rs.getInt(2) + "\t"); out.println(" "); } rs.close(); s.close(); con.close(); } catch (SQLException ce) { out.println(ce); } } }
  • 49. 49修改操作Statement stmt=conn.createStatement(); int rtn= stmt.executeUpdate("update tb_user set name='hope',pwd='222' where name='dream'"); 应用Statement对象修改数据表tb_user中name字段值为“dream”的记录,关键代码如下:利用PreparedStatement对象修改数据表tb_user中name字段值为“hope”的记录,关键代码如下:PreparedStatement pStmt = conn.prepareStatement("update tb_user set name=?,pwd=? where name=?"); pStmt.setString(1,"dream"); pStmt.setString(2,"111"); pStmt.setString(3,"hope"); int rtn= pStmt.executeUpdate();
  • 50. 50删除操作Statement stmt=conn.createStatement(); int rtn= stmt.executeUpdate("delete tb_user where name='hope'"); 应用Statement对象从数据表tb_user中删除name字段值为“hope”的数据,关键代码如下: 利用PreparedStatement对象从数据表tb_user中删除name字段值为“dream”的数据,关键代码如下:PreparedStatement pStmt = conn.prepareStatement("delete from tb_user where name=?"); pStmt.setString(1,"dream"); int rtn= pStmt.executeUpdate();
  • 51. 51JDBC 删除和修改实现它演示 SQL 中各种命令的用法演示:示例 4Connection con; Statement stmt; String url; String sql; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); } catch (ClassNotFoundException ce) { out.println(ce); } try { url = "jdbc:odbc:test"; con = DriverManager.getConnection(url); sql = "Delete from friends where rtrim(name) like \'张三 \'"; out.println(" "); stmt = con.createStatement(); stmt.executeUpdate(sql); out.println("张三 的记录已删除“); stmt.close(); con.close(); con = DriverManager.getConnection(url); sql = "Update friends set address=\'青岛\' where “ + "rtrim(name) like \'李四\' "; out.println(" "); stmt = con.createStatement(); stmt.executeUpdate(sql); stmt.close(); con.close(); out.println("李四的记录已更新"); } catch (SQLException ce) { out.println(ce); } } }
  • 52. 52ResultSet执行插入插入 rs.moveToInsertRow(); rs.updateString("用户名", name); rs.updateString("用户密码", pwd); rs.updateString("用户类型", gly); rs.insertRow();
  • 53. 53ResultSet执行更新 1、 rset.absolute(2); //将游标定位到某一行 2、rset.updateString(4,“DDDD”); //将当前行第四列的值改为“DDDD” 或 rset.updateString(“字段名”,“字段值”); //将当前行指定字段的值改为“字段值” 3、rset.updateRow(); //将当更新保存到数据库 此处在实际使用中根据实际的数据类型而发生变化
  • 54. 54ResultSet执行删除 1、 rset.absolute(2); //将游标定位到某一行 2、rset.deleteRow();//将当前行删除
  • 55. 55使用预编译 通过Statement对象执行SQL语句时,在每次执行SQL语句时都要将该语句传送给数据库系统,编译后再执行。在多次执行同义语句时效率低下。 预编译语句在创建PreparedStatement 对象时能将SQL语句送给数据库系统进行预编译。当以后要执行同一SQL语句时,就直接执行,而不需要先将其编译,从而提高执行速度。
  • 56. 56为什么使用预编译语句1、提高效率 当需要对数据库进行数据插入、更新或者删除的时候,程序会发送整个SQL语句给数据库处理和执行。数据库处理一个SQL语句,需要完成解析SQL语句、检查语法和语义以及生成代码;一般说来,处理时间要比执行语句所需要的时间长。预编译语句在创建的时候已经是将指定的SQL语句发送给了DBMS,完成了解析、检查、编译等工作。因此,当一个SQL语句需要执行多次时,使用预编译语句可以减少处理时间,提高执行效率。
  • 57. 572、提高安全性 恶意的SQL语句 String sql = “select * from tb_name where name= ‘”+varname+“’ and passwd=‘”+varpasswd+“’”; 如果我们把[‘ or ’1‘ = ’1]作为varpasswd传入进来.用户名随意,看看会成为什么? select * from tb_name where name = ‘随意’ and passwd = ‘’ or ‘1’ = ‘1’;因为‘1’=‘1’肯定成立,所以可以任何通过验证.更有甚者: 把[‘;drop table tb_name;]作为varpasswd传入进来,则:select * from tb_name = ’随意‘ and passwd = ’‘;drop table tb_name;有些数据库是不会让你成功的,但也有很多数据库就可以使这些语句得到执行. 而如果你使用预编译语句.你传入的任何内容就不会和原来的语句发生任何匹配的关系.只要全使用预编译语句,你就用不着对传入的数据做任何过滤.而如果使用普通的statement,有可能要对drop;等做费尽心机的判断和过滤. 为什么使用预编译语句
  • 58. 58使用预编译1、创建 PreparedStatement 对象 String query="String * from Orders where Amount>? Or bumen=?"; PreparedStatement pstate; try{ pstate=connection.prepareStatement(query); }catch(SQLException sqlex){ //处理异常 }
  • 59. 59使用预编译 2、传递参数 在执行 PreparedStatement 对象之前,必须设置每个 ? 参数的值。这可通过调用 setXXX 方法来完成,其中 XXX 是与该参数相应的类型。例如,如果参数具有Java 类型 long,则使用的方法就是 setLong。setXXX 方法的第一个参数是要设置的参数的序数位置,第二个参数是设置给该参数的值。 pstate.setDouble(1,100.00); pstaet.setString(2,”研发部”); try{ ResultSet result=pstate.executeQuery(); } catch(SQLException e){ //处理异常 }
  • 60. 60JDBC事务的流程 JDBC事务的执行流程如图所示。 JDBC中的事务处理有两种方式:通过Connection接口中的setAutoCommit()方法设置手动提交或者自动提交事务。自动提交事务时,每当执行一条SQL时就会提交事务;手动提交事务时,必须调用Connection接口的commit()方法才会提交事务。
  • 61. 61JDBC对事务的设置 在默认情况下,JDBC驱动程序运行在“自动提交”模式下,这样做虽然方便,但程序运行时的开销比较大。可以利用批处理操作减小这种开销,但批处理操作要求事务不能处于自动提交模式下。为此,我们首先要禁用自动提交模式: con.setAutoCommit(false); 然后执行批处理操作: Statement stmt = connection.createStatement(); stmt.addBatch("insert into tbl_User values('城中狼1',5000,40); stmt.addBatch("insert into tbl_User values ('城中狼2',1500,24); stmt.addBatch("insert into tbl_User values ('城中狼3',6400,18); int[] updateCounts = stmt.executeBatch(); con.commit(); executeBatch()方法返回一个更新计数的数组,每个值对应于批处理操作中的一个命令。批处理操作可能会抛出一个类型为BatchUpdateException的异常,这个异常表明批处理操作中至少 有一条命令失败了。
  • 62. 62心得体会(1)如果使用oracle数据库时,需要更改Tomcat服务器的端口为8090,因为oracle数据库使用的端口也是8080。 (2)连接数据库可以用数据库本身的驱动程序,也可以用JDBC-ODBC桥接器等方法。对于初学者建议用桥接器方法。 (3)创建连接对象时,例如”jdbc:odbc:grade”中grade并不是指数据库名,又或者是表名,而是在设置数据源时的名字。 (4)如果是采用无参的createStatement()方法创建语句对象,在查询时,游标只能够顺序向下移动。例如:while(rs.next()){ a=rs.getString(1);c=rs.getString(3);b=rs.getString(2);}那么a和c能得到数据库的信息,由于游标已经移动到第三项,所以b就不能得到数据库信息了。如果需要游标上下移动,则在创建语句对象时应采用带参数的createStatement(int type,int concurrency)方法。
  • 63. 63心得体会(5)使用sql语句时要注意,每项的值如果是字符型要用“”号或‘’引用,condition=“select * from Student where Stu_Name=‘张三’”; rs=sql.executeQuery(condition); (6)如果在使用sql语句时要带变量的处理, String name=“张三”; condition=“select * from Student where Stu_Name=‘”+name+”’”; rs=sql.executeQuery(condition);
  • 64. 64总结JDBC概念的理解 使用 Class.forName() 方法可以将驱动程序加载到 Java 解释器中 使用 DriverManager 类的 getConnection() 方法和 Connection 对象的 createStatement() 方法可建立连接 最后,使用 executeQuery() 或 executeUpdate() 方法通过 Statement 实例构建并执行 SQL 语句 PreparedStatement 接口允许创建预编译的 SQL 语句,并使得在后续阶段可以指定语句的参数 结果集可以是可滚动的,也可以是不可滚动的