Logo

郎哥编程

数据库增删改查操作

2021-07-24 216

学习目标:插入记录到数据库表,修改数据库表指定记录,删除数据库表记录,查询数据库记录。

 插入记录到数据库表

数据库记录的插入操作是指在数据库表中插入新的记录,插入操作是通过SQL的INSERT语句完成的,Statement 接口的executeUpdate()方法执行SQL更新语句,该方法返回更新的记录数,返回0表示没有更新任何记录。

案例4:编写SQL语句向shoper表中增加一条新的记录,并通过Statement 接口的executeUpdate()方法执行该SQL语句。

在demo包下新建SqlDemoTest3类。代码如下:

package demo;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
 
public class SqlDemoTest3 {
    // 定义JDBC加载路径
    static String jdbc = "com.mysql.cj.jdbc.Driver";
    // 定义MySQL数据库的连接地址
    static String mysqlurl = "jdbc:mysql://localhost:3306/shop?serverTimezone=GMT%2B8";
    // 定义MySQL数据库的用户名
    static String username = "root";
    // 定义MySQL数据库的用户名登录密码
    static String password = "~123456q";
    public static void main(String[] args) {
        Connection conn = null;
        Statement statement = null;
        try {
            // 加载JDBC驱动
            Class.forName(jdbc);
            // 连接数据库
            conn = DriverManager.getConnection(mysqlurl, username, password);
            if (null != conn) {
                System.out.println(conn);
                String name = "打印机专卖店";
                String brief = "打印机专业销售";
                // 向shoper表中插入一条记录
                String sql = "insert into shoper(id,userId,name,brief,log,shopMoney,status,createDate)"
                        + "values('0001','00a','" + name + "','" + brief + "','',0.0,0,'2020-01-09')";
                // 实例化Statement对象
                statement = conn.createStatement();
                // 执行SQL INSERT语句
                int row  = statement.executeUpdate(sql);
                if( row == 1 )
                {
                    System.out.println("shoper表添加记录成功");
                }
                else
                {
                    System.out.println("shoper表添加记录失败");
                }
                statement.close();
                conn.close();
            } else {
                System.out.println("数据库连接失败");
            }
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
 
    }
}

程序使用SQL的INSERT语句在shoper表中插入一条记录,Statement接口的executeUpdate()方法执行SQL的插入语句,如果记录插入成功,会返回插入的记录数,返回0表示没有记录被插入

更新数据库表记录

数据库记录的更新操作是指在数据库表中更新原有记录,更新操作是通过SQL的UPDATE语句完成的,Statement 接口的executeUpdate()方法执行SQL更新语句,该方法返回更新的记录数,返回0表示没有更新任何记录。

案例5:编写SQL语句更新shoper表中的一条记录,并通过Statement 接口的executeUpdate()方法执行该SQL更新语句。

在demo包下新建SqlDemoTest4类。代码如下:

package demo;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
 
public class SqlDemoTest4 {
    // 定义JDBC加载路径
    static String jdbc = "com.mysql.cj.jdbc.Driver";
    // 定义MySQL数据库的连接地址
    static String mysqlurl = "jdbc:mysql://localhost:3306/shop?serverTimezone=GMT%2B8";
    // 定义MySQL数据库的用户名
    static String username = "root";
    // 定义MySQL数据库的用户名登录密码
    static String password = "~123456q";
 
    public static void main(String[] args) {
        Connection conn = null;
        Statement statement = null;
        try {
            // 加载JDBC驱动
            Class.forName(jdbc);
            // 连接数据库
            conn = DriverManager.getConnection(mysqlurl, username, password);
            if (null != conn) {
                System.out.println(conn);
                String name = "联盟打印机";
                // 修改shoper表中的一条记录
                String sql = "update shoper set name='" + name + "' where id='0001'";
                // 实例化Statement对象
                statement = conn.createStatement();
                // 执行SQL INSERT语句
                int row  = statement.executeUpdate(sql);
                if( row == 1 )
                {
                    System.out.println("shoper表修改记录成功");
                }
                else
                {
                    System.out.println("shoper表修改记录失败");
                }
                statement.close();
                conn.close();
            } else {
                System.out.println("数据库连接失败");
            }
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
 
    }
}

程序使用SQL的UPDATE语句修改shoper表的一条记录。修改成功后,可以运行SqlDemoTest2程序,查看修改结果。

删除数据库表记录

数据库记录的删除操作是指在数据库表中删除符合条件的记录,删除操作是通过SQL的DELETE语句完成的,Statement 接口的executeUpdate()方法执行SQL删除语句,该方法返回删除的记录数,返回0表示没有删除任何记录。

案例6:编写SQL语句删除shoper表中的一条记录,并通过Statement 接口的executeUpdate()方法执行该SQL删除语句。

在demo包下新建SqlDemoTest5类。代码如下:

package demo;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
 
public class SqlDemoTest5 {
    // 定义JDBC加载路径
    static String jdbc = "com.mysql.cj.jdbc.Driver";
    // 定义MySQL数据库的连接地址
    static String mysqlurl = "jdbc:mysql://localhost:3306/shop?serverTimezone=GMT%2B8";
    // 定义MySQL数据库的用户名
    static String username = "root";
    // 定义MySQL数据库的用户名登录密码
    static String password = "~123456q";
 
    public static void main(String[] args) {
        Connection conn = null;
        Statement statement = null;
        try {
            // 加载JDBC驱动
            Class.forName(jdbc);
            // 连接数据库
            conn = DriverManager.getConnection(mysqlurl, username, password);
            if (null != conn) {
                System.out.println(conn);
                String name = "联盟打印机";
                // 删除shoper表中id为0001的记录
                String sql = "delete from shoper where id='0001'";
                // 实例化Statement对象
                statement = conn.createStatement();
                // 执行SQL INSERT语句
                int row  = statement.executeUpdate(sql);
                if( row == 1 )
                {
                    System.out.println("shoper表删除记录成功");
                }
                else
                {
                    System.out.println("shoper表删除记录失败");
                }
                statement.close();
                conn.close();
            } else {
                System.out.println("数据库连接失败");
            }
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
 
 
    }
}

程序使用SQL的DELETE语句删除shoper表的id为0001的记录。删除成功后,可以运行SqlDemoTest2程序,查看修改结果。

SQL语句预处理操作

在前面的数据库操作中,对SQL语句并没有做预处理工作,而是直接把SQL语句提交给了数据库引擎(执行数据库的核心操作),数据库引擎负责把SQL语句转换为可执行的一系列数据库操作命令,然后执行命令,完成相关的数据库操作。如果大量并发的线程同时提交SQL语句给数据库引擎,这显然让数据库引擎吃不消,就会影响数据库执行的速度,甚至会导致数据库崩溃。

JDBC的PreparedStatement接口可以对SQL语句进行预处理(对SQL语句进行预编译),SQL语句的预处理操作就是把数据库引擎解释SQL语句的任务放在客户端执行,提交给数据库引擎的是已经生成的数据库操作命令,这样就提高了数据库的工作效率。

PreparedStatement接口继承了Statement接口,在Statement接口基础上增加了新的方法,新增加的常用方法说明如下:

●   boolean      ex1ecute()

该方法执行此PreparedStatement对象中的SQL语句,该对象可以是任何类型的SQL语句。

●   ResultSet    exe1cuteQuery()

该方法执行此PreparedStatement对象中的SQL查询并返回查询生成的ResultSet对象。

●   int  exe1cuteUpdate()

该方法执行此PreparedStatement对象中的SQL语句,该对象必须是SQL数据操作语言(DML)语句,如INSERT、UPDATE或DELETE;或者是不返回任何内容的SQL语句,如DDL语句。

●   void     setDate(int parameterIndex, Date x)

该方法将指定的日期对象写入数据库日期字段中。参数parameterIndex表示字段所在记录的列号。参数x为java.sql.Date类型。

●   void     setInt(int parameterIndex, int x)

该方法将指定的int类型的值写入数据库int类型的字段中。参数parameterIndex表示字段所在记录的列号。参数x为int类型。

●   void     setDouble(int parameterIndex, double x)

该方法将指定的double类型的值写入数据库double类型的字段中。参数parameterIndex表示字段所在记录的列号。参数x为double类型。

●   void     setString(int parameterIndex, String x)

该方法将指定的String类型的值写入数据库字符串类型的字段中。参数parameterIndex表示字段所在记录的列号。参数x为String类型。

●   void     setFloat(int parameterIndex, float x)

该方法将指定的float类型的值写入数据库float类型的字段中。参数parameterIndex表示字段所在记录的列号。参数x为float类型。

●   void     addBatch()

该方法将SQL更新语句的一组参数添加到此PreparedStatement对象,对SQL更新语句涉及的表中记录进行批量更新。

Connection接口的prepareStatement ()方法可以返回PreparedStatement对象,具体说明如下:

●   PreparedStatement prepareStatement(String sql)

该方法创建PreparedStatement对象,用于将编译过的SQL语句发送到数据库。

SQL语句可以预编译并存储在PreparedStatement对象中。然后可以使用此对象多次有效地执行此语句。

案例7:查询shoper表的所有记录,并将记录内容输出到控制台。使用PreparedStatement对象执行SQL语句。

在demo包下新建SqlDemoTest6类。代码如下:

package demo;
 
import java.math.BigDecimal;
import java.sql.*;
 
public class SqlDemoTest6 {
    // 定义JDBC加载路径
    static String jdbc = "com.mysql.cj.jdbc.Driver";
    // 定义MySQL数据库的连接地址
    static String mysqlurl = "jdbc:mysql://localhost:3306/shop?serverTimezone=GMT%2B8";
    // 定义MySQL数据库的用户名
    static String username = "root";
    // 定义MySQL数据库的用户名登录密码
    static String password = "~123456q";
 
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement prepareStatement = null;
        try {
            // 加载JDBC驱动
            Class.forName(jdbc);
            // 连接数据库
            conn = DriverManager.getConnection(mysqlurl, username, password);
            if (null != conn) {
                System.out.println(conn);
                // 获取表记录数的SQL语句
                String sql = "select * from shoper";
                // 实例化Statement对象
                prepareStatement = conn.prepareStatement(sql);
                // 执行SQL查询语句
                ResultSet resultset = prepareStatement.executeQuery(sql);
                if (null != resultset) {
                    while( resultset.next() )
                    {
                        // 获取id字段内容
                        String id = resultset.getString("id");
                        // 获取userId字段内容
                        String userId = resultset.getString("userId");
                        // 获取name字段内容
                        String name = resultset.getString("name");
                        // 获取brief字段内容
                        String brief = resultset.getString("brief");
                        // 获取log字段内容
                        String log = resultset.getString("log");
                        // 获取shopMoney字段内容
                        BigDecimal shopMoney = resultset.getBigDecimal("shopMoney");
                        // 获取status字段内容
                        int status = resultset.getInt("status");
                        // 获取createDate字段内容
                        Date createDate = resultset.getDate("createDate");
                        System.out.printf("-----输出第%d条记录-----\n",resultset.getRow());
                        System.out.println("id:" + id + ";");
                        System.out.println("userId:" + userId + ";");
                        System.out.println("name:" + name + ";");
                        System.out.println("brief:" + brief + ";");
                        System.out.println("log:" + log + ";");
                        System.out.println("shopMoney:" + shopMoney.toString() + ";");
                        System.out.println("status:" + status + ";");
                        System.out.println("createDate:" + createDate.toString() + ";");
                        System.out.println("-------------------------------");
                    }
 
                    resultset.close();
                } else {
                    System.out.println("SQL语句执行失败");
                }
                prepareStatement.close();
                conn.close();
            } else {
                System.out.println("数据库连接失败");
            }
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
 
 
    }
}

SqlDemoTest6程序代码和SqlDemoTest2程序代码基本相同,主要区别是PreparedStatement接口替代了Statement接口,conn对象调用的是prepareStatement()方法,而不是createStatement()方法。

代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论