1、28JAVA与数据库2JDBC详解java程序设计讲义JAVA与数据库2、JDBC详解教学重点Statement及其子接口的区别Statement的常用方法。SQL注入的漏洞演示PreparedStatement的优点,占位符及运行原理。PreparedStatement的常用方法。Properties配置文件的使用方法。教学难点数据库性能和安全意识,SQL注入,占位符,事务和批处理教学目标掌握Statement的接口及其子类 PreparedStatement CallableStatement熟练掌握常用的Statement的方法熟练PreparedStatement的使用熟悉SQL注入概
2、念 掌握MySQL的数据类型与JAVA数据类型的对应掌握批处理及事务的概念1、JDBC简介复习 时间: 10分钟 教学方法:提问1)、JDBC的概念及意义是什么?2)、JDBC是谁提供的?它是由一组接口和类组成的,常用的接口和类有哪些?3)、MySQL的驱动包是谁提供的?这个驱动包的内容是什么?4)、JAVA通过JDBC连接数据库的步骤有那几步? 引入MySQL的驱动包5.1.37 建立一个DBUtil工具类,用来提供驱动注册、获取数据库连接、释放资源的操作 通过DBUtil的getConnection方法获得数据库连接conn 通过conn获得一个Statement对象,用来发送SQL给数据
3、库服务器 如果是select操作,通过ResultSet处理结果集 通过DBUtil的release释放资源5)、资源释放的顺序是什么?2、Statement详解 时间: 15分钟教学方法:实际操作分析,讨论,解释1)、Statement接口Statement接口只能用来执行静态SQL,即不带参数的的SQL,获得Statement的方法有以下几种:返回Statement的java.sql中的方法StatementConnection.createStatement()创建一个Statement对象来将 SQL 语句发送到数据库。StatementConnection.createStateme
4、nt(intresultSetType, intresultSetConcurrency)创建一个Statement对象,该对象将生成具有给定类型和并发性的ResultSet对象。StatementConnection.createStatement(intresultSetType, intresultSetConcurrency, intresultSetHoldability)创建一个Statement对象,该对象将生成具有给定类型、并发性和可保存性的ResultSet对象。StatementResultSet.getStatement()获取生成此ResultSet对象的Stateme
5、nt对象。Statement的发送SQL语句给数据库的方式分为:executeQuery、executeUpdate课堂实例:完成jdbcDemo工程中的StudentDAO接口设计增加一条student数据删除一条student数据修改一条student数据查询数据库中的全部数据查询数据库中学生人数2)、SQL注入例如,在数据库中给student表增加一个password属性模拟登录操作控制台提示用户输入学号,等待用户输入控制台提示用户输入密码,等待用户输入系统获取学号和密码,判断登录是否成功将登录结果显示在控制台上public class SQLInjoin public static v
6、oid main(String args) Connection conn = DBUtil.getConnection(); Statement stmt = null; ResultSet rs = null; String sno = ; String password = ; Scanner sc = new Scanner(System.in); System.out.println(请输入学号); sno = sc.nextLine(); System.out.println(请输入密码); password = sc.nextLine(); try stmt = conn.cre
7、ateStatement(); String sql = select * from student where sno = + sno + and password = + password+; System.out.println(sql); rs = stmt.executeQuery(sql); if(rs.next() System.out.println(登录成功); else System.out.println(登录失败); catch (SQLException e) / TODO Auto-generated catch block e.printStackTrace();
8、 finally DBUtil.release(rs, stmt, conn); 3)、PreparedStatement接口ResultSetexecuteQuery()在此PreparedStatement对象中执行 SQL 查询,并返回该查询生成的ResultSet对象。intexecuteUpdate()在此PreparedStatement对象中执行 SQL 语句,该语句必须是一个 SQL 数据操作语言(Data Manipulation Language,DML)语句,比如INSERT、UPDATE或DELETE语句;或者是无返回内容的 SQL 语句,比如 DDL 语句。课堂示例:
9、如何使用PreparedStatement完成增删改查。3、存储过程 时间: 15分钟教学方法:实际操作分析,讨论,解释存储过程的调用: 存储过程是一种特殊的 SQL 语句,用于对数据库进行操作。存储过程放在数据库中,它可以把复杂的查询与客户端隔离,而只给客户提供必要的查询接口。使用存储过程的好处是性能好,他在服务器上执行,离数据最接近,比直接发送 SQL 语句速度要快得多。 存储过程的好处: 1.由于数据库执行动作时,是先编译后执行的。然而存储过程是一个编译过的代码块,所以执行效率要比T-SQL语句高。 2.一个存储过程在程序在网络中交互时可以替代大堆的T-SQL语句,所以也能降低网络的通信
10、量,提高通信速率。 3.通过存储过程能够使没有权限的用户在控制之下间接地存取数据库,从而确保数据的安全。public class CallProcedure /* * param args */ public static void main(String args) Connection conn = null; Statement stmt = null; try / 动态导入数据库的驱动 Class.forName(com.mysql.jdbc.Driver); / 获取数据库链接 conn = DriverManager.getConnection( jdbc:mysql:/local
11、host:3306/stu, root, root); / 创造调用存储过程的SQL String sql = CALL test_procedure(); / 执行调用存储过程的SQL语句 stmt = conn.prepareCall(sql); stmt.execute(sql); System.out.println(OK!); catch (Exception e) e.printStackTrace(); finally / 关闭Statement try stmt.close(); catch (Exception e) / 关闭Connection try conn.close
12、(); catch (Exception e) 4、ResultSet结果集与MySQL数据类型 时间: 15分钟教学方法:实际操作分析,讨论,解释BIT(1) (new in MySQL-5.0)BITjava.lang.BooleanBIT( 1) (new in MySQL-5.0)BITbyteTINYINTTINYINTjava.lang.Boolean if the configuration property tinyInt1isBit is set to true (the default) and the storage size is 1, or java.lang.Int
13、eger if not.BOOL, BOOLEANTINYINTSee TINYINT, above as these are aliases for TINYINT(1), currently.SMALLINT(M) UNSIGNEDSMALLINT UNSIGNEDjava.lang.Integer (regardless if UNSIGNED or not)MEDIUMINT(M) UNSIGNEDMEDIUMINT UNSIGNEDjava.lang.Integer, if UNSIGNED java.lang.Long (C/J 3.1 and earlier), or java.
14、lang.Integer for C/J 5.0 and laterINT,INTEGER(M) UNSIGNEDINTEGER UNSIGNEDjava.lang.Integer, if UNSIGNED java.lang.LongBIGINT(M) UNSIGNEDBIGINT UNSIGNEDjava.lang.Long, if UNSIGNED java.math.BigIntegerFLOAT(M,D)FLOATjava.lang.FloatDOUBLE(M,B)DOUBLEjava.lang.DoubleDECIMAL(M,D)DECIMALjava.math.BigDecima
15、lDATEDATEjava.sql.DateDATETIMEDATETIMEjava.sql.TimestampTIMESTAMP(M)TIMESTAMPjava.sql.TimestampTIMETIMEjava.sql.TimeYEAR(2|4)YEARIf yearIsDateType configuration property is set to false, then the returned object type is java.sql.Short. If set to true (the default) then an object of type java.sql.Dat
16、e (with the date set to January 1st, at midnight).CHAR(M)CHARjava.lang.String (unless the character set for the column is BINARY, then byte is returned.VARCHAR(M) BINARYVARCHARjava.lang.String (unless the character set for the column is BINARY, then byte is returned.BINARY(M)BINARYbyteVARBINARY(M)VA
17、RBINARYbyteTINYBLOBTINYBLOBbyteTINYTEXTVARCHARjava.lang.StringBLOBBLOBbyteTEXTVARCHARjava.lang.StringMEDIUMBLOBMEDIUMBLOBbyteMEDIUMTEXTVARCHARjava.lang.StringLONGBLOBLONGBLOBbyteLONGTEXTVARCHARjava.lang.StringENUM(value1,value2,.)CHARjava.lang.StringSET(value1,value2,.)CHARjava.lang.String5、批处理Batch
18、 时间: 15分钟教学方法:实际操作分析,讨论,解释批处理与非批处理分别插入2万条记录的性能比:6、事务概念及处理 时间: 15分钟教学方法:实际操作分析,讨论,解释1)、什么是事务public class RunInsert /* * param args */ public static void main(String args) Connection conn = null; Statement stmt = null; try / 动态导入数据库的驱动 Class.forName(com.mysql.jdbc.Driver); / 获取数据库链接 conn = DriverManag
19、er.getConnection( jdbc:mysql:/localhost:3306/jdbc_teaching, root, ); / 开启事务 conn.setAutoCommit(false); / 创造SQL语句 String sql = INSERT INTO user_list ( user_name, user_password )VALUES ( Eric, 123 ); / 执行SQL语句 stmt = conn.createStatement(); stmt.executeUpdate(sql); / 提交事务 mit(); System.out.println(OK!
20、); catch (Exception e) e.printStackTrace(); / 回滚事务 try conn.rollback(); catch (Exception e2) finally / 关闭Statement事务与批处理的混合使用,实际上不就是事务么?public class RunInsertBench public static void main(String args) Connection conn = null; Statement stmt = null; try / 动态导入数据库的驱动 Class.forName(com.mysql.jdbc.Driver
21、); / 获取数据库链接 conn = DriverManager.getConnection( jdbc:mysql:/localhost:3306/jdbc_teaching, root, ); / 开启事务 conn.setAutoCommit(false); / 创造执行SQL语句的环境 stmt = conn.createStatement(); / 添加处理进当前批次 stmt.addBatch(INSERT INTO user_list ( user_name,user_password ) VALUES (Name789, 234); stmt.addBatch(INSERT
22、INTO user_list ( user_name,user_password ) VALUES (Name567, 234); / 执行当前批次 stmt.executeBatch(); / 提交事务 mit(); System.out.println(OK!); catch (Exception e) e.printStackTrace(); / 回滚事务 try conn.rollback(); catch (Exception e2) finally / 关闭Statement try stmt.close(); catch (Exception e) / 关闭Connection try conn.close(); catch (Exception e) 7、properties配置文件 时间: 15分钟教学方法:实际操作分析,讨论,解释1、properties文件url=jdbc:mysql:/202.196.38.108:3306/stuuserName=rootpasswd=rootdriverName=com.mysql.jdbc.Driver2、DBUtil工具类
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1