(Java数据库编程基础操作)Statement实现数据查询操作

本文详细讲解了如何在Java中使用Statement接口进行数据查询,包括多列查询、简单获取、getObject()方法,并展示了通过索引和反射机制的应用。还涵盖了如何创建多个Statement实例处理增删改查操作。

Statement实现数据查询操作

在整个数据库的开发过程之中数据的查询操作是最复杂的,因为查询会牵扯到各种复杂查询的管理,例如:多表查询、子查询、统计查询、集合操作等等,但是从现代的开发来讲,对于数据的查询如果非必须的情况下建议以简单查询为主,在Statement接口里面所定义的数据查询方法如下:

ResultSet executeQuery​(String sql) throws SQLException

这个查询方法会直接返回有一个ResultSet接口的对象实例,这样就可以得到如下的完整的数据库操作的接口关联。

 

在执行的过程之中由Statement接口的对象实例向数据库发出一条查询指令,随后这个数据库的查询返回的结果会自动通过ResultSet接口对象实例进行包装,这些数据就被加载到内存之中了。如果此时数据查询返回的结果过多的话,那么就会造成JVM的内存占用率过高,从而导致程序有可能出现内存溢出的问题。

  

如果要想通过ResultSet 获取数据直接使用getXxx()方法即可, 其中“Xxx”对应的是不同的数据类型,例如: getLong()、getString()、getDate()等。
范例:实现数据查询

import java.sql.*;

public class JDBCDemo {

    public static final String DRIVER = "com.mysql.cj.jdbc.Driver";    //数据库的驱动程序
    public static final String URL="jdbc:mysql://localhost:3306/yootk"; //连接地址
    public static final String USER = "root";   //用户名
    public static final String PASSWORD = "mysqladmin"; //密码

    public static void main(String[] args) throws Exception{

        Class.forName(DRIVER);  //将数据的驱动程序加载到容器内部
        Connection connection = DriverManager.getConnection(URL,USER,PASSWORD); //获取数据库的连接
        Statement statement = connection.createStatement(); //创建数据库的操作对象
        //sql插入字段代码,在以后填写sql语句时如果需要换行,最佳的做法是在前后多加一个空格
        String sql = "SELECT uid,name,age,birthday,salary,note FROM user";
        ResultSet resultSet = statement.executeQuery(sql);   //执行sql并返回更新的数据行数
        while(resultSet.next()){    //判断是否还有数据
            //根据字段获取数据
            long uid = resultSet.getLong("uid");
            String name = resultSet.getString("name");
            int age = resultSet.getInt("age");
            Date birther = resultSet.getDate("birthday");
            double salary = resultSet.getDouble("salary");
            String note = resultSet.getString("note");
            System.out.printf("【查询结果】编号:%s、姓名:%s、年龄:%s、生日:%s、工资:%f、介绍:%s\n",
                                uid,name,age,birther,salary,note);
        }
        //如果现在直接关闭了数据库的连接,整个数据库所有的Statement对象也就自动关闭了
        connection.close(); //及时关闭

    }

}

 

 【查询结果】编号:1、姓名:李兴华、年龄:18、生日:2008-08-13、工资:8000.000000、介绍: www. yootk. com
【查询结果】编号:2、姓名: 沐言优折、年龄:18、生日:2009-09-15、工资:9000.000000、介绍: ww.yootk.com
【查询结果】编号:3、姓名:VIP学院、年龄:18、生日:2009-09-15、工资:78000.000000、介绍:yootk.ke.qq.com
【查询结果】编号:4、姓名:李四、年龄:17、生日:1888-08-01、工资:100.000000、介绍:www.baidu.com

在以后开发的过程里面对于数据查询的SQL语句来讲绝对不允许使用“SELECT*”因为这样会导致查询结果的不明确,如果此时查询的是具体的字段信息,最大的优势在于:可以直接通过编号的形式来获取数据。

范例:通过编号获取数据

import java.sql.*;

public class JDBCDemo {

    public static final String DRIVER = "com.mysql.cj.jdbc.Driver";    //数据库的驱动程序
    public static final String URL="jdbc:mysql://localhost:3306/yootk"; //连接地址
    public static final String USER = "root";   //用户名
    public static final String PASSWORD = "mysqladmin"; //密码

    public static void main(String[] args) throws Exception{

        Class.forName(DRIVER);  //将数据的驱动程序加载到容器内部
        Connection connection = DriverManager.getConnection(URL,USER,PASSWORD); //获取数据库的连接
        Statement statement = connection.createStatement(); //创建数据库的操作对象
        //sql插入字段代码,在以后填写sql语句时如果需要换行,最佳的做法是在前后多加一个空格
        String sql = "SELECT uid,name,age,birthday,salary,note FROM user";
        ResultSet resultSet = statement.executeQuery(sql);   //执行sql并返回更新的数据行数
        while(resultSet.next()){    //判断是否还有数据
            //根据字段获取数据
            long uid = resultSet.getLong(1);
            String name = resultSet.getString(2);
            int age = resultSet.getInt(3);
            Date birther = resultSet.getDate(4);
            double salary = resultSet.getDouble(5);
            String note = resultSet.getString(6);
            System.out.printf("【查询结果】编号:%s、姓名:%s、年龄:%s、生日:%s、工资:%f、介绍:%s\n",
                                uid,name,age,birther,salary,note);
        }
        //如果现在直接关闭了数据库的连接,整个数据库所有的Statement对象也就自动关闭了
        connection.close(); //及时关闭

    }

}

此时由于查询语句上已经明确的给出了查询列的定义,这样就可以通过索引号方便的实现结果集中列数据的获取了。虽然通过具体的getXxx()的形式可以获得相应的列数据信息,但是在ResultSet接口里面针对于结果列的获取还有另外一个简单方法:

Object getObject​(int columnIndex) throws SQLException

把所有的内容都以Object的形式进行接收,Object作为返回数据类型的统一标准了。

范例:通过getObject()实现操作的接收

import java.sql.*;

public class JDBCDemo {

    public static final String DRIVER = "com.mysql.cj.jdbc.Driver";    //数据库的驱动程序
    public static final String URL="jdbc:mysql://localhost:3306/yootk"; //连接地址
    public static final String USER = "root";   //用户名
    public static final String PASSWORD = "mysqladmin"; //密码

    public static void main(String[] args) throws Exception{

        Class.forName(DRIVER);  //将数据的驱动程序加载到容器内部
        Connection connection = DriverManager.getConnection(URL,USER,PASSWORD); //获取数据库的连接
        Statement statement = connection.createStatement(); //创建数据库的操作对象
        //sql插入字段代码,在以后填写sql语句时如果需要换行,最佳的做法是在前后多加一个空格
        String sql = "SELECT uid,name,age,birthday,salary,note FROM user";
        ResultSet resultSet = statement.executeQuery(sql);   //执行sql并返回更新的数据行数
        while(resultSet.next()){    //判断是否还有数据
            //根据字段获取数据
            Object uid = resultSet.getObject(1);
            Object name = resultSet.getObject(2);
            Object age = resultSet.getObject(3);
            Object birther = resultSet.getObject(4);
            Object salary = resultSet.getObject(5);
            Object note = resultSet.getObject(6);
            System.out.printf("【查询结果】编号:%s、姓名:%s、年龄:%s、生日:%s、工资:%f、介绍:%s\n",
                                uid,name,age,birther,salary,note);
        }
        //如果现在直接关闭了数据库的连接,整个数据库所有的Statement对象也就自动关闭了
        connection.close(); //及时关闭

    }

}

在Java中有一项特别重要的技术就属于反射机制,而对于反射机制来讲,所有的参数的内容都会通过Object类型来描述,结合反射机制再使用如上的getObject()方法就特别有用处。

提示:现在所使用的JDBC操作形式属于JDBC1.0的时候所具备的流程,但是相比较原始的JDBC版本来讲,现在的JDBC开发要方便许多,因为有如下两个问题解决了:

  • 在JDBC早期版本里面,所有的列数据必须按照顺序的方式获取,如果顺序错乱,则无法获取;。
  • 所有的数据只能够获取一次,如果重复获取也会出错。

通过以上的程序已经实现了完整的数据的CRUD处理,那么下面尝试创建两个Statement对象一个实现数据的增加,另外一个实现获取增长后ID的内容( 数据库查询)。

范例:观察两个Statement接口对象的操作

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class StatementAdd {

    public static final String DRIVER = "com.mysql.cj.jdbc.Driver";    //数据库的驱动程序
    public static final String URL="jdbc:mysql://localhost:3306/yootk"; //连接地址
    public static final String USER = "root";   //用户名
    public static final String PASSWORD = "mysqladmin"; //密码

    public static void main(String[] args) throws Exception{

        Class.forName(DRIVER);//反射获取驱动程序
        Connection connection = DriverManager.getConnection(URL,USER,PASSWORD); //获取数据库连接
        Statement statementInsert= connection.createStatement();  //创建数据库的操作对象
        Statement statementSelect = connection.createStatement();   //创建数据库的操作对象
        String insertSql = " INSERT INTO user(name,age,birthday,salary,note) VALUES " +
                " ('王五',78,'1947-08-01',800,'www.baidu.com') ";
        String selectSql = "SELECT LAST_INSERT_ID()";    //最后一次增长ID的查询
        int count = statementInsert.executeUpdate(insertSql); //实现数据的插入
        statementInsert.close();    //关闭资源
        if(count > 0){
            ResultSet result= statementSelect.executeQuery(selectSql);    //对需要查询的数据进行保存
            if(result.next()){  //判断是否有数据
                System.out.println("插入的数据ID为:"+result.getObject(1));    //对查询到的数据进行输出
            }
        }else{
            System.out.println("插入失败");
        }
        statementSelect.close();    //关闭资源
        connection.close(); //关闭连接

    }

}

插入的数据ID为:11

每一个Statement对象都表示一个完全独立的SQL语句的执行命令,如果现在不想有多个Statement,也可以通过重复的关闭和创建的机制来实现。|

只要用户会写sql语句就可以实现数据库的CRUD处理。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值