JDBC Java Database Connectivity

通过JDBC这个Java API以统一的方式来连接不同的数据库,可以跨平台,跨数据库,然后通过Statement对象执行标准的SQL语句,并可以获得SQL语句访问数据库的结果。即三个本工作:建立连接,执行SQL语句,获得执行结果

组成JDBC的两个包:java.sql和javax.sql

建立连接:

第一步:注册驱动--确定要操作的是哪个数据库

  普通注册驱动:DriverManager.registerDriver(new Driver());

    由于Driver类的静态代码块中有注册一次驱动,所以导致注册两次驱动

  改进方式:Class.forName("com.mysql.jdbc.Driver");

    两个好处:

      1.避免了注册两次驱动

      2.驱动是以字符串形式声明,可以放到配置文件中,使用程序去读取配置文件的信息。将来用其他数据库时,不用修改源码,只需修改配置文件

第二步:建立与数据库的连接

  conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/xxx","user","password");

  建立连接返回的是Connection对象,这个对象表示与数据库服务器建立的连接,后续操作都是基于这个对象,常用方法:

    createStatement():创建向数据库发送sql的Statement对象

    prepareStatement(sql):创建向数据库发送预编译sql的PreparedStatement对象

    prepareCall(sql):创建执行存储过程的callableStatement对象

    setAutoCommit(boolean autoCommit):设置事务是否自动提交

    commit():在链接上提交事务

    rollback():在此链接上回滚事务

第三步:获得可以发送SQL语句的Statement对象

  Statement stmt = conn.createStatement();

  State,PreparedState,CallableStatement区别和联系:

    1.三者都是接口,interface

    2.Statement继承自Wrapper,PreparedStatement继承自Statement,CallableStatement继承自PreparedStatement

    3. Statement接口提供了执行语句和获取结果的基本方法

      Preparement接口添加了处理IN参数的方法

      CallableStatement接口添加了处理OUT参数的方法

    4. Statement:普通的不带参数的查询SQL,支持批量更新批量删除

      PreparedStatement:可变参数的SQL,编译一次,执行多次,效率高,安全性好,有效防止SQL注入等问题,支持批量更新批量删除

      CallableStatement:支持带参数的SQL操作,支持调用存储过程,提供了对输出和输入/输入参数的支持

第四部:执行语句,获得结果集对象

  ResultSet rs = stmt.executeQuery();

  executeQuery:返回结果集ResultSet

  executeUpdate:执行给定SQL语句,语句可能为INSERT,UPDATE或DELETE局域

  execute:可用于执行任何SQL语句,返回一个boolean值,表名执行该SQL语句是否返回了一个ResultSet

第五步:解析结果集

  找对应的getXxx方法

第六步:释放资源

  在finally块中释放

  if(rs !=null){

    try{rs.close()}catch(SQLExecption e){e.printStackTrace();}

    re = null;

  }

  if(stmt !=null){

    try{stmt .close()}catch(SQLExecption e){e.printStackTrace();}

    stmt = null;

  }

  if(conn !=null){

    try{conn.close()}catch(SQLExecption e){e.printStackTrace();}

    conn = null;

  }

出现异常需要回滚,在catch块中调用rollback()

批处理:使用Batch,处理多条SQL语句

  stmt.addBatch("create database xxx");

  stmt.addBatch("use xxx");

  stmt.addBatch("create table...");

  stmt.executeBatch();

事务控制:

  conn.setAutoCommit(false)  相当于start transaction,开启事务

  一系列操作。。。。

  conn.commit()

  catch块rollback

连接池:

  实现DataSource接口,创建一些连接conn,按需使用和送回

原文地址:https://www.cnblogs.com/zawjdbb/p/7069918.html