JDBC的使用

1、JDBC常用的接口和类简介

JDBC 提供了独立于数据库统一的API,用来执行SQL命令。JDBC API常常由以下的接口和类组成
DriverManager: 用于管理JDBC的服务类。程序中使用该类的主要功能是获取Connection对象,该类包含如下方法。

  • getConnection 用于获得url对应数据库的连接

Connection: 代表数据库连接对象,每个Collection代表一个物理连接会话。要想访问数据库,不许先获得数据库连接。接口常见的方法如下:

  • Statement createStatement()throws SQLException: 该方法返回一个Statement对象
  • PrepareStatement prepareStatement(String sql)throws SQLException:该方法返回预编译的Statement对象,即将SQL语句提交到数据库进行编译
  • CallableStatement prepareCall(String sql)throws SQLException: 该方法返回CallableStatement对象,用于调用存储过程

Collection还有几个控制事务的方法

  • Savepoint SetSavepoint():创建一个保存点
  • Savepoint SetSavepoint(String name):以指定的名字来创建一个保存点
  • void setTransactionIsolation(int level):设置事务的隔离级别
  • void rollback():回滚事务
  • void rollback(Savepoint Savepoint):将事务回滚到指定的保存点
  • void setAutoCommit(boolean autoCommit):关闭自动提交,打开事务
  • void commit():提交事务

Statement : 用于执行SQL语句的工具接口。当执行SQL查询时,返回查到的结果集。常用的方法如下:

  • ResultSet executeQueue(String sql)throws SQLException:该方法用于执行查询语句,并返回查询结果对应的ResultSet对象。该方法只能用于查询语句。
  • int executeQuery(String sql)throws SQLException:该方法用于执行DML语句,并返回受到影响的行数;该方法也可以用于执行DDL语句。执行DDL语句将返回0.
  • boolean execute(String sql)throws SQLException:该方法可以执行任何SQL语句。如果在执行后第一个结果为ResultSet对象,则返回true;如果执行后第一个结果为受影响的行数或者没有任何的结果,则返回false。

PrepareStatement: 预编译的Statement对象。PrepareStatement是Statement的子接口,它允许数据预编译SQL语句(这些SQL语句通常都是带参数的),以后只改变SQL命令的参数。避免数据库每次都需要编译SQL语句,因此性能更好。相比较于Statement多了如下方法:

  • void setXxx(int parameterIndex,Xxx value):该方法根据传入参数值的类型不同,需要使用不同的方法。传入的值根据索引传给SQL语句中指定的位置参数。

**ResultSet:**结果集对象。该对象包含访问查询结果的方法,ResultSet可以通过列索引或列名获得列数据,他包含了如下常用方法来移动记录指针。

  • void close()throws SQLException:释放ResultSet对象
  • boolean absolute(int row):将结果集的记录指针移动第row行,如row是负数,则移动到倒数第row行。如果移动后的记录指针指向一条有效记录,则该方法返回true。
  • void beforeFirst():将ResultSet的记录指针定位到首行之前,这是ResultSet结果集记录指针的初始状态——记录指针的起始位置位于第一行之前。
  • boolean first():将ResultSet的记录指针定位到首行。如果移动后的记录指针指向一条有效记录,则该方法返回true。
  • boolean previous():将ResultSet的记录的指针定位到上一行。如果移动后的记录指针指向一条有效记录,则该方法返回true
  • boolean next():将ResultSet的记录指针定位到下一行,如果移动后的记录指针指向一条有效记录,则该方法返回true。
  • boolean last():将ResultSet的记录指针定位到最后一行,如果移动后的记录指针指向一条有效记录,则该方法返回true
  • boolean afterLast():将ResultSet的记录指针定位到最后一行之后。
    当指针移动到指定行之后,ResultSet可以通过getXxx(int columnIndex)或者getXxx(String columnLable)方法来获取当前行、指定列的值,前者根据列索引获取值,后者根据列名获取值。

2、JDBC编程步骤
(1)、加载数据库驱动

//加载驱动
Class.forName(driverClass);

上面代码中的driverClass就是数据库驱动类所对应的字符串。例如,加载MySql的驱动采用如下

//加载MySql的驱动
Class.forName("com.mysql.jdbc.Briver");

而加载Oracle的驱动则采用如下代码

//加载Oracle的驱动
Class.forName("oracle.jdbc.driver.OracleDriver");

(2)、通过DriverManager获取数据库连接。DriverManager提供了如下方法:

//获取数据库连接
DriverManager.getConnection(String url,String user,String pass).

当使用DriverManager获取数据库连接时,通常需要传入3个参数:数据库URL、登录数据库的用户名和密码。
例如mysql

jdbc:mysql//hostname:port/databasename

oracle数据库的URL写法如下:

jdbc:oracle:thin:@hostname:port:databasename

(3)、通过Connection对象创建Statement对象。Connection创建Statement的方法有如下三个:

  • createStatement():创建基本的Statement对象
  • prepareStatement(String sql):根据传入的SQL语句创建预编译的Statement对象
  • prepareCall(String sql): 根据传入的SQL语句创建CallableStatement对象

(4)、使用Statement执行语句

  • execute():可以执行任何SQL语句,单数比较麻烦
  • executeUPdate():主要用于执行DML和DDL语句
  • executeQuery():只能执行查询语句,执行后返回代表查询结果的ResultSet对象

(5)、操作结果集。如果执行的SQL语句是查询语句,则执行结果将返回一个ResultSet对象,该对象里面保存了SQL语句的查询结果,程序可以通过操作该ResultSet对象来取出查询结果。
ResultSet对象主要提供了如下两类方法:

  • next()、previous()、first()、last()、beforeFirst()、afterLast()、absolute()等移动记录指针的方法。
  • getXxx()方法获取记录指针指向行、特定列的值。该方法即可使用列索引作为参数,也可以使用列名作为参数。使用列索引作为参数的性能更好,使用列名作为参数的可读性更好。

(6)、回收数据库资源,包括关闭ResultSet、Statement、Connection等资源

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

public class Demo1 {
    public static void main(String[] args) throws Exception {
        //通过反射实现驱动的加载
        Class.forName("com.mysql.cj.jdbc.Driver");
        //通过驱动管理器获得连接对象
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/geekhome", "root", "123456");
        //mysql8.0以上的连接
        //Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java_framework?useSSL=true&serverTimezone=GMT","root","123456");
        System.out.println("数据库连接成功");

        //通过连接对象获得处理器对象
        Statement stmt = connection.createStatement();

        //定义sql语句
        String sql = "update users set age=21 where userid=104";

        //使用处理器执行SOL语句
        int count  = stmt.executeUpdate(sql);
        System.out.println("受影响的行数"+count);

        //关闭对象
        stmt.close();
        connection.close();
    }
}

2、执行SQL语句的方式

2.1使用executeUpdate方法执行DDL和DML语句

Statement提供了3个方法来执行SQL语句,前面已经介绍并使用了executeQuery()来执行查询语句,下面将介绍使用executeUpdate()来执行DDL和DML语句,使用Statement执行DDL和DML语句的步骤与执行普通查询语句的步骤基本相同,区别在于执行DDL语句之后返回值为0,执行DML语句饭返回值为受到影响的记录条数。
示例:使用executeUpdate()方法创建数据表。

2.2 使用execute方法执行SQL语句

Statement的execute()方法几乎可以执行任何SQL语句,但是它执行SQL语句时比较麻烦,通常我们都是使用executeQuery()或者executeUpdate()方法简单。但是如果不清楚SQL语句的类型,则只能使用execute()方法来执行SQL语句。
使用execute()方法执行SQL语句大返回值只是boolean值,它表明执行该SQL语句是否返回了ResultSet对象。Statement提供了如下两个方法来获取执行结果:

  • getResultSet():获取Statement执行查询语句所返回的ResultSet对象
  • getUpdateCount():获取该Statement执行DML语句所影响的记录行数

2.3 使用PreparedStatement执行SQL语句

如果我们经常要反复的执行一条结构相似的SQL语句,

insert into student valuesnull,'张三',1;
insert into student valuesnull,'李四',2;

对于这两条语句,他们的结构基本相似,只需要执行插入时插入的值不同而已。在这种情况下我们就可以使用带占位符(?)参数的SQL语句来代替它:

insert into student values(null,?,?)

但是Statement执行SQL语句是不允许出现占位符,为了满足这个功能,JDBC提供了PreparedStatement接口。它是Statement接口的子接口,他可以预编译SQL语句,预编译后的SQL语句被存储在PreparedStatement对象中,然后可以使用该对象多次高效地执行该语句。
PreparedStatement也提供了execute()、executeUpdate()、executeQuery()三个方法来执行SQL语句,不过这三个方法都不需要参数,因为在PreparedStatement已经存储了预编译的SQL语句。

3、操作练习

3.1 更新数据库

package exercise;

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

public class addData {
    public static void main(String[] args) throws Exception {
        //通过反射实现驱动的加载
        Class.forName("com.mysql.cj.jdbc.Driver");
        //通过驱动管理获得对象
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java_framework?useSSL=true&serverTimezone=GMT","root","123456");
        System.out.println("数据库加载成功");
        //Statement接口需要通过Connection接口进行实例化操作
        Statement stmt = conn.createStatement();
        //执行SQL语句,更新数据库
        stmt.executeUpdate("insert into t_emp(name,email,dept_id) values ('Tom','222@163.com',2)");
        System.out.println("更新成功");
        //关闭数据库
        conn.close();


    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值