数据库操作
2021/5/18 19:28:09
本文主要是介绍数据库操作,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
以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语句。
这篇关于数据库操作的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南