任务描述

本关任务:使用jdbc连接数据库并完成创建数据库和创建表的操作。

相关知识

JDBC API提供以下接口和类:

DriverManager:此类管理数据库驱动程序列表。可在JDBC下识别某个子协议的第一个驱动程序,用于建立数据库连接。

Driver:此接口处理与数据库服务器的通信。我们很少会直接与Driver对象进行交互。在编程中要连接数据库,必须先装载特定厂商的数据库驱动程序。

Connection:此接口具有用于联系数据库的所有方法。 Connection对象表示通信上下文,即与数据库的所有通信仅通过连接对象。

Statement:用于执行静态SQL语句并返回它所生成结果的对象。一些派生接口还可接受参数,如PrepareStatement

ResultSet:提供检索不同类型字段的方法。(操作对象为Statement执行SQL查询后的结果)

SQLException:此类处理数据库应用程序中发生的任何错误。

使用JDBC的步骤如下:

加载数据库驱动 → 建立数据库连接(Connection) → 创建执行SQL语句的Statement对象 → 处理执行结果(ResultSet) → 释放资源

为了完成本关任务,你需要掌握:1.如何加载数据库驱动;2.如何建立数据库连接;3.如何执行编写的SQL语句;4.释放资源。

加载数据库驱动

驱动加载是为了打开与数据库的通信通道。

在注册驱动前我们需要装载特定厂商的数据库驱动程序,导入mysq-connector-javajar包,方法是在项目中建立lib目录,在其下放入jar包。

img

然后右键jarBuild PathAdd to Build Path完成jar包导入。将jar包导入项目之后我们就开始注册驱动:

Java加载数据库驱动通常是使用Class类的静态方法forName(),语法格式如下:

Class.forName(String driverManager)

示例:

try {
    Class.forName("com.mysql.jdbc.Driver" );
} catch (ClassNotFoundException e) {
    e.printStackT\frace();
}

如果加载成功,会将加载的驱动类注册给DriverManager;加载失败,会抛出ClassNotFoundException异常。

建立连接

成功加载完数据库驱动后,就可以建立数据库的连接了,使用DriverManager的静态方法getConnection()来实现。如下:

Connection conn = DriverManager.getConnection(url, user, password);

URL用于标识数据库的位置,通过URL地址告诉JDBC程序连接信息。

若不存在数据库,只建立连接,URL的写法为:

img

若存在数据库testURL的写法为:

img

其中localhost可以换成IP地址127.0.0.1,3306MySQL数据库的默认端口号,userpassword对应数据库的用户名和密码。

执行编写的SQL语句

连接建立完毕后,就可以使用Connection接口的createStatement()方法来获取Statement对象;并通过executeUpdate()方法来执行SQL语句。

  • 创建statement对象

    try {
    Statement statement = conn.createStatement();
    } catch (SQLException e) {
    e.printStackT\frace();
    }
  • 创建数据库

    try {
    String sql1="drop database if exists test";
    String sql2="create database test";
    statement.executeUpdate(sql1);//执行sql语句
    statement.executeUpdate(sql2);
    } catch (SQLException e) {
    e.printStackT\frace();
    }
  • 创建表

    try {
    statement.executeUpdate("use test");//选择在哪个数据库中操作
    String sql = "create table table1(" +
                    "column1 int not null, " +
                    "column2 varchar(255)" +
                    ")";
    statement.executeUpdate(sql);
    } catch (SQLException e) {
    e.printStackT\frace();
    }

释放资源

Jdbc程序运行完后,切记要释放程序在运行过程中创建的那些与数据库进行交互的对象,这些对象通常是ResultSet, StatementConnection对象。

特别是Connection对象,它是非常稀有的资源,用完后必须马上释放,如果Connection不能及时、正确的关闭,极易导致系统宕机。

Connection的使用原则是尽量晚创建,尽量早的释放。

为确保资源释放代码能运行,资源释放代码一定要放在finally语句中。

finally {
    try {
        if(statement!=null)
            statement.close();
        if(conn!=null)
            conn.close();
    } catch (SQLException e) {
        e.printStackT\frace();
    }
}

编程要求

在右侧编辑器补充代码,完成下列相应任务:

  1. 加载数据库驱动;【平台数据库连接的用户(user)为root,密码(password)为123123
  2. 创建数据库mysql_db
  3. 创建表student

student表结构为:

字段名 类型 备注 约束
id int 学生id 非空
name varchar(20) 学生姓名
sex varchar(4) 学生性别
age int 学生年龄

测试说明

平台会对你编写的代码进行测试:

测试输入:无

预期输出:

id INT(11)

name VARCHAR(20)

sex VARCHAR(4)

age INT(11)


开始你的任务吧,祝你成功!

实现代码

package jdbc;

import java.sql.*;

public class jdbcConn {
    public static void getConn() {
        try {
            // 1.注册驱动
            Class.forName("com.mysql.jdbc.Driver");

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        /********** End **********/

        /********** Begin **********/
        Connection conn = null;
        Statement statement = null;
        try {
            // 2.建立连接并创建数据库和表

            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/", "root", "123123");

            String sql1 = "drop database if exists mysql_db;";
            String sql2 = "create database mysql_db;";
            statement = conn.createStatement();
            statement.execute(sql1);
            statement.execute(sql2);

            statement.execute("use mysql_db");

            String sql3 = "create table student(id int not null,name varchar(20),sex varchar(4),age int)";

            statement.execute(sql3);
        } catch (Exception e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        } finally {
            try {
                if (statement != null)
                    statement.close();
                if (conn != null)
                    conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }
}