栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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.setAutoCommit(false);//开启事务

(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

5、处理查询(只有4执行的是select语句的时候才有这一步)

6、释放资源

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/327824.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号