数据库-----数据库操作。

本文介绍了Java使用JDBC进行数据库操作的基本步骤,包括连接数据库、顺序查询、模糊查询、预处理语句以及数据的添加、修改和删除。示例代码展示了如何通过加载驱动、建立连接、执行SQL语句以及处理结果集来实现对数据库的CRUD操作。预处理语句增强了代码的安全性和效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1 . 连接数据库。     

        要对数据表中的数据进行操作,首先应该建立与数据库的连接。通过JDBC API中提供的各种类,可对数据表中的数据进行查找、添加、修改、删除等操作。

import com.mysql.jdbc.Driver;

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

public class Conn {

    /*
    在项目中创建类Conn,并创建getConnection()方法,获取与Mysql数据库的连接,在主方法中调用该方法。
     */

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

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

以下是代码块1:

try{
            Class.forName("com.mysql.jdbc.Driver");
            System.out.println("数据库驱动加载成功。");
        }catch (ClassNotFoundException e){
            e.printStackTrace();
        }

        通过java.lang包静态方法forName()来加载JDBC驱动程序,如果加载失败会抛出ClassNotFoundException异常。应该确定数据库驱动类是否成功加载到程序中。

以下是代码块2:

try{
            System.out.println("开始运作。");
            con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test","root","root");
            System.out.println("数据库连接成功。");
        }catch (SQLException e){
            e.printStackTrace();
        }

        通过java.sql包中DriverManager类的静态方法getConnection(String url,String user,String password)建立数据库连接。该方法的三个参数一次指定预连接数据库的路径、用户名和密码。返回Connection对象,如果连接失败,抛出SQLException异常。

PS:本实例中将连接数据库作为单独的一个方法,并以Connection对象作为返回值。这样写的好处是在遇到对数据库执行操作的程序时可直接调用Conn类的getConnection()方法获取连接,增加了代码的重用性。

2 . 数据库顺序查询。

ResultSet类的next()方法的返回值是boolean类型的数据,当游标移动到最后一行之后会返回false。下面的实例就算将数据表student中的全部信息显示在控制台上。

import java.sql.*;
import java.util.Stack;

public class Gradation {

    /*
    本实例在getConnection()方法中获取与数据库的连接,在主方法中将数据表tb_stu中的数据检索出来,
    保存在遍历查询结果集ResultSet中,并遍历该结果集。
     */

    // 1 . 声明Connection对象。
    static Connection con;
    // 2 . 声明Statement对象。
    static Statement sql;
    // 3 . 声明ResultSet对象。
    static ResultSet res;

    // 4 . 连接数据库方法。
    public Connection getConnection(){
        // 5 . 加载数据库驱动类。
        try{
            Class.forName("com.mysql.cj.jdbc.Driver");
            System.out.println("数据库驱动加载成功。");
        }catch (ClassNotFoundException e){
            e.printStackTrace();
        }
        // 6 . 通过访问数据库的URL,获取数据库连接对象。
        try{
            System.out.println("开始运作。");
            con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/student","root","root");
            System.out.println("数据库连接成功。");
        }catch (SQLException e){
            e.printStackTrace();
        }
        // 7 . 按要求返回一个Connection对象。
        return con;
    }

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

若表单出现不存在等问题,可采纳下方链接的意见。

求解决:java.sql.SQLSyntaxErrorException: Unknown database 'wuzhiqing'-编程语言-优快云问答

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

 用命令符进入mysql,若出现1046(3D000)nodatebase selected错误问题,可采纳下方链接意见。

MySql ERROR 1046(3D000): No Database Selected 怎么解决? - MySQL数据库 - 亿速云

3 . 数据库模糊查询 。

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

select * from student where name like '张%'
import java.sql.*;

public class Train {

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

    // 1 . 声明Connection对象。
    static Connection con;
    // 2 . 声明Statement对象。
    static Statement sql;
    // 3 . 声明ResultSet对象。
    static ResultSet res;
    // 4 . 连接数据库方法。
    public Connection getConnection(){
        // 5 . 加载数据库驱动类。
        try{
            Class.forName("com.mysql.cj.jdbc.Driver");
            System.out.println("数据库驱动加载成功。");
        }catch (ClassNotFoundException e){
            e.printStackTrace();
        }
        // 6 . 通过访问数据库的URL,获取数据库连接对象。
        try{
            System.out.println("开始运作。");
            con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/student","root","root");
            System.out.println("数据库连接成功。");
        }catch (SQLException e){
            e.printStackTrace();
        }
        // 7 . 按要求返回一个Connection对象。
        return con;
    }

    public static void main(String[] args) {
        // 8 . 创建本类对象。
        Train c = new Train();
        // 9 . 获取与数据库的连接。
        con = c.getConnection();
        // 10 . try-catch语句块捕捉异常。
        try{
            // 11 . 实例化Statement对象。
            sql = con.createStatement();
            // 12 . 执行sql语句。
            res = sql.executeQuery("select * from student where name like '张%'");
            // 13 . 如果当前记录不是记过集中的最后一条,则进入循环体。
            while (res.next()){
                // 14 . 获取列名是id的字段值。
                String id = res.getString("id");
                // 15 . 获取列名是name的字段值。
                String name = res.getString("name");
                // 16 . 获取列名是sex的字段值。
                String sex = res.getString("sex");
                // 17 . 获取列名是birthday的字段值。
                String age = res.getString("age");
                // 18 . 将列值输出。
                System.out.print("编号: " + id);
                System.out.print(" 姓名: " + name);
                System.out.print(" 性别: " + sex);
                System.out.println(" 年龄: " + age);
            }
        }catch (Exception e){
            // 19 . 输出异常信息。
            e.printStackTrace();
        }
    }
}

4 . 预处理语句。

        对于JDBC,可以通过Connection对象的preparedStatement(String sql)方法对SQL与教育进行预处理,生成数据库底层的内部命令,并将该命令封装在PreparedStatement对象中。通过调用该对象的相应方法,可执行底层数据库命令。应用程序能针对链接的数据库,将SQL语句解释为数据库底层的内部命令,然后让数据库执行这个命令。这样可以减轻数据库负担,提高访问数据库的速度。

        对SQL进行预处理时可以使用通配符"?"来代替任何字段值,例如:

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

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

sql.setInt(1,2);

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

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

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

PS:通过setXXX()方法为SQL语句中的参数赋值时,建议使用与参数匹配的方法,也可以使用setObject()方法为各种类型的参数赋值,例如:

sql.setObject(2,'李莉');
import java.sql.*;

public class Prep {

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

    // 1 . 声明Connection对象。
    static Connection con;
    // 2 . 声明预处理对象。
    static PreparedStatement sql;
    // 3 . 声明结果集对象。
    static ResultSet res;

    // 4 . 与数据库连接方法。
    public Connection getConnection(){
        // 5 . 加载数据库驱动类。
        try{
            Class.forName("com.mysql.cj.jdbc.Driver");
            System.out.println("数据库驱动加载成功。");
        }catch (ClassNotFoundException e){
            e.printStackTrace();
        }
        // 6 . 通过访问数据库的URL,获取数据库连接对象。
        try{
            System.out.println("开始运作。");
            con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/student","root","root");
            System.out.println("数据库连接成功。");
        }catch (SQLException e){
            e.printStackTrace();
        }
        // 7 . 按要求返回一个Connection对象。
        return con;
    }

    public static void main(String[] args) {
        // 8 . 创建本类对象。
        Prep c = new Prep();
        // 9 . 获取与数据库的连接。
        con = c.getConnection();
        try{
            // 10 . 实例化预处理对象。
            sql = con.prepareStatement("select * from student where id = ?");
            // 11 . 设置参数。
            sql.setInt(1,2019117004);
            // 12 . 执行预处理语句。
            res = sql.executeQuery();
            // 13 . 如果当前记录不是结果集中的最后一行,则进入循环体。
            while (res.next()){
                // 14 . 获取列名是id的字段值。
                String id = res.getString("id");
                // 15 . 获取列名是name的字段值。
                String name = res.getString("name");
                // 16 . 获取列名是sex的字段值。
                String sex = res.getString("sex");
                // 17 . 获取列名是birthday的字段值。
                String age = res.getString("age");
                // 18 . 将列值输出。
                System.out.print("编号: " + id);
                System.out.print(" 姓名: " + name);
                System.out.print(" 性别: " + sex);
                System.out.println(" 年龄: " + age);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

5 . 添加、修改、删除记录。

        通过SQL语句可以对数据执行添加、修改和删除操作。可通过PreparedStatement类的指定参数,动态地对数据表中原有数据进行修改操作,并通过executeUpdate()方法执行更新语句操作。

import java.sql.*;

public class Renewal {

    /*
    本实例通过预处理语句动态地对数据表student中的数据执行添加、修改、删除操作,
    并遍历数据操作之前与数据操作之后student表中的数据。
     */

    // 1 . 声明Connection对象。
    static Connection con;
    // 2 . 声明PreparedStatement对象。
    static PreparedStatement sql;
    // 3 . 声明ResultSte对象。
    static ResultSet res;

    // 4 . 与数据库进行连接。
    public Connection getConnection(){
        // 5 . 加载数据库驱动类。
        try{
            Class.forName("com.mysql.cj.jdbc.Driver");
            System.out.println("数据库驱动加载成功。");
        }catch (ClassNotFoundException e){
            e.printStackTrace();
        }
        // 6 . 通过访问数据库的URL,获取数据库连接对象。
        try{
            System.out.println("开始运作。");
            con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/student","root","root");
            System.out.println("数据库连接成功。");
        }catch (SQLException e){
            e.printStackTrace();
        }
        // 7 . 按要求返回一个Connection对象。
        return con;
    }

    public static void main(String[] args) {
        // 8 . 创建本类对象。
        Renewal c = new Renewal();
        // 9 . 调用连接数据库的方法。
        con = c.getConnection();
        try {
            // 10 . 查询数据库。
            sql = con.prepareStatement("select * from student");
            // 11 . 执行sql语句。
            res = sql.executeQuery();
            System.out.println("增删改查之前的数据信息:");
            while (res.next()) {
                // 12 . 遍历查询结果集。
                String id = res.getString("id");
                // 15 . 获取列名是name的字段值。
                String name = res.getString("name");
                // 16 . 获取列名是sex的字段值。
                String sex = res.getString("sex");
                // 17 . 获取列名是birthday的字段值。
                String age = res.getString("age");
                // 18 . 将列值输出。
                System.out.print("编号: " + id);
                System.out.print(" 姓名: " + name);
                System.out.print(" 性别: " + sex);
                System.out.println(" 年龄: " + age);
            }
            // 19 . 预处理添加数据。
            sql = con.prepareStatement("insert into student" + " values (?,?,?,?)");
            sql.setInt(1, 2019117007);
            sql.setString(2, "文鸯");
            sql.setString(3, "男");
            sql.setInt(4, 21);
            sql.executeUpdate();
            // 20 . 更新数据。
            sql = con.prepareStatement("update student set age " + "= ? WHERE id = (select MIN(id) from (SELECT id FROM student) a)");
            sql.setInt(1, 23);
            sql.executeUpdate();
            /*// 21 . 删除数据。
            System.out.println("开始删除。");
            sql.executeUpdate("delete from student WHERE id = ?" + "(select MIN(id) from student)");
            sql.setInt(1, 1);
            sql.executeUpdate();
            System.out.println("删除结束。");*/
            // 22. 查询修改数据后student表中的数据。
            sql = con.prepareStatement("select * from student");
            // 23 . 执行SQL语句。
            res = sql.executeQuery();
            System.out.println("增删改查之后的数据信息:");
            // 24. 遍历结果集。
            while (res.next()) {
                // 12 . 遍历查询结果集。
                String id = res.getString("id");
                // 15 . 获取列名是name的字段值。
                String name = res.getString("name");
                // 16 . 获取列名是sex的字段值。
                String sex = res.getString("sex");
                // 17 . 获取列名是birthday的字段值。
                String age = res.getString("age");
                // 18 . 将列值输出。
                System.out.print("编号: " + id);
                System.out.print(" 姓名: " + name);
                System.out.print(" 性别: " + sex);
                System.out.println(" 年龄: " + age);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

        目前删除数据出现的报错暂时无法解决,所以暂时先注释掉了,能解决掉的大佬欢迎指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值