天天看点

jdbc入门到精通1

[1]jdbc的概念

  • 什么是jdbc

    JDBC(Java DataBase Connectivity)就是Java数据库连接,说白了就是用Java语言来操作数据库。原来我们操作数据库是在控制台使用SQL语句来操作数据库,JDBC是用Java语言向数据库发送SQL语句。

  • 图例:
jdbc入门到精通1
  • jdbc的由来
    • 早期SUN公司的天才们想编写一套可以连接天下所有数据库的API,但是当他们刚刚开始时就发现这是不可完成的任务,因为各个厂商的数据库服务器差异太大了。后来SUN开始与数据库厂商们讨论,最终得出的结论是,由SUN提供一套访问数据库的规范(就是一组接口),并提供连接数据库的协议标准,然后各个数据库厂商会遵循SUN的规范提供一套访问自己公司的数据库服务器的API出现。SUN提供的规范命名为JDBC,而各个厂商提供的,遵循JDBC规范的,可以访问自己数据库的API被称之为驱动!
    • JDBC是接口,而JDBC驱动才是接口的实现,没有驱动无法完成数据库连接!每个数据库厂商都有自己的驱动,用来连接自己公司的数据库。当然还有第三方公司专门为某一数据库提供驱动,这样的驱动往往不是开源免费的!
    • 总的来说,大致分为以下四个阶段:
      • 1:JDBC-ODBC桥接阶段 :Java-ODBC-DB

        ​ 使用odbc,桥接访问数据库

        ​ java刚出名,缺少访问数据库的方式,sun公司找数据库厂商提供,厂商未提供,采用中转方案,使用用为c语言编写的odbc技术来访问数据库。

      • 2:Native阶段:Java-JDBC-Client-DB

        使用数据库厂商提供的实现访问数据库

        Java出名一段时间了,sun公司又找数据库厂商提供,厂商提供了一套自己实现的jdbc-client,用与访问数据库。

      • 3:JDBC-net pure java drvier: client-general protocol-server-DB

        Java通过访问容器服务,去获取数据库连接,进而访问数据库

        Java更出名了,由于出现了数据库迁移的需求,例如sqlserver转oracle,由于jdbc-client的差异,导致迁移问题,于是sun公司出了一套jdbc访问数据库的接口,统一了各个厂商之间的jdbc-client底层代码实现差异。

      • 4:native protocal pure java:java-JDBC-DB

        jdbc的持续更新,可以通过java程序去找数据库驱动,然后来连接数据库

  • jdbc包含的内容
    • 接口部分:sun公司提供,在jdk的

      java.sql.*

      javax.sql.*

      包中,例:
      class java.sql.DriverManager 管理多个数据库驱动类,提供了获取数据库连接的方法。
      interface java.sql.Connection 代表一个数据库连接(当Connection对象不为null时,代表已经连接上了数据库)。
      interface java.sql.Statement 发送SQL语句到数据库的工具。
      interface java.sql.PreparedStatement Statement的子类,对其进行了封装,可以处理带占位符的sql语句,解决了sql注入的问题
      interface java.sql.ResultSet 保存SQL查询语句的结果数据(结果集)。
    • DriverManger(驱动管理器)的作用有两个:
      • 注册驱动:这可以让JDBC知道要使用的是哪个驱动;
      • 获取Connection:如果可以获取到Connection,那么说明已经与数据库连接上了。
    • Connection对象表示连接,与数据库的通讯都是通过这个对象展开的:
      • Connection最为重要的一个方法就是用来获取Statement对象;
      • Statement是用来向数据库发送SQL语句的,这样数据库就会执行发送过来的SQL语句
      • void executeUpdate(String sql):执行更新操作(insert、update、delete等);
      • ResultSet executeQuery(String sql):执行查询操作,数据库在执行查询后会把查询结果,查询结果就是ResultSet;
    • ResultSet对象表示查询结果集,只有在执行查询操作后才会有结果集的产生。结果集是一个二维的表格,有行有列。操作结果集要学习移动ResultSet内部的“行光标”,以及获取当前行上的每一列上的数据:
      • boolean next():使“行光标”移动到下一行,并返回移动后的行是否存在;
      • XXX getXXX(int col):获取当前行指定列上的值,参数就是列数,列数从1开始,而不是0。
  • 实现部分:由数据库厂商提供,例oracle
    • ojdbc14 jdk1.4编写
    • ojdbc5 jdk1.5编写
    • ojdbc6 jdk1.6编写

[2]jdbc开发步骤[重点]

我使用的Ecllipse,需要新建一个普通的java project
           
  1. 注册驱动

    I. 将Oracle数据库驱动

    ojdbc14.jar

    复制到项目的lib文件夹中。

    II.

    ojdbc14.jar

    右键 -> build path -> add to build path。

    III.

    Class.forName("oracle.jdbc.OracleDriver");

    //手动加载字节码文件到JVM中。
  2. 获取连接
    1. 获取连接需要两步,一是使用DriverManager来注册驱动,二是使用DriverManager来获取Connection对象。

      获取连接的也只有一句代码:

      DriverManager.getConnection(url,username,password),

    2. 通过DriverManager获取数据库连接对象(Connection),指定三个参数,如下所示:
      url:jdbc:oracle:thin:@192.168.230.10:1521:orcl
      username:username
      password:password
                 
  3. 获得发送SQL的工具:

    I. 编写即将执行的SQL语句(语句中不能包含分号)。

    II. 通过Connection创建Statement对象。例:

    Statement stm = con.createStatement();

    III. Statement是用来向数据库发送要执行的SQL语句的!
  4. 发送sql并接收执行结果

    I. DML语句:增删改时,返回受影响行数(int类型)。

    II. DQL语句:查询时,返回结果数据(ResultSet结果集)。

  5. 处理结果

    I. DML:增删改时,返回受影响行数(int类型)。

    II. DQL:查询时,返回结果集(ResultSet类型)。

  6. 释放资源

    I. 遵循先开后关。

    II. Connection、PreparedStatement、ResultSet。

[3]ResultSet(结果集)【重点】:

  1. 作用:存储查询到的结果数据。
  2. 使用:

    ResultSet rs = stat.executeQuery(sql);

  3. 获得ResultSet中的数据:
jdbc入门到精通1
  1. 数据行指针:

    初始位置在第一行数据前,每调用一次boolean next()方法,返回为true,则ResultSet的指针向下移动一位

  2. ResultSet的API:

    rs.next() //判断是否存在下一行

    rs.getXXX(columnIndex) //列的编号(从1开始)

    rs.getXXX(columnLabel) //列的名称

[4]PreparedStatement【重点】:

  1. 概念:预编译SQL命名对象
  2. 参数化SQL:可通过" ? "进行参数的占位

    String sql = "select * from t_account where cardId = ? and password = ?";

  3. 绑定动态参数:

    ps.setInt(1,值);

    ps.setDouble(2,值);

    ps.setString(3,值);

    ps.setDate(4,值);

    ps.setObject(5,值); //通用

  4. 发送绑定参数到数据库执行SQL:

    I. int ps.executeUpdate(); //执行增删改

    II. ResultSet ps.executeQuery(); //执行查询

  5. PreparedStatement的好处:

    I. 作用:发送预编译的SQL语句。

    II. 优势:防止SQL注入攻击,执行多个同构SQL的效率高。

    III. 计算访问计划(Access Plan)等效于Oracle的Map集合,将SQL语句一起缓存到内存中。//首次访问相对耗时 SQL = key/plan = value

    IV. 通过SQL语句查找Oracle缓存访问计划并执行。

[5]jdbc常见错误

类名错误
jdbc入门到精通1
URL错误
jdbc入门到精通1
服务没开
jdbc入门到精通1
Listener服务没开
jdbc入门到精通1
动态参数个数与占位符个数不匹配
jdbc入门到精通1
书写了小于零,或大于占位符个数的值
jdbc入门到精通1