JDBC

作者: 浮生闲游 | 来源:发表于2020-01-13 22:59 被阅读0次

    jdbc是javaee十三项标准中的一项,作用是规范java程序与数据库的连接方式。
    jdbc的原始接口存在于rt.jar下的java.sql包下。
    驱动的加载方式(以mysql为例):

    public class DriverextendsNonRegisteringDriver implements java.sql.Driver{
      static{
      try{
        java.sql.DriverManager.registerDriver(newDriver());
      }catch(SQLExceptionE) {
        thrownewRuntimeException("Can't register driver!");       
      }    
    }
    

    就是说在执行Class.forName("com.mysql.jdbc.Driver");时,驱动已经注册进了DriverManager里面了,后面直接在DriverManager里面获取连接等即可。
    完整的接口调用方式如下:

    Class.forName("com.mysql.jdbc.Driver");
    Connectionconnection=DriverManager.getConnection("","","");
    PreparedStatementpreparedStatement=connection.prepareStatement("");
    ResultSetresultSet=preparedStatement.executeQuery("");
    

    关于statement和prepareStatement

    预编译:引用自https://blog.csdn.net/Marvel__Dead/article/details/69486947

    所以到了这里我的疑惑都解开了,PreparedStatement的预编译是数据库进行的,编译后的函数key是缓存在PreparedStatement中的,编译后的函数是缓存在数据库服务器中的。预编译前有检查sql语句语法是否正确的操作。只有数据库服务器支持预编译功能时,JDBC驱动才能够使用数据库的预编译功能,否则会报错。预编译在比较新的JDBC驱动版本中默认是关闭的,需要配置连接参数才能够打开。在已经配置好了数据库连接参数的情况下,Statement对于MySQL数据库是不会对编译后的函数进行缓存的,数据库不会缓存函数,Statement也不会缓存函数的key,所以多次执行相同的一条sql语句的时候,还是会先检查sql语句语法是否正确,然后编译sql语句成函数,最后执行函数。
    对于PreparedStatement在设置参数的时候会对参数进行转义处理。
    因为PreparedStatement已经对sql模板进行了编译,并且存储了函数,所以PreparedStatement做的就是把参数进行转义后直接传入参数到数据库,然后让函数执行。这就是为什么PreparedStatement能够防止sql注入攻击的原因了。
    PreparedStatement的预编译还有注意的问题,在数据库端存储的函数和在PreparedStatement中存储的key值,都是建立在数据库连接的基础上的,如果当前数据库连接断开了,数据库端的函数会清空,建立在连接上的PreparedStatement里面的函数key也会被清空,各个连接之间的预编译都是互相独立的。

    相关文章

      网友评论

        本文标题:JDBC

        本文链接:https://www.haomeiwen.com/subject/auxoactx.html