JDBC开发步骤和prepareStatement的优点
来源:互联网 发布:二叉树反转python 编辑:程序博客网 时间:2024/05/16 06:27
一、JDBC开发步骤
- 1、加载JDBC驱动程序:
- 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),这通过java.lang.Class类的静态方法forName(String className)实现。 例如:
- try{
- //加载MySql的驱动类
- Class.forName("com.mysql.jdbc.Driver") ;
- }catch(ClassNotFoundException e){
- System.out.println("找不到驱动程序类 ,加载驱动失败!");
- e.printStackTrace() ;
- }
- 成功加载后,会将Driver类的实例注册到DriverManager类中。
- 2、提供JDBC连接的URL
- •连接URL定义了连接数据库时的协议、子协议、数据源标识。
- 书写形式:协议:子协议:数据源标识
- 协议:在JDBC中总是以jdbc开始
- 子协议:是桥连接的驱动程序或是数据库管理系统名称。
- 数据源标识:标记找到数据库来源的地址与连接端口。
- 例如:(MySql的连接URL)
- jdbc:mysql:
- //localhost:3306/test?useUnicode=true&characterEncoding=gbk ;
- useUnicode=true:表示使用Unicode字符集。如果characterEncoding设置为
- gb2312或GBK,本参数必须设置为true 。characterEncoding=gbk:字符编码方式。
- 3、创建数据库的连接
- •要连接数据库,需要向java.sql.DriverManager请求并获得Connection对象,
- 该对象就代表一个数据库的连接。
- •使用DriverManager的getConnectin(String url , String username ,
- String password )方法传入指定的欲连接的数据库的路径、数据库的用户名和
- 密码来获得。
- 例如:
- //连接MySql数据库,用户名和密码都是root
- String url = "jdbc:mysql://localhost:3306/test" ;
- String username = "root" ;
- String password = "gg" ;
- try{
- Connection con =
- DriverManager.getConnection(url , username , password ) ;
- }catch(SQLException se){
- System.out.println("数据库连接失败!");
- se.printStackTrace() ;
- }
- 4、创建一个Statement
- •要执行SQL语句,必须获得java.sql.Statement实例,Statement实例分为以下3
- 种类型:
- 1、执行静态SQL语句。通常通过Statement实例实现。
- 2、执行动态SQL语句。通常通过PreparedStatement实例实现。
- 3、执行数据库存储过程。通常通过CallableStatement实例实现。
- 具体的实现方式:
- Statement stmt = con.createStatement() ;
- PreparedStatement pstmt = con.prepareStatement(sql) ;
- CallableStatement cstmt =
- con.prepareCall("{CALL demoSp(? , ?)}") ;
- 5、执行SQL语句
- Statement接口提供了三种执行SQL语句的方法:executeQuery 、executeUpdate
- 和execute
- 1、ResultSet executeQuery(String sqlString):执行查询数据库的SQL语句
- ,返回一个结果集(ResultSet)对象。
- 2、int executeUpdate(String sqlString):用于执行INSERT、UPDATE或
- DELETE语句以及SQL DDL语句,如:CREATE TABLE和DROP TABLE等
- 3、execute(sqlString):用于执行返回多个结果集、多个更新计数或二者组合的
- 语句。
- 具体实现的代码:
- ResultSet rs = stmt.executeQuery("SELECT * FROM ...") ;
- int rows = stmt.executeUpdate("INSERT INTO ...") ;
- boolean flag = stmt.execute(String sql) ;
- 6、处理结果
- 两种情况:
- 1、执行更新返回的是本次操作影响到的记录数。
- 2、执行查询返回的结果是一个ResultSet对象。
- • ResultSet包含符合SQL语句中条件的所有行,并且它通过一套get方法提供了对这些
- 行中数据的访问。
- • 使用结果集(ResultSet)对象的访问方法获取数据:
- while(rs.next()){
- String name = rs.getString("name") ;
- String pass = rs.getString(1) ; // 此方法比较高效
- }
- (列是从左到右编号的,并且从列1开始)
- 7、关闭JDBC对象
- 操作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源,关闭顺序和声
- 明顺序相反:
- 1、关闭记录集
- 2、关闭声明
- 3、关闭连接对象
- if(rs != null){ // 关闭记录集
- try{
- rs.close() ;
- }catch(SQLException e){
- e.printStackTrace() ;
- }
- }
- if(stmt != null){ // 关闭声明
- try{
- stmt.close() ;
- }catch(SQLException e){
- e.printStackTrace() ;
- }
- }
- if(conn != null){ // 关闭连接对象
- try{
- conn.close() ;
- }catch(SQLException e){
- e.printStackTrace() ;
- }
- }
二、preparestatement的优点
我们为什么在程序中要使用PreparedStatement而不是Statement?有以下几个原因。
1,从程序本身的角度来看,PreparedStatement更具效率。
我们通过connection.preparedStatement(sql)方法来获得PreparedStatment对象,然后通过preStatement.setXXX来设置查询参数。
如果我有2个查询,SQL语句都一样,但是参数不同,使用PreparedStatment的话只需setXXX不同的参数、再次查询即可,而如果使用Statement的话,
需要重新创建Statement对象,connection.createStatement(sql)
2,从数据库层面来讲,PreparedStatment更具效率。
在使用PreparedStatement时,数据库系统会对sql语句进行预编译处理(前提是JDBC驱动支持),具体包括SQL语句的分析,编译,优化等过程,预编译后会缓存起来,执行计划同样也会缓存起来,编译的sql查询语句能在将来的查询中重用(同样的查询,哪怕参数值不同)。需要注意的是,使用PreparedStatement时,SQL不要用String追加参数值,而应该使用preStatement.setXXX来设置查询参数。
3,PreparedStatment可以防止SQL注入。
如:String sql = "SELECT * FROM user WHERE name = '"+ userName + "' and password = '"+ passWord +"';"
恶意输入参数值:userName = "1' OR '1'='1"; passWord = "1' OR '1'='1";
最终sql会变成:String sql = "SELECT * FROM user WHERE name = '1' OR '1'='1' and password= '1' OR '1'='1';"
这条语句相当于select * from user。
如果用户再加上drop table user,后果将不堪设想。
所以使用PreparedStatement能避免此种情况,因为数据库系统不会将参数的内容视为SQL指令的一部分来处理,只有在数据库完成SQL指令的编译后,才套用参数运行。因此就算参数中含有破坏性的指令,也不会被数据库所运行。
- JDBC开发步骤和prepareStatement的优点
- jdbc中PrepareStatement与Statement的优点
- 预编译的优点(Statement和PrepareStatement 的区别)
- JDBC Statement 和 PrepareStatement的用法
- JDBC中prepareStatement 和Statement 的区别
- JDBC PrepareStatement 和 Statement
- JDBC的PrepareStatement
- jdbc prepareStatement的运用
- JDBC的优点和缺点
- jdbc Statement和PrepareStatement操作
- JDBC中Statement和PrepareStatement的区别及特性
- JDBC中Statement和PrepareStatement的区别及特性
- JDBC中Statement和PrepareStatement的区别及特性
- JDBC中Statement和PrepareStatement的区别及特性
- JDBC中Statement和PrepareStatement的区别及特性
- JDBC中Statement和PrepareStatement的区别及特性
- JDBC中Statement和PrepareStatement的区别及特性
- 浅谈 JDBC 中 CreateStatement 和 PrepareStatement 的区别与优劣。
- MFC下的链接按钮呀
- 关于表单提交中,元素属性为readonly或disabled的一个小细节~~
- WireShark过滤语法详解
- 用户登录时的用户名密码加密解密问题和“记住密码”功能
- 面试题集锦 1
- JDBC开发步骤和prepareStatement的优点
- iOS中如何添加自定义的字体
- 使用ActiveMQ时遇到的坑
- 黑马程序员_Java面向对象
- android开发中输入法的弹出和隐藏
- TRANSLATE函数的用法
- 黑马程序员_Java_内部类
- 2015/6/4 深圳--爱家纪
- php json_decode()返回null的解决方案