数据库操作

以MySQL数据库为例。

一、连接数据库

要访问数据库,首先要加载数据库的驱动程序(只需要在第一次访问数据库时加载一次),然后每次访问数据时创建一个Connection对象,接着执行操作数据库的SQL语句,最后在完成数据库操作后销毁前面创建的Connection对象,释放与数据库的连接。
在项目中创建类Conn,并创建getConnection()方法,获取与MySQL数据库的连接,在主方法中调用该方法。

import java.sql.*; //导入java.sql包

public class Conn { // 创建类Conn
	Connection con; // 声明Connection对象

	public Connection getConnection() { // 建立返回值为Connection的方法
		try { // 加载数据库驱动类
			Class.forName("com.mysql.jdbc.Driver");
			System.out.println("数据库驱动加载成功");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		try { // 通过访问数据库的URL获取数据库连接对象
			con = DriverManager.getConnection("jdbc:mysql:"
					+ "//127.0.0.1:3306/test", "root", "123456");
			System.out.println("数据库连接成功");
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return con; // 按方法要求返回一个Connection对象
	}

	public static void main(String[] args) { // 主方法
		Conn c = new Conn(); // 创建本类对象
		c.getConnection(); // 调用连接数据库的方法
	}
}

代码块1:通过java.lang包的静态方法forName()来加载JDBC驱动程序,如果加载失败会抛出ClassNotFoundException异常。应该确定数据库驱动类是否成功加载到程序中。
代码块2:通过java.sql包中类DriverManager的静态方法getConnection(String url,String user,String password)建立数据库连接。该方法的3个参数依次指定预连接数据库的路径、用户名和密码。返回Connection对象。如果连接失败,则抛出SQLException异常。
注意:本示例中将连接数据库作为单独的一个方法,并以Connection对象作为返回值。这样写的好处是在遇到对数据库执行操作的程序时可直接调用Conn类的getConnection()方法获取连接,增加了代码的重用性。

二、向数据库发送SQL语句

getConnection()方法只是获取与数据库的连接,要执行SQL语句首先获得Statement类对象。通过上面的例子创建的连接数据库对象con的createStatement()方法可获得Statement对象。
创建Statement类对象sql。代码如下:

try{
   Statement sql = con.createStatement();
}catch(SQLException e){
   e.printStackTrace();
}

三、处理查询结果集

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

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

运行结果为返回一个ResultSet对象,ResultSet对象一次只可以看到结果集中的一行数据,使用该类的next()方法可将光标从当前位置移向下一行。

四、顺序查询

ResultSet类的next()方法的返回值是boolean类型的数据,当游标移动到最后一行之后会返回false。下面的实例就是将数据表tb_emp中的全部信息显示在控制台上。
本实例在getConnection()方法中获取与数据库的连接,在主方法中将数据表tb_stu中的数据检索出来,保存在遍历查询结果集ResultSet中,并遍历该结果集。

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();
		}
	}
}

可以通过列的序号来获取结果集中指定的列值。例如,获取结果集中id列的列值,可以写成getString(“id”)。由于id列是数据表中的第一列,所以也可以写成getString(1)来获取。

五、模糊查询

SQL语句中提供了LIKE操作符用于迷糊查询,可使用“%”来代替0个或多个字符,使用下划线“_”来代替一个字符。例如,在查询姓张的同学的信息,可使用以下SQL语句:

select * from tb_stu where name like '张%'

本实例getConnection()方法中获取与数据库的连接,在主方法中将数据表tb_stu中姓张的同学的信息检索出来,保存在ResultSet结果集中,并遍历该集合。

import java.sql.*;

public class Train { // 创建类Train
	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) { // 主方法
		Train c = new Train(); // 创建本类对象
		con = c.getConnection(); // 获取与数据库的连接
		try { // try语句捕捉异常
			sql = con.createStatement(); // 实例化Statement对象
			res = sql
					.executeQuery("select * from tb_stu where name like '张%'");// 执行SQL语句
			while (res.next()) { // 如果当前记录不是结果集中的最后一条,进入循环体
				String id = res.getString(1); // 获取id字段值
				String name = res.getString("name"); // 获取name字段值
				String sex = res.getString("sex"); // 获取sex字段值
				String birthday = res.getString("birthday"); // 获取birthday字段值
				System.out.print("编号:" + id); // 输出信息
				System.out.print(" 姓名:" + name);
				System.out.print(" 性别:" + sex);
				System.out.println(" 生日:" + birthday);
			}
		} catch (Exception e) { // 处理异常
			e.printStackTrace(); // 输出异常信息
		}
	}
}

六、预处理语句

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

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

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

sql.setInt(1,2);

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

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

使用预处理语句可使应用程序更容易动态地改变SQL语句中关于字段值条件的设定。
注意:通过setXXX()方法为SQL语句中的参数赋值时,建议利用与参数匹配的方法,也可以利用setObject()方法为各种类型的参数赋值。例如:

sql.setObject(2,'李丽');

在本实例中预处理语句动态地获取指定编号的同学的信息,在此以查询编号为19的同学的信息为例介绍预处理语句的用法。

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();
		}
	}
}

七、添加、修改、删除记录

通过SQL语句可以对数据执行添加、修改、删除操作。可通过PreparedStatement类的指定参数动态地对数据表中原有数据进行修改操作,并通过executeUpdate()方法执行更新语句操作。
本实例中通过预处理语句动态地对数据表tb_stu中的数据执行添加、修改、删除操作,并遍历对数据进行操作之前与对数据进行操作之后的tb_stu表中的数据。

import java.sql.*;

public class Renewal { // 创建类
	static Connection con; // 声明Connection对象
	static PreparedStatement sql; // 声明PreparedStatement对象
	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;
	}

	public static void main(String[] args) {
		Renewal c = new Renewal(); // 创建本类对象
		con = c.getConnection(); // 调用连接数据库方法
		try {
			sql = con.prepareStatement("select * from tb_stu"); // 查询数据库
			res = sql.executeQuery(); // 执行SQL语句
			System.out.println("执行增加、修改、删除前数据:");
			while (res.next()) {
				String id = res.getString(1);
				String name = res.getString("name");
				String sex = res.getString("sex");
				String birthday = res.getString("birthday"); // 遍历查询结果集
				System.out.print("编号:" + id);
				System.out.print(" 姓名:" + name);
				System.out.print(" 性别:" + sex);
				System.out.println(" 生日:" + birthday);
			}
			sql = con.prepareStatement("insert into tb_stu(name,sex,birthday) values(?,?,?)");
			sql.setString(1, "张一"); // 预处理添加数据
			sql.setString(2, "女");
			sql.setString(3, "2012-12-1");
			sql.executeUpdate();
			sql = con.prepareStatement("update tb_stu set birthday "
					+ "= ? where id = ? ");
			sql.setString(1, "2012-12-02"); // 更新数据
			sql.setInt(2, 1); // 更新数据
			sql.executeUpdate();
			Statement stmt = con.createStatement();
			stmt.executeUpdate("delete from tb_stu where id = 1");
			// 查询修改数据后的tb_stu表中数据
			sql = con.prepareStatement("select * from tb_stu");
			res = sql.executeQuery(); // 执行SQL语句
			System.out.println("执行增加、修改、删除后的数据:");
			while (res.next()) {
				String id = res.getString(1);
				String name = res.getString("name");
				String sex = res.getString("sex");
				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();
		}
	}
}

注意:executeUpdate()方法是在PreparedStatement对象中执行SQL查询,并返回该查询生成的ResultSet对象,而executeUpdate()是在PreparedStatement对象中执行SQL语句,该语句必须是一个SQL数据操作语言(DML)语句,如INSERT、UPDATE、DELETE语句,或者是无返回内容的SQL语句,如DDL语句。

上一篇:探秘Java中String、StringBuilder以及StringBuffer


下一篇:php简简单单搞定中英文混排字符串截取,只需2行代码!