JDBC--连接JVM和数据库的接口

一、概述

1、JDBC

     全称:java dataBase Connectivity java语言连接数据库

     JDBC实质是一个接口,  用来连接JVM和数据库的接口(SUN公司制定的一套接口)

2、作用

              将数据库与JVM建立连接,利用java语句动态操作数据库

               而不是用sql本身语言进行增删改查,拓宽了数据库的使用范围,

               同时为java操作提供了存储数据的空间

3、优点:

      面向接口编程--解耦合,降低程序的耦合度,提高程序的扩展力

4、为什么指定一套JDBC的接口?

     因为每个数据库的底层实现原理都不一样,为了统一接口实现 (桥接模式)

    SUN公司定义一套固定的JDBC接口,哪个数据库需要连接,则这个数据库的厂家则实现接口    

     SUN公司:接口的编写者(提供者)

     数据库厂家:接口的实现者

     Java程序员:接口实现类的调用者(利用接口连接数据库,实现相应的功能)

二、JDBC连接数据库的步骤

1、注册驱动

    告诉JVM即将要连接的是哪个品牌的数据库

一般方式:

(1)java.sql.Driver driver=new com.mysql.jdbc.Driver(); //获取驱动

         DriverManager.registerDriver(driver);//注册驱动

(2)DriverManager.registerDriver(new com.mysql.jdbc.Driver());

类加载方式:

         Class.forName(”com.mysql.jdbc.Driver“)

2、建立连接

 表示JVM的进程和数据库的进程之间的通道打开了

 属于进程之间的通信,重量级的,使用之后要关闭

 String url=”jdbc:mysql://localhost:3306/要连接的数据库名 “  ;

 String user=”root“;

 String password=”数据库对应密码“;

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

3、获得连接对象

数据库操作对象,用来执行sql语句的对象

Statement stmt=conn.createStatement();

4、执行sql语句

     连接对象调用sql语句

DML:增删改

        String sql=“sql语句”;

         int cout=stmt.executeUpdate(sql);//DML语句(insert update delete

DQL:查询 

          ResultSet rs=stmt.executeQuery(sql);

5、处理查询

 只有4执行的是select语句的时候才有这一步

           while(rs.next()){

              String 表的第1列名=rs.getString(1);       //法1:根据对应列数取

              String 表的第1列名=rs.getString(”第1列名“);//法2:根据列名取

              int 表的第1列名=rs.getInt(”第1列名“); //法3:根据数据类型取

            }

6、释放资源

 finally{ conn.close();}

三、Statement和PrepareStatement--sql注入

1、Statement---存在sql注入问题

Statement stmt=conn.createStatement();

String sql=“selsct * from user where LogName=‘ ”+logName+“ ’ and  logPwd=‘ ”+logPwd+“ ’ ”;//字符串拼接方式

ResultSet rs=stmt.executeQuery(sql);

if(rs.next()){登录成功}

2、 PrepareStatement--预编译,解决sql注入问题

String sql=“select * from t where  logName=? and logPwd=? ”//利用占位符

PrepareStatement pst=conn.PrepareStatement(sql); //预编译

pst.setString(1,logName);

pst.setString(2,logPwd);

ResultSet rs=pst.executeQuery();

if(rs.next()){登录成功}

解决sql注入问题的关键:

        用户提供的信息中即使含有sql语句关键字,但是这些关键字并没有参与编译,不起作用。

【注】

1、字符串中拼一个变量口诀:两个双引号两个+号

   “select * from t where  loginName=' "+loginName+" '  and loginPwd=' "+loginPwd+" ' ”

2、sql注入问题

  当用户输入的用户名和密码为这样时:

  用户名:aa

  密码:aa‘ or  '1'=1

  即使数据库中没有这个用户,也能登录成功

3、导致sql注入的原因:

      用户输入的信息中含有sql语句的关键字,并且这些关键字参与sql语句的编译过程,导致sql语句的原意被修改,进而达到sql注入

如:

原sql语句  “select * from t where  loginName=' "+loginName+" '  and loginPwd=' "+loginPwd+"' ”

输入  用户名:aa   密码:aa‘ or  '1'=1后

sql语句变为:“select * from t where  loginName=' aa'  and loginPwd=' aa‘ or  '1'=1' ”

  其中'1'=1' 是永远正确的,所以可以查到所有

四、JDBC事务

1、JDBC的事务机制--  自动提交

    JDBC只要执行任意一条DML语句就提交一次,不会等整个程序执行完才提交,不符合实际生活中的业务需求

2、手动设置提交事务   

(1)修改为手动提交

    conn.setAutoCommitfalse);//开启事务

(2)整个事务完成后,手动提交

      conn.commit(); //提交事务

(3)出现异常,事务手动回滚

    conn.rollback();//回滚事务

3、事务类型 

   单机事务----在同一个数据库中操作数据

                  ----多个DML语句都操作成功,才能成功,多个DML在一个事务中

   多机分布式事务-----数据库不止一个,数据库是集群形式的,在不同数据库中操作数据

                            ----多个数据库都操作成功,才能成功,多个数据库在一个事务中

五、url补充

1、url:统一资源定位符

          网络中某个资源的绝对路径

例:https://www.baidu.com

2、url组成部分

 http://182.61.200.7:80/ index.html

    通信协议:  http://

    服务器IP地址:  182.61.200.7  (某台计算机的代号)

    port 端口号:  80  (计算机某个软件的代号,数据库一般为3306,java程序一般为80)

   资源名:  index.html

 jdbc:mysql://localhost:3306/bjpowernode

 访问:本机上名为bjpowernode的数据库

3、本机IP地址:

     localhost

     127.0.0.1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值