JDBC连接MySQL数据库

1.JDBC连接MySQL数据库

  • 注册驱动
  • 获取数据库连接对象Connection
  • 定义sql语句
  • 获取sql执行对象
  • 执行sql
  • 处理结果
  • 释放资源
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
public class jdbcdemo1 {
public static void main(String[] args) {
//定义连接、用户名、密码
String url = "jdbc:mysql://localhost:3306/test?&useSSL=false&serverTimezone=GMT%2B8";
String user = "root";
String password = "123456";
// 先定义为null,这样在finally中才可以关闭
Connection conn = null;
Statement statement = null;
try {
//注册驱动
//北京时间东八区 serverTimezone=GMT%2B8
//全球标准时间:serverTimezone=UTC
Class.forName("com.mysql.cj.jdbc.Driver");
System.out.println("注册驱动成功");
//获取数据库连接对象
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println("数据库连接成功");
//定义sql语句
String sql = "select * from stu";//stu表字段 id(Int) stu_name(String) stu_phone(String)
//获取sql执行对象
Statement statement = conn.createStatement();
//执行sql
ResultSet sql1 = statement.executeQuery(sql);
//处理结果
while (sql1.next()) {
Integer id = sql1.getInt("id");
String stu_name = sql1.getString("stu_name");
String stu_phone = sql1.getString("stu_phone");
System.out.println("id:" + id + " stu_name:" + stu_name + " stu_phone:" + stu_phone);
}
//关闭资源
statement.close();
//关闭数据库连接
conn.close();
} catch (ClassNotFoundException e) {
System.out.println("数据库驱动没有安装");
} catch (SQLException e) {
System.out.println("数据库连接失败");
}finally {
//关闭资源
// 避免空指针,添加判断
if(statement!=null){
try {
statement.close();
System.out.println("sql执行对象已关闭");
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
//关闭数据库连接
if(conn!=null){
try {
conn.close();
System.out.println("数据库连接已关闭");
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
}

2.详解各个对象

2.1 DriverManager

  • 驱动管理对象

    1. 注册驱动

      • DriverManager类中有一个静态成员方法:static void registerDriver(Driver driver):注册给定的驱动程序DriverManager

      • Class.forName(“com.mysql.cj.jdbc.Driver”); 这行代码会将com.mysql.cj.jdbc.Driver在源代码阶段加载进内存,自动执行其中包含的静态代码块,其核心就是执行DriverManager.registerDriver(new Driver());注册驱动。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      // com.mysql.cj.jdbc.Driver
      public class Driver extends NonRegisteringDriver implements java.sql.Driver {
      public Driver() throws SQLException {
      }
      // 静态代码块
      static {
      try {
      DriverManager.registerDriver(new Driver());
      } catch (SQLException var1) {
      throw new RuntimeException("Can't register driver!");
      }
      }
      }
      • 在jdbc驱动包下有一个文件java.sql.Driver,里面写入了com.mysql.cj.jdbc.Driver,程序会自动注册驱动,所以不执行Class.forName(“com.mysql.cj.jdbc.Driver”); 也可以。
    2. DriverManager类中有一个获取数据库连接对象的方法:getConnection,是静态方法,可以通过类名直接调用。

      static Connection getConnection(String url,Sptring user,String password);

      • url:指定连接的路径

        jdbc:mysql://ip地址(域名):端口号/数据库名称?&useSSL=false&serverTimezone=GMT%2B8

2.2 Connection

  • 获取执行sql语句的对象

    • Statement createStatement ()
    • PreparedStatement createStatement (String sql)
  • 管理事务

    开启事务:setAutoCommit(boolean autoCommit),设置参数为false,即为提交事务

    提交事务:rollback

    回滚事务:commit

2.3 statement

  • 执行sql的对象

    • boolean execute(String sql)

    • int executeUpdate(String sql):执行DML(insert、update、delete)、DDL(create、drop、alter),返回值为影响的行数

    • ResultSet executeQuery(String sql):执行DQL(select)语句,返回一个结果集对象

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    public static void main(String[] args) {
    .............
    /*
    * 练习executeUpdate、executeQuery
    * stu表字段 id(Int) stu_name(String) stu_phone(String)
    * 添加一条记录
    * 修改一条记录
    * 删除一条记录
    * 查询表中记录
    * */

    String sql = "insert into stu values(3,'qzy','456')";
    int count = statement.executeUpdate(sql);
    if(count>0){
    System.out.println("添加成功");
    }else{
    System.out.println("添加失败");
    }

    sql = "update stu set stu_phone = '123' where id = 2";
    count = statement.executeUpdate(sql);
    if(count>0){
    System.out.println("修改成功");
    }else{
    System.out.println("修改失败");
    }

    sql = "delete from stu where id = 3";
    count = statement.executeUpdate(sql);
    if(count>0){
    System.out.println("删除成功");
    }else{
    System.out.println("删除失败");
    }
    ..........
    }

2.4 ResultSet

  • 结果集对象,封装查询结果

2.5 PreparedStatement

  • 执行sql的对象
  • execute:能执行CRUD中的任意一种语句。它的返回值是一个boolean类型,表示是否有结果集。有结果集为true,没有结果集为false
  • executeUpdate:只能执行CUD,查询语句无法执行,返回值影响数据库记录的行数
  • executeQuery:只能执行select语句,无法执行增删改,执行结果封装的结果集ResultSet对象