Java 数据库编程1---JDBC操作步骤

数据库安装并配置完成后,可按下面的步骤进行数据库的操作:

  1. 加载数据库驱动程序:每个数据库都会提供JDBC的驱动开发包,直接把JDBC操作所需要的开发包(一般为.jar或.zip)配置到classpath路径即可。
  2. 连接数据库:根据各个数据库的不同,连接的地址也不同,这个地址有数据库厂商提供。一般在JDBC连接数据库是都要求用户输入数据库连接的用户名和密码,本专栏中使用的是mysql数据库,设置用户名为root,密码也为root,用户在取得连接之后才对数据库进行查询或跟新的操作。
  3. 使用SQL语句进行数据库操作:数据库操作分为更新和查询两种,处理可以使用标准的SQL语句外,对于各个数据库也可以使用它们自己提供的各个命令
  4. 关闭数据库连接:数据库操作完毕之后需要关闭连接以释放资源。

连接数据库

如果要使用MySQL数据库进行开发,必须让java代码找到mysql驱动程序,
这里有两种方法:
(1)可以把mysql驱动程序包,放到%JAVA_HOME%\jre\lib\ext目录下,然后即可在所有的自己所有的java代码里使用jdbc操作数据库了.
(2)另一种方法就是在eclipse的Build Path中引入jdbc的驱动即可。
实例:测试mysql驱动程序加载

public class ConnectionDemo01
{
    // 定义MySQL的数据库驱动程序
    public static final String DBDRIVER = "com.mysql.jdbc.Driver";

    public static void main(String args[])
    {
        try
        {
            //加载数据库驱动
            Class.forName(DBDRIVER); // 加载驱动程序
            //打印提示
            System.out.println("加载驱动成功");
        } catch (ClassNotFoundException e)
        {
            e.printStackTrace();
        }
    }
}

运行结果:

加载驱动成功

如果mysql驱动程序包没有位置没有配置正确的话上面的代码会抛出异常:

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

连接及关闭数据库

如果数据库驱动可以正常加载,下面就可以使用DriverManager类连接数据库。DriverManager类的常用方法如下表所示。

序号 方法 描述
1 public static Connection getConnection(String url) 通过url链接连接到数据库
2 public static Connection getConnection(String url, String user, String password) 通过url链接连接到数据库,同时指定用户名,和密码

在DriverManager类中,提供的主要操作就是得到一个数据库的连接,getConnection()方法就是取得连接对象,此方法返回的类型是Connection对象,不管使用哪种方式连接,都必须提供一个数据库的链接地址url,Mysql数据库的链接地址形式如下:

jdbc:mysql://IP地址:端口号/数据库名称

现在本机上存在一个usersinfo数据库,则此时的地址为

jdbc:mysql://localhost:3306/usersinfo

数据库连接地址形式

JDBC虽然提供了与平台无关的数据库操作,但是各个数据库的连接地址是有差异的,JDBC的连接地址实际上是由下列3个部分组成。

  1. jdbc协议:JDBC URL中的协议总是jdbc
  2. 子协议:驱动程序名或数据库连接机制的名称(这种机制可以有一个或者多个驱动程序支持),如mysql.
  3. 子名称:一种标识数据库的方法。必须遵循”//主机名:端口/子协议”的标准URL命名规定,如://localhost:3306/usersinfo

    所以完整的URL: jdbc协议:子协议:子名称jdbc:mysql://localhost:3306/usersinfo

下面来看Connection接口,以后的数据库操作都是从Connection接口开始的。Connection接口的常用方法如下表所示:

序号 描述
1 Statement createStatement() throws SQLException 创建一个 Statement 对象来将 SQL 语句发送到数据库。
2 Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException 创建一个 Statement 对象,该对象将生成具有给定类型和并发性的 ResultSet 对象。
3 PreparedStatement prepareStatement(String sql) throws SQLException 创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。
4 PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException 创建一个 PreparedStatement 对象,该对象将生成具有给定类型和并发性的 ResultSet 对象。
5 CallableStatement prepareCall(String sql) 创建一个 CallableStatement 对象,该对象专门用来调用数据库存储过程。
6 CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException 创建一个 CallableStatement 对象,该对象将生成具有给定类型和并发性的 ResultSet 对象。
7 DatabaseMetaData getMetaData() throws SQLException 获取一个 DatabaseMetaData 对象,该对象包含关于此 Connection 对象所连接的数据库的元数据
8 void setAutoCommit(boolean autoCommit) throws SQLException 设置数据库的自动提交,与事务相关
9 boolean getAutoCommit() throws SQLException 判断数据库是否可以自动提交,与事务相关
10 Savepoint setSavepoint() throws SQLException 设置数据的恢复点,与事务相关
11 Savepoint setSavepoint(String name) throws SQLException 为数据库的恢复点设置一个名字,与事务相关。
12 void rollback() throws SQLException 取消在当前事务中进行的所有更改,并释放此 Connection 对象当前持有的所有数据库锁。
13 void rollback(Savepoint savepoint) throws SQLException 数据库操作回滚到指定的保存点,与事物有关
14 void commit() throws SQLException 使所有上一次提交/回滚后进行的更改成为持久更改,并释放此 Connection 对象当前持有的所有数据库锁。
15 boolean isClosed() throws SQLException 查询此 Connection 对象是否已经被关闭(判断连接是否已经关闭)
16 void close() throws SQLException 立即释放此 Connection 对象的数据库和 JDBC 资源,而不是等待它们被自动释放。关闭数据库

上面的方法在JDBC操作中都非常有用,本专栏将部分介绍上述方法的使用。
实例:连接数据库

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

public class ConnectionDemo02
{
    // 定义MySQL的数据库驱动程序
    public static final String driver = "com.mysql.jdbc.Driver";
    // 定义MySQL数据库的连接地址
    public static final String url = "jdbc:mysql://localhost:3306";
    // MySQL数据库的连接用户名
    public static final String user = "root";
    // MySQL数据库的连接密码
    public static final String password = "root";

    public static void main(String args[])
    {
        Connection conn = null; // 数据库连接
        try
        {
            Class.forName(driver); // 加载驱动程序
            System.out.println("驱动加载成功");
        } catch (ClassNotFoundException e)
        {
            e.printStackTrace();
        }
        try
        {
            //连接数据库,url,数据库名,密码
            conn = DriverManager.getConnection(url, user, password);
            System.out.println("数据库连接成功");
        } catch (SQLException e)
        {
            e.printStackTrace();
        }
        System.out.println(conn); // 如果此时可以打印表示连接正常
        try
        {
            conn.close(); // 数据库关闭
        } catch (SQLException e)
        {
            e.printStackTrace();
        }
    }
}

运行结果:

驱动加载成功
数据库连接成功
com.mysql.jdbc.JDBC4Connection@2e0fa5d3

如果出现上述打印,说明此时已经连接上数据库了。

注意:数据库打开之后必须关闭

在程序操作中,数据库的资源是非常有限的,这就要求开发者在操作完数据库之后必须将其关闭,如果不关闭,在程序中就会产生无法连接到数据库的异常。

执行数据库的更新操作

数据库连接后,下面即可进行数据库的具体操作,如果对数据库进行操作,可以使用Statement接口完成,Statement接口可以使用Connection接口中提供的createStatement()方法实例化。Statement接口中定义了下表所示的常用方法。

序号 方法 描述
1 int executeUpdate(String sql) throws SQLException 执行给定的SQL语句,这可能是 INSERT , UPDATE ,或 DELETE语句,或者不返回任何内容,如SQL DDL语句的SQL语句。返回更新的记录数
2 ResultSet executeQuery(String sql) throws SQLException 执行数据库查询操作,该语句返回单个 ResultSet对象(结果集对象)。
3 void addBatch(String sql) throws SQLException 真增加一个待执行的SQL语句
4 int[] executeBatch() 批量执行SQL语句
5 void close() 关闭Statement操作
6 boolean execute(String sql) 执行给定的SQL语句,这可能会返回多个结果。

下面使用Statement接口分别完成数据库的插入,修改,删除等操作。

实例操作1—执行数据库插入操作

下面直接向student表中添加一条新的记录,编写完整一条SQL语句,并通过Statement执行。
实例:向student表中插入数据
student表结构:
student表结构

package my.insert;

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

public class InsertDemo01
{
    // 定义MySQL的数据库驱动程序
    public static final String dirver = "com.mysql.jdbc.Driver";
    // 定义MySQL数据库的连接地址
    public static final String url = "jdbc:mysql://localhost:3306/usersinfo?characterEncoding=gbk";
    // MySQL数据库的连接用户名
    public static final String user = "root";
    // MySQL数据库的连接密码
    public static final String password = "root";

    public static void main(String args[]) throws Exception
    { 
        Connection conn = null; // 数据库连接
        Statement stmt = null; // 数据库操作
        Class.forName(dirver); // 加载驱动程序
        String sql = "insert into student(学号,姓名,性别,专业,年级,出生,课程,成绩)"
                              + " values('H1002','小王','男','软件工程','大三',1996,'高等数学',100);";
        System.out.println("执行SQL语句:"+sql);
        //获取数据库的连接对象
        conn = DriverManager.getConnection(url, user, password);
        // 实例化Statement对象
        stmt = conn.createStatement(); 
        // 执行数据库更新操作
        stmt.executeUpdate(sql);
        stmt.close(); // 关闭操作
        conn.close(); // 数据库关闭
    }
}

运行结果:
1.控制台输出:

执行SQL语句:insert into student(学号,姓名,性别,专业,年级,出生,课程,成绩) values('H1002','小王','男','软件工程','大三',1996,'高等数学',100);

2.student表:
插入成功
如果上面执行的SQL语句是一条标准的SQL语句,肯定是可以正常执行的。但是上的SQL语句是固定的,可以将上面的每个内容换成变量,这样灵活性好点。
也就是换成下吗的形式:

String id="H1003";
String name="小芳";
String sex="男";
String major="嵌入式";
String grade="大二";
String birthYear="1997";
String course="离散数学";
int score=100;
//拼接SQL语句
String sql = "insert into student(学号,姓名,性别,专业,"
                               + "年级,出生,课程,成绩)"
                      + " values('"+id+"','"+name+"','"+sex+"','"+major+
                      "','"+grade+"','"+birthYear+"','"+course+"',"+score+")";

完整实例:拼接SQL方法

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

public class InsertDemo02
{
    // 定义MySQL的数据库驱动程序
    public static final String dirver = "com.mysql.jdbc.Driver";
    // 定义MySQL数据库的连接地址
    public static final String url = "jdbc:mysql://localhost:3306/usersinfo?characterEncoding=gbk";
    // MySQL数据库的连接用户名
    public static final String user = "root";
    // MySQL数据库的连接密码
    public static final String password = "root";

    public static void main(String args[]) throws Exception
    { 
        Connection conn = null; // 数据库连接
        Statement stmt = null; // 数据库操作
        Class.forName(dirver); // 加载驱动程序
        String id="H1003";
        String name="小芳";
        String sex="男";
        String major="嵌入式";
        String grade="大二";
        String birthYear="1997";
        String course="离散数学";
        int score=100;
        //拼接SQL语句
        String sql = "insert into student(学号,姓名,性别,专业,"
                                       + "年级,出生,课程,成绩)"
                              + " values('"+id+"','"+name+"','"+sex+"','"+major+
                              "','"+grade+"','"+birthYear+"','"+course+"',"+score+")";
        System.out.println("执行SQL语句:"+sql);
        //获取数据库的连接对象
        conn = DriverManager.getConnection(url, user, password);
        // 实例化Statement对象
        stmt = conn.createStatement(); 
        // 执行数据库更新操作
        stmt.executeUpdate(sql);
        stmt.close(); // 关闭操作
        conn.close(); // 数据库关闭
    }
}

运行结果:

  • 控制台输出
执行SQL语句:insert into student(学号,姓名,性别,专业,年级,出生,课程,成绩) values('H1003','小芳','男','嵌入式','大二','1997','离散数学',100)
  • student表:
    student表

    上面的代码中为什么要写两个关闭语句?

    以上的代码中分别关闭了Statement和Connection,在开发中只关闭可以吗?

        stmt.close(); // 关闭操作
        conn.close(); // 数据库关闭

答:可只关闭一次
在数据库操作中都存在关闭方法,连接有关闭方法,操作也有关闭方法,一般来说连接只要已关闭,则其他所有的数据库操作都会关闭。但是在开发JDBC代码一般习惯分贝按照顺序关闭,即先打开的后关闭。所以在此处先关闭Statement操作,再关闭Connection操作。

实例2—-执行数据库修改

要想执行数据库修改操作,只需要将SQL语句该成update即可。
实例:数据库修改操作

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

public class UpdataDemo01
{
    // 定义MySQL的数据库驱动程序
    public static final String dirver = "com.mysql.jdbc.Driver";
    // 定义MySQL数据库的连接地址
    public static final String url = "jdbc:mysql://localhost:3306/usersinfo?characterEncoding=gbk";
    // MySQL数据库的连接用户名
    public static final String user = "root";
    // MySQL数据库的连接密码
    public static final String password = "root";

    public static void main(String args[]) throws Exception
    { 
        Connection conn = null; // 数据库连接
        Statement stmt = null; // 数据库操作
        Class.forName(dirver); // 加载驱动程序
        String id="H1003";
        String name="张三";
        String sex="男";
        String major="软件工程";
        String grade="大一";
        String birthYear="1999";
        String course="Java语言程序设计";
        int score=100;
        //拼接SQL语句
//      String sql = "insert into student(学号,姓名,性别,专业,"
//                                     + "年级,出生,课程,成绩)"
//                            + " values('"+id+"','"+name+"','"+sex+"','"+major+
//                            "','"+grade+"','"+birthYear+"','"+course+"',"+score+")";
        String sql="update student set 姓名='"+name+"',性别='"+sex+"',专业='"+major
                +"',年级='"+grade+"',出生='"+birthYear+"',课程='"+course+"',成绩="+score+
                " where 学号='"+id+"'";

        System.out.println("执行SQL语句:"+sql);
        //获取数据库的连接对象
        conn = DriverManager.getConnection(url, user, password);
        // 实例化Statement对象
        stmt = conn.createStatement(); 
        // 执行数据库更新操作
        stmt.executeUpdate(sql);
        stmt.close(); // 关闭操作
        conn.close(); // 数据库关闭
    }
}

运行结果:

  • 控制台输出:
执行SQL语句:update student set 姓名='张三',性别='男',专业='软件工程',年级='大一',出生='1999',课程='Java语言程序设计',成绩=100 where 学号='H1003'
  • 更新前的student表:
    student表
  • 更新后的student表:
    更新后的学生表

    实例3—-执行数据库删除操作

    和之前的更新操作差不多,直接执行delete的SQL语句即可完成记录的删除操作。
    实例:按学号删除一条记录

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

public class DeleteDemo
{
    // 定义MySQL的数据库驱动程序
    public static final String dirver = "com.mysql.jdbc.Driver";
    // 定义MySQL数据库的连接地址
    public static final String url = "jdbc:mysql://localhost:3306/usersinfo?characterEncoding=gbk";
    // MySQL数据库的连接用户名
    public static final String user = "root";
    // MySQL数据库的连接密码
    public static final String password = "root";

    public static void main(String args[]) throws Exception
    { 
        Connection conn = null; // 数据库连接
        Statement stmt = null; // 数据库操作
        Class.forName(dirver); // 加载驱动程序
        String id="H1003";
//      String name="张三";
//      String sex="男";
//      String major="软件工程";
//      String grade="大一";
//      String birthYear="1999";
//      String course="Java语言程序设计";
//      int score=100;
        //拼接SQL语句
//      String sql = "insert into student(学号,姓名,性别,专业,"
//                                     + "年级,出生,课程,成绩)"
//                            + " values('"+id+"','"+name+"','"+sex+"','"+major+
//                            "','"+grade+"','"+birthYear+"','"+course+"',"+score+")";
//      String sql="update student set 姓名='"+name+"',性别='"+sex+"',专业='"+major
//              +"',年级='"+grade+"',出生='"+birthYear+"',课程='"+course+"',成绩="+score+
//              " where 学号='"+id+"'";
        String sql="delete from student where 学号='"+id+"'";
        System.out.println("执行SQL语句:"+sql);
        //获取数据库的连接对象
        conn = DriverManager.getConnection(url, user, password);
        // 实例化Statement对象
        stmt = conn.createStatement(); 
        // 执行数据库更新操作
        stmt.executeUpdate(sql);
        stmt.close(); // 关闭操作
        conn.close(); // 数据库关闭
    }
}

运行结果:

  • 控制台输出:
执行SQL语句:delete from student where 学号='H1003'
  • 删除之前的student表:
    更新后的学生表
  • 删除之后的student表:
    删除后的student表

猜你喜欢

转载自blog.csdn.net/qq_21808961/article/details/80901285