面试之JDBC总结

一、相关概念
1、 什么是JDBC
       JDBC (Java Data Base Connectivity,java 数据库连接)是一种用于执行sql语句的java API,可以为多种关系数据库提供统一访问,它由一组用java语言编写的类和接口组成。
2、 JDBC架构
        JDBC API支持两层和三层处理模型进行数据库访问,但一般的JDBC体系结构由两层组成:
  • JDBC  API : 提供了应用程序对JDBC的管理连接
  • JDBC  Driver API: 支持JDBC管理到驱动连接

3、数据库驱动
      
       安装好数据库之后,我们的应用程序并不能直接使用数据库,必须通过相应的数据库驱动程序,t通过数据库驱动程序去和数据库打交道。其实也就是数据库厂商的JDBC接口的实现,即对Connection等接口的实现类的jar文件。
面试之JDBC总结_第1张图片


二、常用接口
1、Driver接口
     Driver接口由数据库厂商提供,作为java开发人员,之需要使用Driver接口就可以了。在编程中要连接数据库必须先安装特定厂商的数据库驱动程序,不同的数据库有不同的装载方法。
装载Mysql驱动:Class.forName("com.mysql.jdbc.Driver")
装载Oracle驱动:Class.forName("oracle.jabc.driver.OracleDriver")

2、DriverManager
      这个类管理数据库驱动程序的列表。确定内容是否符合从java 应用程序使用的通信子协议正确的数据库驱动程序的连接请求。识别JDBC子啊一定子协议的第一个取定程序将别用来简历数据库连接。
3、Connection 接口
     Connection 与特定数据库的连接(会话),在上下文中执行sql语句并返回结果。此接口有接触数据库的所有方法,连接对象便是通信上下文,即,与数据库中所有的通信都是通过此唯一的连接对象。

     DriverManager.getConnection(url,user,password) 方法来建立url 中定义的数据库来连接
    
     连接Mysql 数据库:Connection connection = DriverManager.getConnection("jdbc:mysql://host:port/database","user","password");
     其他数据库类似
    
     常用的方法:
                 createStatement(): 创建向数据库发送sql的statement对象。
                  prepareStatement(sql):创建相数据库发送预编译sql的PrepredStatement对象。
                 prepareCall(sql) : 创建执行存储过程的callableStatement对象。
                 setAutoCommit(boolean autoCommit) : 设置事务是否自动提交。
                 commit() :在连接上提交事务
                 rollback():在此连接上回滚事务

4、 Statement 接口
         用于执行静态sql语句并返回它所生成结果的对象
         三种Statement 类:
  • Statement  由createStatement创建,用于发送简单的sql语句(不带参数)
  • PreparedStatement    继承自Statement 接口,由prepareStatement(sql)创建,用于发送含有一个或者多个参数的sql语句。
            PreparedStatement对象采用预编译,比Statement对象效率更高。并且可以防止sql注入。
  • CallableStatement: 继承自PreparedStatement接口,由方法prepareCall()创建,用于存储调用过程。
       常用的Statement方法:
  •  execute(String sql)          运行语句,返回是否有结果集
  •  executeQuery(String sql) 运行select语句,返回ResulySet结果集
  • executeUpdate(String sql) 运行insert/delete/update 操作,返回更新的 行数。
  • addBatch(String sql) 把多条sql语句放到一个批处理中
  • executeBatch() 想数据库发送一批sql语句执行
5、ResultSet接口
            查询结果集,提供了检索不同类型字段的方法,常用的有:
  • getString(int index)   /  getString(String columnName)  获得在数据库里是varchar ,char 类型的数据对象
  • getFloat
  • getDate
  • getBoolean
  • getObjejct
ResultSet还提供了对结果集进行滚动的方法:
  • next() 移动到下一行
  • previous() 移动到前一行
  • absolute(int row) 移动到指定行
  • beforeFirst()移动到ResultSet 的最前面
  • afterLast()移动到ResultSet 的最后面
使用后依次关闭对象及连接:ResultSet ->  Statement ->Connection


三、使用JDBC步骤
   加载JDBC驱动程序 -->建立数据库连接Connection  --> 创建执行sql的语句Statement  --> 处理执行结果 ResultSet  --> 释放资源
1. 注册驱动(一次即可)
        方式一:Class.forName("com.Mysql.jdbc.Driver");
     推荐使用该方式,不会对具体的驱动列产生依赖。
       方式二: DriverManager.registerDriver(com.mysql.jdbc.Driver);
     会造成DriverManager中产生两个一样的驱动,并会对具体的驱动类产生依赖
2.建立连接
      Connection con = DriverManager.getConnection(url,uesr,password);

3. 创建执行sql语句的Statement

//Statement  
String id = "5";
String sql = "delete from table where id=" +  id;
Statement st = conn.createStatement();  
st.executeQuery(sql);  
//存在sql注入的危险
//如果用户传入的id为“5 or 1=1”,那么将删除表中的所有记录


//PreparedStatement 有效的防止sql注入(SQL语句在程序运行前已经进行了预编译,当运行时动态地把参数传给PreprareStatement时,即使参数里有敏感字符如 or '1=1'也数据库会作为一个参数一个字段的属性值来处理而不会作为一个SQL指令)
String sql = “insert into user (name,pwd) values(?,?)”;  
PreparedStatement ps = conn.preparedStatement(sql);  
ps.setString(1, “col_value”);  //占位符顺序从1开始
ps.setString(2, “123456”); //也可以使用setObject
ps.executeQuery();

4. 处理结果集ResultSet
ResultSet rs = ps.executeQuery();
while(rs.next()){
    rs.getString("col_name");
    rs.getInt(2);
...

}

5.释放资源

//数据库连接(Connection)非常耗资源,尽量晚创建,尽量早的释放
 //都要加try catch 以防前面关闭出错,后面的就不执行了
try {
    if (rs != null) {
        rs.close();
    }
} catch (SQLException e) {
    e.printStackTrace();
} finally {
    try {
        if (st != null) {
            st.close();
        }
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        try {
            if (conn != null) {
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

四、 事务(ACID特点,隔离级别,提交,回滚)

  • 事务的基本概念
                      一组要么同时成功,要么同时失败的sql语句,是数据库操作的一个基本执行单元。
                      事务开始于:
                                      连接到数据库上,并执行一条DML语句(Insert/delete/update)。
                                      前一个事务结束后,有输入了另外一条DML语句。
                      事务结束于:
                                      执行commit或rollback 语句。
                                      执行一条DCL语句,例如create table 语句,在次此情况下,会自动执行commit语句
                                      执行一条DCL语句,例如grant语句,在此情况下,会自动自行commit语句
                                      断开与数据库的连接
                                      执行了一条DML语句,该语句失败了,在此情况下,会为这个无效的DML语句执行rollback。

                     

  • 事务的四大特点
                    --atomicity 原子性
                                  表示一个事务内的所有操作是一个整体,要么全成功,哟啊么全失败
                    --consistency 一致性
                                  表示一个事务内有一个操作失败时,所有的更改过的数据都必须回滚到修改前的状态
                    --isolation 隔离性
                                  事务 查看数据时数据所处的状态,要么时另一个并发事务修改它之前的状态,要么是另一事物修改它之后的状态,事务不会查看中间状态的数据。
                    --durability 持久性
                                  持久性事务完成之后,它对于系统的影响是永久性的
  • 事务的隔离级别
                     --读取未提交数据
                     --读取已提交数据
                     --可重复读
                     --序列化

















你可能感兴趣的:(面试之JDBC总结)