您的位置:首页 > 编程语言 > Java开发

java核心技术之JDBC (一)

2015-01-11 01:02 211 查看


JDBC

[align=justify]
[/align]

1.什么是JDBC

 JDBC的全称是Java DataBase Connection,也就是Java数据库连接,我们可以

用它来操作关系型数据库。JDBC接口及相关类在java.sql包和javax.sql包里。我们

可以用它来连接数据库,执行SQL查询,存储过程,并处理返回的结果。

JDBC接口让Java程序和JDBC驱动实现了松耦合,使得切换不同的数据库变得更加

简单

2.jdbc使用过程

1.     注册驱动 (Driver)

2.     建立连接(创建Connection)

3.     创建执行sql语句(通常是创建Statement或者其子类)

4.     执行语句

5.     处理执行结果(在非查询语句中,该步骤是可以省略的)

6.     释放相关资源

[align=left]package com. db.jdbc ;[/align]
[align=left]
[/align]
[align=left]import java. sql.Connection ;[/align]
[align=left]import java. sql.DriverManager ;[/align]
[align=left]import java. sql.ResultSet ;[/align]
[align=left]import java. sql.SQLException ;[/align]
[align=left]import java. sql.Statement ;[/align]
[align=left]import org. junit.Test ;[/align]
[align=left]
[/align]
[align=left]public class jdbcTest {[/align]
[align=left]      final String url = "jdbc:mysql://localhost:3306/test" ;[/align]
[align=left]      final String user = "root";[/align]
[align=left]      final String password = "";[/align]
[align=left]     ResultSet rs = null;[/align]
[align=left]     Statement st = null;[/align]
[align=left]     Connection connection = null;[/align]
[align=left]      @Test[/align]
[align=left]      public void test_jdbc(){[/align]
[align=left]           try {[/align]
[align=left]              Class .forName( "com.mysql.jdbc.Driver");//加载驱动[/align]
[align=left]               connection = DriverManager.getConnection( url, user, password);//获取链接[/align]
[align=left]               st = connection. createStatement();//创建执行[/align]
               rs = st. executeQuery("select
* from test");//执行
[align=left]               while( rs.next ()){//处理结果[/align]
[align=left]                   System .out. println(rs .getString( "name"));[/align]
[align=left]               }[/align]
[align=left]              [/align]
[align=left]           } catch (Exception e) {[/align]
[align=left]              e .printStackTrace();[/align]
[align=left]           }finally {[/align]
[align=left]                    try {[/align]
[align=left]                         if( rs!=null){[/align]
[align=left]                              rs.close ();[/align]
[align=left]                         }[/align]
[align=left]                         if( st!=null){[/align]
[align=left]                              st.close ();[/align]
[align=left]                         }[/align]
[align=left]                         if( connection!=null){[/align]
[align=left]                              connection.close ();[/align]
[align=left]                         }[/align]
[align=left]                        [/align]
[align=left]                    } catch (SQLException e) {[/align]
                         // TODO Auto-generated
catch block
[align=left]                        e .printStackTrace();[/align]
[align=left]                    }[/align]
[align=left]              [/align]
[align=left]           }[/align]
[align=left]      }[/align]
[align=left]}[/align]
[align=left][/align]
[align=left]
[/align]
[align=left]
[/align]

3.注册驱动的方式

Class.forName("com.mysql.jdbc.Driver");
System.setProperty("jdbc.drivers",
"com.mysql.jdbc.Driver");
DriverManager .registerDriver(new Driver());
测试代码:
[align=left]@Test[/align]
[align=left]      public void test_register_Driver(){[/align]
[align=left]           try {[/align]
[align=left]//            Class.forName("com.mysql.jdbc.Driver");[/align]
[align=left]//            System.setProperty("jdbc.drivers", "com.mysql.jdbc.Driver");[/align]
[align=left]              DriverManager .registerDriver( new Driver());[/align]
[align=left]              Connection connection = DriverManager.getConnection( url, user, password);[/align]
[align=left]              Assert .assertEquals( false, connection.isClosed());[/align]
[align=left]           } catch (Exception e) {[/align]
[align=left]              e .printStackTrace();[/align]
[align=left]           }[/align]
[align=left]      }[/align]
[align=left]这三个注册驱动的方式有什么不同喃?[/align]

4.statement

一个statement 只能维护一个resultSet

为什么喃?

我是这样理解的,一个连接可以通过不同的操作来获取不同的结果,每一个不同的结果都有不同的statement来装,而一个statement对象对应着一个resultset结果,如果一个statement装着不同的结果,那我们以哪个为准喃?所以一个statement
只能维护一个resultSet

[align=left]@Test[/align]
[align=left]public void test_statement() throws Exception{[/align]
[align=left]          Class .forName( "com.mysql.jdbc.Driver");[/align]
[align=left]          Connection connection = DriverManager.getConnection( url, user, password);[/align]
[align=left]          Statement st = connection.createStatement ();[/align]
          ResultSet rs = st.executeQuery ("select
* from test");
[align=left]           while( rs.next ()){[/align]
[align=left]              rs .close();[/align]
[align=left]           }[/align]
          ResultSet rs1 = st.executeQuery ("select
* from test");
[align=left]           while( rs1.next ()){[/align]
[align=left]              [/align]
[align=left]           }[/align]
[align=left]          [/align]
[align=left]      }[/align]
[align=left]结果:报错[/align]
5.Statement和PrparedStatement的区别?

看看statement和 PrparedStatement执行同样的查询

[align=left]@Test[/align]
[align=left]public void test_statement() throws Exception{[/align]
[align=left]          Class .forName( "com.mysql.jdbc.Driver");[/align]
[align=left]          Connection connection = DriverManager.getConnection( url, user, password);[/align]
[align=left]          Statement st = connection.createStatement ();[/align]
[align=left]          String id = "1";[/align]
          ResultSet rs = st.executeQuery ("select
* from test where id="+id );
[align=left]           while( rs.next ()){[/align]
[align=left]          System .out. println(rs .getString( "name"));[/align]
[align=left]           }[/align]
[align=left]          [/align]
[align=left]      }[/align]

结果:OK

@Test

 public void test_prestatement() throws Exception{

          Class .forName( "com.mysql.jdbc.Driver");

          Connection connection = DriverManager.getConnection( url, user, password);

          PreparedStatement ps = connection.prepareStatement( "select
* from test where id=?");

          ps .setString( 1, "1");

          ResultSet rs = ps.executeQuery ();

           while( rs.next ()){

          System .out. println(rs .getString( "name"));

           }

          

      }

结果:OK

结果都是OK,到底有什么区别喃?

如果我们把id的值赋值为“or 1 or ”,上面查出来的就是全部。。
这个就是我们经常说sql注入攻击
第二个区别就是:preparedStetement 可以预编译语句,可以缓存起来,提高查询速度

下次继续写JDBC的事物,数据库隔离级别,存储过程,还有就是回答上面的那个问题,三个注入有什么区别?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: