【Java学习笔记】JDBC

JDBC学习笔记重编

(1)概念

Java Database Connectivity(java 数据库连接)sun公司定义的一套访问数据库的规范(接口+类)。主要放在java.sql/javax.sql包中。

(2)步骤

  1. 加载JDBC驱动程序
  2. 提供参数连接
  3. 建立一个数据库的连接
  4. 创建一个statement
  5. 执行SQL语句
  6. 处理结果
  7. 关闭JDBC对象
package name.liushiyao.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCDemo {
  public static void main(String[] a) {
    Connection connection = null;
    String sql;
    String url = "jdbc:mysql://localhost:3306/hibernate?"
        + "user=root&password=liushiyao&useUnicode=true&characterEncoding=UTF8";
    try {
      //加载JDBC驱动程序
      Class.forName("com.mysql.jdbc.Driver");
      //创建参数链接
      connection = DriverManager.getConnection(url);
      //创建statement
      Statement statement = connection.createStatement();
      sql = "SELECT *FROM user";
      //执行SQL语句
      ResultSet result = statement.executeQuery(sql);
      //处理结果
      while (result.next()) {
        System.out.println(result.getString(1));
      }
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    } catch (SQLException e) {
      e.printStackTrace();
    } finally {
      try {
        //关闭JDBC对象
        connection.close();
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
  }
}

(3)Connect引用对象

  1. 概念
    用具数据库的连接。客户端与数据库连接的就是通过connect对象进行的。(数据库中最重要的)。
  2. 常用方法

  3. createStatement(); 创建向数据库发送SQL的statement对象(用于发送SQL语句)

preparStatement(sql);
创建向数据库发送预编译的SQL的preparStatement对象。
commit(); 在连接上提交事务

preparCall(sql); 创建存储过程中的callableStatement对象。

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

注:什么时候需要把setAutoCommit设为false?
防止数据库数据更新时出现异常造成的数据更新失败

Statement接口

存在注入漏洞,通常用PreparedStatement替代
Statement对象用于执行SQL语句,共有三种查询方法:
executeQuery:用于产生单个结果集的语句,例如 SELECT 语句。

executeUpdate:用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQLDDL(数据定义语言)语句
executeUpdate 的返回值是一个整数,指示受影响的行数(即更新计数)。
execute:用于执行返回多个结果集、多个更新计数或二者组合的语句。

//可双向读取表中数据(游标可以回滚),只读
statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
设置后可以回滚操作:while(resultSet.previous())
//只是数据修改操作
statement.executeUpdate("insert into U values(4,'c4','a4@souhu.com',5,'444')");
//返回ResultSet对象
//专门用户SQL查询语句输出
resultSet = statement.executeQuery("SELECT * From REGION");

PreparedStatement接口与CallableStatement接口

Statement 每次执行sql语句,数据库都要执行sql语句的编译 ,最好用于仅执行一次查询并返回结果的情形,效率高于PreparedStatement.

PreparedStatement是预编译的,使用PreparedStatement有几个好处

a. 在执行可变参数的一条SQL时,PreparedStatement比Statement的效率高,因为DBMS预编译一条SQL当然会比多次编译一条SQL的效率要高。

b. 安全性好,有效防止Sql注入等问题。

c. 对于多次重复执行的语句,使用PreparedStament效率会更高一点,并且在这种情况下也比较适合使用batch;

d. 代码的可读性和可维护性。

获取Prepare的Statement是需要SQL初始化的,而Statement是不需要的。

CallableStatement接口扩展 PreparedStatement,用来调用存储过程,**它提供了对输出和输入/输出参数的支持。**CallableStatement 接口还具有对 PreparedStatement 接口提供的输入参数的支持。

注:PreparedStatement和CallableStatement都继承了Statement接口

    Statement statement = connection.createStatement();
//获取PreparedStatement
        PreparedStatement preparedStatement = connection.prepareStatement(query);

ResultSet

//输出查询结构
//定位到第4行(**从1开始计算,不是从0开始**)
resultSet.absolute(4);
while(resultSet.next())
{
System.out.println( resultSet.getInt("REGION_ID")+"用户名"+resultSet.getString("REGION_NAME"));
}
//
getObject()
//一定要及时释放资源
//遵循晚创建,早释放的原则
finally
        {
            if(statement != null)
            {
                try {
                    statement.close();
                } catch (SQLException e2) {
                    // TODO: handle exception
                    e2.printStackTrace();
                }
                statement = null;
            }
            if(resultSet != null)
            {
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                resultSet = null;
            }
            if(connection != null)
            {
                try {
                    connection.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                connection = null;
            }

加载驱动的方法

三种方法:

Class.forName("com.mysql.jdbc.driver");
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
System.setProperty("jdbc.driver","com.mysql.jdbc.Driver");

设计模式

JDBC体现了桥接模式:将抽象部分与它的实现部分分离,是他们都可以独立的变化。
JDBC连接数据库时,在哥各个数据库之间进行切换,基本不需要动用太多的代码,原因是因为JDBC提供了一套统一的接口,每个接口各自实现,用一个叫数据库驱动的程序来桥接就行了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值