JDBC

JDBC

Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标[1]。JDBC是面向关系型数据库的。(来自维基百科--Java数据库连接

JDBC的本质:Java官方SUN公司定义的一套操作所有关系型数据库的规则,也就是接口。每个数据库厂商(MySQL、Oracle、DB2等)要去实现这套接口,提供数据库驱动的jar包,使得Java程序员可以使用这套JDBC接口编程。真正执行的是代码是驱动jar包的实现类。

使用过程:

  1. 导入驱动jar包:
    • 在项目下建立一个libs目录用来管理jar包,将mysql-connector-java-8.0.15.jar复制到该目录下
    • 右击libs目录-->add as library,导入jar包
  2. 注册驱动
  3. 获取数据库连接对象Connection
  4. 定义SQL
  5. 获取执行SQL语句的Statement对象
  6. 执行SQL,接收执行返回结果
  7. 处理结果
  8. 释放资源

JDBC小Demo:

package cn.zhuobo.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class JDBCDemo01 {
    public static void main(String[] args) throws Exception {
        // 注册驱动,把Drive类的字节码文件加载进内存
        Class.forName("com.mysql.cj.jdbc.Driver");
        // 获取数据库连接对象
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1", "root", "    ");
        // 定义是去了语句
        String sql = "UPDATE emp SET salary = 2 WHERE id = 1";
        // 获取执行SQL的对象
        Statement statement = connection.createStatement();
        // Statement对象执行SQL
        int count = statement.executeUpdate(sql);

        System.out.println(count);

        connection.close();
        statement.close();
    }
}


用到的各个对象解释:

  1. DriverManager:驱动管理对象,这是一个类。

    作用:告知程序使其知道使用的是哪一个数据库的驱动jar包

    • 注册驱动,使用DriverManager类的一个静态方法:

      static void registerDriver(Driver driver)// 注册给定的驱动程序
      
    • 但是我们写代码的时候是使用Class.forName("com.mysql.cj.jdbc.Driver");注册驱动,没有显式地调用registerDrive()方法,这是因为在加载Driver类进内存的时候,就执行了该类里的静态代码块(静态代码快可以自动执行):

      static {
              try {
                  DriverManager.registerDriver(new Driver());
              } catch (SQLException var1) {
                  throw new RuntimeException("Can't register driver!");
              }
          }
      

      在Driver类中存在着静态代码块,也就是在加载该类进内存的时候就自动执行静态代码块了,静态代码块里DriverManager类调用了静态方法registerDriver(new Driver())。也就是归根结底还是DriverManager类在注册驱动。

      注意:mysql5以后的jar包可以省略注册驱动的步骤,也就是可以不用写Class.forName("com.mysql.cj.jdbc.Driver");,但是还是建议写上。

  2. Connection:数据库连接对象

    • 获取,DriverManager类的静态方法 static Connection getConnection(String url, String user, String password);

    • 参数:

      • url:jdbc:mysql://IP地址:端口号/数据库名
      • user:用户名
      • password:密码
    • Connection对象的方法

      方法 描述
      Statement createStatement() 获取执行SQL的Statement对象
      PreparedStatement prepareStatement(String sql)
      setAutoCommit(boolean autoCommit) 调用该方法,参数为false则开启事务
      commit() 提交事务
      rollbock() 回滚事务
  3. Statement:执行SQL的对象

    • 获取:Connection对象调用createStatement()方法,获取Statement对象

    • Statement对象的方法

      方法 描述
      boolean execute(String sql) 可以执行任意的是sql语句
      int executeUpdate(String sql) 执行DML(insert、update、delete)语句,或者DDL(create、alter、drop),int的返回值是返回影响的行数,<0则失败
      ResultSet executeQuery(String sql) :执行DQL(select)语句
  4. ResultSet:结果集对象

  5. PreparedStatement:执行SQL的对象


JDBC练习:

package cn.zhuobo.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCDemo02 {
    public static void main(String[] args) {
        Statement statement = null;
        Connection connection = null;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            String sql = "delete from emp where id = 1"; // 删除一条记录一条记录
            // String sql = "update emp set salary = 200 where id = 6";
            // String sql = "inert into emp values(NULL, '齐天大圣', '男', 1000, '2017-09-09', 2)";
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1", "root", "    ");
            statement = connection.createStatement();
            int count = statement.executeUpdate(sql);
            if(count > 0) {
                System.out.println("添加成功,影响" + count + "行");
            }
            else {
                System.out.println("添加失败");
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            if (statement != null) {
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
原文地址:https://www.cnblogs.com/zhuobo/p/10700195.html