关键词搜索

源码搜索 ×
×

IDEA-MySQL增删改查操作

发布2019-03-08浏览6955次

详情内容

Java中提供了丰富的类和接口用于数据库编程,利用这些类和接口可以方便地进行数据库访问和处理。我们常用的JDBC接口和类都在java.sql包中。

1、Connection接口

Connection接口代表与特定的数据库的连接,在连接上下文中进行SQL语句并返回结果。

2.Statement接口

Statement接口用于已经建立连接的基础上向数据发送SQL语句。在JDBC中有3种Statement对象,分别是Statement、PreparedStatement和CallableStatement。Statement用于执行不带参数的简单的SQL语句;PreparedStatement继承了Statement,用来执行动态的SQL语句;CallableStatement继承了PreparedStatement,用于执行对数据库存储的过程中的调用。

3.PreparedStatement接口

PreparedStatement接口用来动态地执行SQL语句。通过PreparedStatement实例执行的动态的SQL语句,将被预编译并保存到PreparedStatement实例中,从而可以实现反复执行SQL语句。当向数据库发送一个SQL语句,数据库中的SQL解释器负责把SQL语句生成底层的内部命令,然后执行该命令,完成相关的数据操作。如果不断的向数据库提交SQL语句,肯定会增加数据库中SQL解释器的负担,影响执行速度。
对于JDBC,可以通过Connection对象的prepareStatement(String sql)方法对SQL语句实行预编译,生成数据库底层的内部命令,并将该命令封装在PreparedStatement对象中,通过调用该对象的相应的方法执行底层数据库命令。这样应用程序就能针对连接的数据库,实现将SQL语句解释为数据库底层的内部命令,然后让数据库执行这个命令,这样就可以减轻数据库的负担,提高访问数据库的速度。

4.DriverManager类

DriverManager类用来管理数据库中的所有驱动程序。他是JDBC的管理层,作用于用户和驱动程序之间,跟踪可用的驱动程序,并在数据库的驱动程序之间建立联系。通过getConnection(String url,String user,String password)方法建立连接。

5.ResultSet接口

ResultSet接口类似于临时表,用来暂时存放数据库查询操作所获得的结果集。ResultSet的实例具有指向当前数据行的指针,指针开始的位置在第一条记录的前面,通过next()方法可将指针向下移。

上面介绍操作数据的用到的一些类和接口,下面我们对数据库进行增删改查操作。

6.增删改查操作

在项目中创建类HandleSql,代码如下:

package sql;

import java.sql.*;

public class HandleSql { //创建 HandleSql 类

    static Connection con; //声明 Connection 对象
    static PreparedStatement pStmt;//声明预处理 PreparedStatement 对象
    static ResultSet res;//声明结果 ResultSet 对象

    static String url = "jdbc:mysql://localhost:3306/db_test";
    static String user = "root";
    static String password = "youpassword";

    public Connection getConnection() {//建立返回值为 Connection 的方法

        //代码块(1):加载数据库驱动类
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            System.out.println("数据库驱动加载成功");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        //代码块(2):通过访问数据库的URL获取数据库连接对象
        try {
            con = DriverManager.getConnection(url,user,password);
            System.out.println("数据库连接成功");
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return con;
    }
    public static void main(String[] args) {//主方法
        HandleSql h = new HandleSql();//创建本类对象
        con = h.getConnection();//与数据库建立连接
        
    }

}

    运行项目
    在这里插入图片描述
    代码块(1):通过java.lang包的静态方法forName()来加载JDBC驱动程序,如果加载失败会抛出ClassNotFoundException异常。应该确定数据库驱动类是否成功加载到程序中。
    代码块(2):通过java.sql包中类DriverManager的静态方法getConnection(String url,String user,String password)建立数据库连接。该方法的3个参数依次指定预连接数据库的路径、用户名、密码。返回Connection对象。如果连接失败,抛出SQLException异常。

    1.查询表中的数据

        //创建查询数据方法
        public void queryData() {
            try {
                String sql = "select * from db_user";
                pStmt = con.prepareStatement(sql);
                res = pStmt.executeQuery();
                while (res.next()) {//如果当前语句不是最后一条,则进入循环
                    int id = res.getInt("id");
                    String name = res.getString("name");
                    String phone = res.getString("phone");
                    System.out.println("id:" + id + "  " + "姓名:" + name + "  " + "电话:" + phone);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    我们在主方法中调用方法 queryData() ,SQL语句select * from table查询表中的所有数据。运行的结为一个ResultSet对象,ResultSet对象一次只可一看到结果集中的一行数据,使用该类的next()方法可将光标从当前位置移向下一行,该方法的返回值是boolean类型的数据,当游标移动到最后一行之后会返回false。
    我们也可以进行模糊查询,SQL语句中提供了LIKE操作符用于模糊查询,可使用%来代替0个或者多个字符,使用下划线_来代替一个字符。例如查询表中所有姓李的数据:

    select * from db_user where name like '李%'
    
    • 1

    2.增加一条数据

        public void addData() {
            try {
                pStmt = con.prepareStatement("insert into db_user (name,phone) values(?,?)");
                pStmt.setString(1, "李四");
                pStmt.setString(2, "0000000");
                pStmt.executeUpdate();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在主方法中调用方法addData() ,SQL语句insert into db_user (name,phone) values(?,?)来向表中插一条数据。对SQL进行预处理时可以使用通配符?来代替任何字段,在执行预处理语句前,必须用相应的方法设置通配符所表示的值:pStmt.setString(1, "李四");。例如上述方法中的1表示从左到右的第几个通配符,李四表示设置的通配符的值。功能等同于:

    insert into db_user (name,phone) values('李四','0000000')
    
    • 1

    注意:尽管书写多条语句看似麻烦一些,但使用预处理语句可使应用程序更容易动态地改变SQL语句中关于字段条件的设定。通过setXXX()方法为SQL语句中的参数赋值时,建议利用与参数匹配的方法,也可以利用setObject()方法为各种类型的参数赋值。例如:setObject(1, "李四")

    3.修改更新数据

       public void updateData() {
            try {
                pStmt = con.prepareStatement("update db_user set name = ? where id = 6");
                pStmt.setString(1, "周礼");
                pStmt.executeUpdate();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在主方法中调用方法updateData() ,SQL语句update table set name = ? where id = 6来修改表中的数据。例中只是更改根据id更改一条数据,你可以更改多条数据和多个字段,例如修改所有姓李的姓名和号码:

    update db_user set name = ?,phone = ? where name like '李%'
    
    • 1

    4.删除数据

        public void deleteData() {
            try {
                Statement stmt = con.createStatement();//创建Statement对象
                stmt.executeUpdate("delete from db_user where id=4");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在主方法中调用方法deleteData() ,SQL语句delete from db_user where id=4来删除表中的数据。例中只是根据id更改删除一条数据,你可以删除多条数据,例如删除所有姓李的数据:

    delete from db_user where name like '李%'
    
    • 1

    到这里简单的增删改查就介绍完了,这只是简单的几个SQL语句介绍,还有好多复杂的SQL语句。尤其是在查询时,当你需要的条件很多时,where后面的条件就会很复杂。举个例子,现在有个需求,修改表中id最大的一条数据对应的姓名和号码:

    update db_user set name = ?,phone = ? where id = (select max(id) from (select id from db_user) as tem)
    
    • 1

    如果你直接写成下面这样是错误的:

    update db_user set name = ?,phone = ? where id = (select max(id) from db_user )
    
    • 1

    错误原因:

    You can't specify target table 'db_user' for update in FROM clause
    
    • 1

    因为在MySQL里,不能先select一个表的记录,再按此条件进行更新和删除同一个表的记录,解决办法是:将select得到的结果,再通过中间表select一遍,这样就规避了错误。上例中的正确写法分析:
    将下面的查询结果作为中间表

    (select id from db_user) as tem
    
    • 1

    再查询一遍中间表作为结果集:

    (select max(id) from (select id from db_user) as tem)
    
    • 1

    相关技术文章

    点击QQ咨询
    开通会员
    返回顶部
    ×
    微信扫码支付
    微信扫码支付
    确定支付下载
    请使用微信描二维码支付
    ×

    提示信息

    ×

    选择支付方式

    • 微信支付
    • 支付宝付款
    确定支付下载