java核心技术之JDBC (一)

JDBC


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.     释放相关资源
package  com .  db . jdbc  ;

import  java .  sql . Connection  ;
import  java .  sql . DriverManager  ;
import  java .  sql . ResultSet  ;
import  java .  sql . SQLException  ;
import  java .  sql . Statement  ;
import  org .  junit . Test  ;

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




3.注册驱动的方式
  • Class.forName("com.mysql.jdbc.Driver");
  • System.setProperty("jdbc.drivers", "com.mysql.jdbc.Driver");
  • DriverManager .registerDriver(new Driver());
测试代码:
@Test
       public  void  test_register_Driver (){
            try  {
//            Class.forName("com.mysql.jdbc.Driver");
//            System.setProperty("jdbc.drivers", "com.mysql.jdbc.Driver");
              DriverManager  . registerDriver ( new  Driver ());
              Connection  connection  =  DriverManager . getConnection (  url ,  user ,  password );
              Assert  . assertEquals ( false,  connection . isClosed ());
            }  catch  ( Exception  e )  {
              e  . printStackTrace ();
            }
       }

这三个注册驱动的方式有什么不同喃?
4.statement
一个statement 只能维护一个resultSet
为什么喃?
我是这样理解的,一个连接可以通过不同的操作来获取不同的结果,每一个不同的结果都有不同的statement来装,而一个statement对象对应着一个resultset结果,如果一个statement装着不同的结果,那我们以哪个为准喃?所以一个 statement 只能维护一个resultSet
@Test
public  void  test_statement ()  throws  Exception {
          Class  . forName (  "com.mysql.jdbc.Driver" );
          Connection  connection  =  DriverManager . getConnection (  url ,  user ,  password );
          Statement  st  =  connection . createStatement  ();
          ResultSet  rs  =  st . executeQuery  ( "select * from test" );
            while(  rs . next  ()){
              rs  . close ();
            }
          ResultSet  rs1  =  st . executeQuery  ( "select * from test" );
            while(  rs1 . next  ()){
              
            }
          
       }
结果:报错

5.Statement和PrparedStatement的区别?
看看statement和  PrparedStatement执行同样的查询

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

结果: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的事物,数据库隔离级别,存储过程,还有就是回答上面的那个问题,三个注入有什么区别?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值