一文了解JDBC|青训营笔记

117 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的第7天。

在编写程序时,数据库操作必不可少,那么,如何用java连接并操作数据库呢?让我们一起来了解JDBC。

什么是JDBC

JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。

JDBC的java api有四个常用的接口和一个类(Connection接口、Statement接口、PreparedStatement接口、ResultSet接口和DriverManager类)

使用步骤

  1. 注册数据库驱动(利用反射)
  2. 取得数据库连接对象Connection
  3. 访问数据库
  4. 处理结果集
  5. 依次关闭结果集

注册Java数据库驱动程序

在执行之前需要导入java.sql包,可通过Maven或者直接导入jar包。(根据不同的数据库导入不同的包)
通过注册驱动,反射方式加载:

class.forName("Com.mysql.jdbc");

与数据库建立连接

String url = "jdbc:mysql://127.0.0.1:3306/databaseName";
//设置用户名
String username = "your database username";
//设置密码
String password = "your database password";
//获得连接对象、Connection接口的使用以及DriverManager类的使用
Connection con = (Connection)DriverManager.getConnection(url, username, password);

访问数据库

String sql;
st=con.createStatement();
rs=st.executeQuery(sql);

定义sql变量,用于编写SQl语句,使用Connection的createState方法访问数据库。

处理返回结果集

while(rs.next()){
System.out.println(rs.getString("id")+" "+rs.getString("name")+" "+rs.getString("age")+" "+rs.getString("address"));
}

ResultSet对象指向结果集的第一行,通过next方法循环遍历结果集,可以通过getXXX方法获得此行相应列的值,参数为列名。

关闭数据库

先打开的后关闭,后打开的先关闭。

rs.close();
st.close();
con.close();

数据库连接池

不断的创建、销毁链接,会导致访问数据库服务器的压力,而且对于内存来说,不断的开辟与销毁,内存的使用率极低。使用数据库连接池可以明显提高对数据库操作的性能!数据库连接池的解决方案是在应用程序启动时建立足够的数据库连接,并将这些连接组成一个连接池(简单说:在一个“池”里放了好多半成品的数据库连接对象),由应用程序动态地对池中的连接进行申请、使用和释放。对于多于连接池中连接数的并发请求,应该在请求队列中排队等待。并且应用程序可以根据池中连接的使用率,动态增加或减少池中的连接数。
简单应用

public class ConnectionPool {
  // 存放Connection对象的数组,数组被看成连接池
  ArrayList<Connection> list = new ArrayList<Connection>();
  // 构造方法,创建15个连接对象,放到连接池中
  public ConnectionPool() {
    try {
      Class.forName("com.mysql.jdbc.Driver");
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    }
    for (int i = 0; i < 15; i++) {
      try {
        Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?characterEncoding=utf-8", "root", "root");
        list.add(con);
      } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
  }

  // 从连接池中取出一个连接对象
  public synchronized Connection getOneCon() {
    if (list.size() > 0) {
    // 删除数组的第一个元素,并返回该元素中的连接对象
      return list.remove(0);
    } else {
    // 连接对象被用完
      return null;
    }
  }

  // 把连接对象放回连接池中
  public synchronized void releaseCon(Connection con) {
    list.add(con);
  }
}

使用synchronized修饰方法,防止并发操作带来的错误。

预处理语句访问数据库

如果你想多次执行一个Statement对象,通常使用PreparedStatement对象来代替,可以减少执行时间。 PreparedStatement 对象的主要特点是,与Statement对象不同,当它被创建时,会被赋予一条 SQL 语句。这样做的好处是,在大多数情况下,这个SQL语句会被立即发送到DBMS,在那里进行编译。因此,PreparedStatement 对象包含的不仅仅是一条 SQL 语句,而是一条已经预编译的SQL语句。这意味着,当 PreparedStatement被执行时,DBMS可以直接运行PreparedStatement SQL语句,而不必先编译它。

//预处理
ps = con.prepareStatement("insert into test values(null,?,?)");
//发送添加SQL语句,实现添加的功能
request.setCharacterEncoding("utf-8");
ps.setString(1,"");
ps.setString(2,"");
ps.executeUpdate();
//预处理
ps = con.prepareStatement("select * from goods ");
//发送查询SQL语句,返回结果集
rs = ps.executeQuery();

为预占位符,用来表示可以改变的变量,而后可以通过PrepareStatement对象的setXXX方法赋值。

总结

现如今,java数据库的操作有各种个样的框架,如Hibernate,或者Mybatis,但原理其实都是相通的,所以了解JDBC对以后深入学习数据库框架大有帮助。