JDBC连接Mysql数据库学习复习总结(二)-2021.05.011

JDBC 常用接口与类知识点

创建Statement并发送命令

  1. Statement对象用于将SQL语句发送到数据库中,或者理解为执行SQL语句
  2. 有三种Statement对象:
    Statement:用于执行不带参数的简单SQL语句;
    PreparedStatement(从Statement继承):用于执行带或不带参数的预编译SQL语句;
    CallableStatement(从PreparedStatement继承):用于执行数据库存储过程的调用。

处理查询结果集

有了Statement对象之后,可以调用相应的方法实现对数据库的查询、修改,并将查询的结果集存放在ResultSet类的对象之中
获取查询结果集,代码如下

ResultSet res = sql.executeQuery("select * from tb_emp");

运行结果为返回一个ResultSet对象,ResultSet对象一次只可以看到结果集中的一行数据,使用该类的next()方法可将光标从当前位置移向下一行。
ResultSet类的next()方法的返回值是boolean类型的数据,当游标移动到最后一行之后会返回false
初始状态下记录指针指向第一条记录的前面。

预处理语句

向数据库发送一个SQL语句,数据库中的SQL解释器负责把SQL语句生成底层的内部命令,然后执行该命令,完成相关的数据操作。如果不断地向数据库提交SQL语句,肯定会增加数据库中SQL解释器的负担,影响执行的速度。
对于JDBC,可以通过Connection对象的preparedStatement(String sql)方法对SQL语句进行预处理,生成数据库底层的内部命令,并将该命令封装在PreparedStatement对象中。通过调用该对象的相应方法,可执行底层数据库命令。也就是说,应用程序能针对连接的数据库,将SQL语句解释为数据库底层的内部命令,然后让数据库执行这个命令。这样可以减轻据库的负担,提高访问数据库的速度。
对SQL进行预处理时可以使用**通配符“?”**来代替任何的字段值。例如:

sql = con.prepareStatement("select * from tb_stu where id = ?");

在执行预处理语句前,必须用相应方法来设置通配符所表示的值。例如:

sql.setlnt(1,2);

上述语句中的1表示从左向右的第1个通配符,2表示设置的通配符的值。将通配符的值设置为2后,功能等同于:

sql = con.prepareStatement("select * from tb_stu where id = 2");

书写两条语句看似麻烦了一些,但使用预处理语句可使应用程序动态地改变SQL语句中关于字段值条件的设定。

Statement使用方法,如下代码:

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

/**
 * 测试Statement的基本用法
 */
public class jdbc01 {
    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        try {
            //加载驱动类
            Class.forName("com.mysql.jdbc.Driver");

            //建立连接(建立连接对象内部其实 包含了 Socket对象,是一个远程的连接,比较耗时!这是Connection对象管理的一个要点)
            //真正开发中,为了提高效率,都会使用连接池来管理连接对象
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","123456");

            stmt = conn.createStatement();//The object used for executing a static SQL statement and returning the results it produces.
            String sql = "CREATE TABLE `t_user2` (\n" +
                    "  `id` int(10) NOT NULL AUTO_INCREMENT,\n" +
                    "  `username` varchar(30) DEFAULT NULL,\n" +
                    "  `pwd` varchar(30) DEFAULT NULL,\n" +
                    "  `regTime` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,\n" +
                    "  PRIMARY KEY (`id`)\n" +
                    ") ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;\n";
            stmt.execute(sql);
            System.out.println(conn);
            
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

PreparedStatement使用方法,如下代码:

package com.bjsxt.jdbc;
import java.sql.*;

/**
 * 测试 PreparedStatement 基本用法
 */
public class jdbc02 {
    public static void main(String[] args) {
        try {
            //加载驱动类
            Class.forName("com.mysql.jdbc.Driver");
            //建立连接
            Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","123456");

            String sql = "insert into t_user1 (username,pwd,regTime) values (?,?,?)";
            //参数索引是从1开始而不是0;
            //?表示占位符

            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setString(1,"李剑1");
            ps.setString(2,"123456t");
            ps.setDate(3,new java.sql.Date(System.currentTimeMillis()));
            //也可以不考虑数据的类型而使用ps.setObject()方法来直接赋值;
            
            System.out.println("插入一条记录");
            ps.execute();//执行语句
            
            System.out.println(conn);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
    }
    }
}


再看下面的代码:

import java.sql.*;
public class Prep { // 创建类Perp
	static Connection con; // 声明Connection对象
	static PreparedStatement sql; // 声明预处理对象
	static ResultSet res; // 声明结果集对象
	public Connection getConnection() { // 与数据库连接方法
		try {
			Class.forName("com.mysql.jdbc.Driver");
			con = DriverManager.getConnection("jdbc:mysql:"
					+ "//127.0.0.1:3306/test", "root", "123456");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return con; // 返回Connection对象
	}
	
	public static void main(String[] args) { // 主方法
		Prep c = new Prep(); // 创建本类对象
		con = c.getConnection(); // 获取与数据库的连接
		try {
			// 实例化预处理对象
			sql = con.prepareStatement("select * from tb_stu"
					+ " where id = ?");
			sql.setInt(1, 4); // 设置参数
			res = sql.executeQuery(); // 执行预处理语句
			// 如果当前记录不是结果集中最后一行,则进入循环体
			while (res.next()) {
				String id = res.getString(1); // 获取结果集中第一列的值
				String name = res.getString("name"); // 获取name列的列值
				String sex = res.getString("sex"); // 获取sex列的列值
				// 获取birthday列的列值
				String birthday = res.getString("birthday");
				System.out.print("编号:" + id); // 输出信息
				System.out.print(" 姓名:" + name);
				System.out.print(" 性别:" + sex);
				System.out.println(" 生日:" + birthday);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

ResultSet的基本用法

处理ResultSet结果
ResultSet对象是executeQuery()方法的返回值,它被称为结果集,它代表符合SQL语句条件的所有行,并且它通过一套getxxx方法(这些get方法可以访问当前行中的不同列)提供了对这些行中数据的访问。

Resultset里的数据一行一行排列,每行有多个字段,且有一个记录指针,指针所指的数据行叫做当前数据行,我们只能来操作当前的数据行。我们如果想要取得某一条记录,就要使用Resultset的next()方法,如果我们想要得到Resultset里的所有记录,就应该使用while循环。

Resultset对象自动维护指向当前数据行的游标。每调用一次next()方法,游标向下移动一行。
初始状态下记录指针指向第一条记录的前面,通过next()方法指向第一条记录。循环完毕后指向最后一条记录的后面。
查看下面代码:

import java.sql.*;
public class Gradation { // 创建类
	static Connection con; // 声明Connection对象
	static Statement sql; // 声明Statement对象
	static ResultSet res; // 声明ResultSet对象

	public Connection getConnection() { // 连接数据库方法

		try {
			Class.forName("com.mysql.jdbc.Driver");
			con = DriverManager.getConnection("jdbc:mysql:"
					+ "//127.0.0.1:3306/test", "root", "123456");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return con; // 返回Connection对象
	}

	public static void main(String[] args) { // 主方法
		Gradation c = new Gradation(); // 创建本类对象
		con = c.getConnection(); // 与数据库建立连接
		try {
			sql = con.createStatement(); // 实例化Statement对象
			// 执行SQL语句,返回结果集
			res = sql.executeQuery("select * from tb_stu");
			while (res.next()) { // 如果当前语句不是最后一条则进入循环
				String id = res.getString("id"); // 获取列名是"id"的字段值
				// 获取列名是"name"的字段值
				String name = res.getString("name");
				// 获取列名是"sex"的字段值
				String sex = res.getString("sex");
				// 获取列名是"birthday"的字段值
				String birthday = res.getString("birthday");
				System.out.print("编号:" + id); // 将列值输出
				System.out.print(" 姓名:" + name);
				System.out.print(" 性别:" + sex);
				System.out.println(" 生日:" + birthday);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

关闭数据库资源

作为一种好的编程风格,应在不需要Statement对象和Connection对象时显式地关闭它们。关闭Statement对象和Connection对象的语法形式为:
public void close() throws SQLException

用户不必关闭Resultset。当它的Statement关闭、重新执行或用于从多结果序列中获取下一个结果时,该Resultset将被自动关闭。

注意:要按先ResultSet结果集,后Statement,最后Connection的顺序关闭资源,因为Statement和Resultset是需要连接是才可以使用的,所以在使用结束之后有可能其他的Statement还需要连接,所以不能先关闭Connection。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C_Vampirer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值