出自 https://juejin.cn/post/6910491515555217416

入门案例

  1. public class JdbcDemo {
  2. public static final String URL = "jdbc:mysql://localhost:3306/mblog";
  3. public static final String USER = "root";
  4. public static final String PASSWORD = "123456";
  5. public static void main(String[] args) throws Exception {
  6. Class.forName("com.mysql.jdbc.Driver");
  7. Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
  8. Statement stmt = conn.createStatement();
  9. ResultSet rs = stmt.executeQuery("SELECT id, name, age FROM m_user where id =1");
  10. while(rs.next()){
  11. System.out.println("name: "+rs.getString("name")+" 年龄:"+rs.getInt("age"));
  12. }
  13. }
  14. }

JDBC步骤

数据库驱动

Class.forName("com.mysql.jdbc.Driver");

我们安装好数据库之后,我们的应用程序也是不能直接使用数据库的,必须要通过相应的数据库驱动程序,通过驱动程序去和数据库打交道。其实也就是数据库厂商的JDBC接口实现,即对Connection等接口的实现类的jar文件。
image.png
java.sql.Driver此接口是提供给数据库厂商实现的。比如说MySQL的,需要依赖对应的jar包。

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.16</version>
</dependency>

MySQL数据库对应的实现驱动实现类:

package com.mysql.cj.jdbc;
import java.sql.SQLException; 
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    static {
        try {
            //注册驱动
            java.sql.DriverManager.registerDriver(new Driver());
        } catch (SQLException E) {
            throw new RuntimeException("Can't register driver!");
        }
    } 
    public Driver() throws SQLException { 
    }
}

DriverManager是rt.jar包下的类,(rt=runtime),把我们需要驱动类注册进去。

//DriverManager类中的方法
public static synchronized void registerDriver(java.sql.Driver driver, DriverAction da)
    throws SQLException {
     /* Register the driver if it has not already been added to our list */
     if(driver != null) {
          registeredDrivers.addIfAbsent(new DriverInfo(driver, da));
      } else {
          // This is for compatibility with the original DriverManager
          throw new NullPointerException();
      }
      println("registerDriver: " + driver);
}

相应装载Oracle驱动:

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

Sql Server驱动:

Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");

获取连接

Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);

创建Statement对象

Statement stmt = conn.createStatement();

获取Statement
三种类型
要执行SQL语句,必须获得java.sql.Statement实例,Statement实例分为以下3 种类型(都是接口,实现类名是后面加上Impl,如下面的结果图所示):

  • 执行静态SQL语句。通常通过Statement实例实现。
  • 执行动态SQL语句。通常通过PreparedStatement实例实现。
  • 执行数据库存储过程。通常通过CallableStatement实例实现。
Statement stmt = con.createStatement() ;   
PreparedStatement pstmt = con.prepareStatement(sql) ;   
CallableStatement cstmt =  con.prepareCall("{CALL demoSp(? , ?)}") ;

常用方法Statement和PreparedStatement的异同及优缺点
同:两者都是用来执SQL语句的
异:PreparedStatement需要根据SQL语句来创建,它能够通过设置参数,指定相应的值,不是像Statement那样使用字符串拼接的方式。
PreparedStatement的优点:
1、其使用参数设置,可读性好,不易记错。在statement中使用字符串拼接,可读性和维护性比较差。
2、其具有预编译机制,性能比statement更快。
3、其能够有效防止SQL注入攻击。
execute和executeUpdate的区别
相同点:二者都能够执行增加、删除、修改等操作。
不同点:
1、execute可以执行查询语句,然后通过getResult把结果取出来。executeUpdate不能执行查询语句。
2、execute返回Boolean类型,true表示执行的是查询语句,false表示执行的insert、delete、update等。executeUpdate的返回值是int,表示有多少条数据受到了影响。

执行sql数据库查询

ResultSet rs = stmt.executeQuery("SELECT id, name, age FROM m_user where id =1");

ResultSet结果集处理

前面的入门案例中这里返回的结果集是ResultSetImpl
image.png

解析结果集

System.out.println("name: "+rs.getString("name")+" 年龄:"+rs.getInt("age"));

关闭资源

资源关闭不在业务代码这一块,主要是针对一些资源进行关闭,免得一直持有资源。另外我们处理的资源关闭一般都是在finally中处理。