PreparedStatement实现数据表的查询操作 [JDBC][Java]

PreparedStatement实现表的查询操作

对于使用PreparedStatement接口实现表数据的查询操作的过程分析:

  1. 我们在前面讲过了使用preparedStatement接口来完成对数据表的增,删,改操作,而在这里我们要使用PreparedStatement接口完成对数据表的查找功能,而对于查找功能来讲和增,删,改操作是有一定的差异的

    • 那么有哪些差异?
      • 我们在MySQL中执行增,删,改操作的时候,这个时候不会返回结果,而在MySQL中当我们执行查询语句的时候就会返回一个查询到的结果,我们将这个查询到的结果称之为"结果集",所以在java中我们使用jdbc对数据库进行了查询操作之后也应该是要返回一个结果集,而在Java中万物皆对象,所以结果集在java层面中也应该是java中的一个类表示的
        • 我们java中定义了一个java.sql.ResultSet接口,一个java.sql.ResultSet接口的实现类的对象就表示了SQL层面的结果集
  2. 我们拿到了这个结果集之后就要将这个结果集封装到一个自定义类的集合中去(也就是将这个结果集封装到一个java类中)

    • 这里我们说的将结果集封装到一个自定义类的集合中去是什么意思?

      • 我们根据ORM思想可以得知: 我们SQL层面的一个表(其实结果集就是以一个虚拟表的形式返回的)对应到java层面中来就对应了一个类,而结果集中的一条条记录就代表了java层面的一个个这个自定义类的对象,那么我们就可以将这一个个自定义类的java对象使用集合存储起来 — 所以这就是我们前面说的将结果集封装到一个自定义类的集合中去

        • 我们将为什么可以将SQL层面的结果集对应的封装到一个java中的类中?

          • 这里我们就要提到一个编程思想(java中针对于数据库的编程思想):

          • ORM编程思想(Object relational mapping , 对象关系映射):
            1. 一个数据表对应一个java中的类

            2. 表中的一条记录对应java类创建的一个对象

            3. 表中的一个字段对应java类中的一个属性(属性,也就是成员变量)

              • 那么表中的一条字段对应了Java类中的一个属性,那么SQL和Java的数据类型之间是如何对应的?有什么样的对应关系?(因为我们说我们的SQL中的字段和我们Java中的属性在定义时都是要指明数据类型的,但是我们的SQL中的字段的数据类型又和Java中的属性的数据类型不同,那么我们要如何对应这两种语言中的不同的数据类型?)

                • 这里我们给出Java与SQL对应的数据类型转换表

                  [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z02jddf1-1648919312143)(E:\非凡英才\java笔记\图解\Java与SQL对应的数据类型转换表.png)]

        • 我们一般都是将其他层面的事物引入到java中然后将其封装到一个JavaBean中:
          • 什么是JavaBean?(JavaBean就是Java中的可重用组件—> 其实就是比较特殊的类)
            • 那么JavaBean要满足那些要求?
              1. 类是公共的
              2. 提供了公共的无参构造器
              3. 提供了对应的get()和set()
                • 我们一般可以选择创建一个名为bean的包,在这个包中专门创建一些JavaBean

我们在遍历集合的时候使用到了迭代器,我们使用迭代器来对Collection实现类集合进行遍历,我们当时提到了两个方法:

  1. hasNext()

    • 判断指针的下一位是否还有数据,如果有就返回true,反之如果没有就返回false
  2. next()

    • next()方法有两个功能:

      ①指针下移

      ②返回指针下移后指向的对象(集合中只能存储引用类型的数据,如果是尝试存储基本数据类型的数据也会存储成功,但是这个时候实际是再存储到集合的时候对基本类型数据进行了自动装箱)

而在ResultSet接口中也一样维护了一个指针,指针在开始的时候也是指在ResultSet中存储的第一个数据的上方,而我们为了遍历ResultSet接口实现类的对象,我们也要使用两个方法:

  1. next()

    • 在ResultSet接口中的next()方法也有两个功能:
      ①判断指针的下一个位置上有没有元素,如果有元素则返回true,如果指针的下一个位置上没有元素,则返回false

      ②如果上一步判断指针的下一个位置上有元素,也就是返回了true的时候,则指针下移,反之如果上一步判断指针指向的下一个位置上没有元素,那么这个时候指针就不会下移(也就是指针位置不变化)

    • 总结: ResultSet接口中的next()方法就相当于Iterator接口中的hasNext()方法加上next()方法的第一个功能
      • 也就是ResultSet接口中的next()方法只是对指针下一个位置的元素进行判断,如果有元素的话就指针下移,但是不会返回指针指向的元素,所以我们又提出了第ResultSet接口实现类对象遍历的第二个方法getXxx()方法
  2. Xxx getXxx(int columnIndex)

    • Xxx是字段类型
    • 参数int类型的columnIndex表示的是列的索引,是从1,开始的,对应的到几结束是通过看我们执行的SQL语句中查询了几个字段确定的
    • 如果不知道字段类型我们一律使用getObject()方法代替
注意: 数据库连接,Statement资源(包括PreparedStatement资源),ResultSet资源等都需要我们手动关闭 —> 也就是调用相应的close()方法
具体使用PreparedStatement接口实现对数据表的查询操作的具体代码如下:
package jdbc.使用PreparedStatement接口实现类操作数据库;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Arrays;

import com.ffyc.bean.Student;
import com.ffyc.util.JDBCUtils;

public class StudentForQuery {
    public static void main(String[] args) throws SQLException, IOException, ClassNotFoundException {
        //1.获取数据库连接
        Connection conn = JDBCUtils.getConnection();
        String sql = "SELECT `no`,`name`,sex \n" +
                "FROM student\n" +
                "WHERE `no` = ?;";

        //2. 预编译SQL语句
        PreparedStatement preparedStatement = conn.prepareStatement(sql);

        //3. 执行
        ResultSet resultSet = preparedStatement.executeQuery();

        //4. 处理结果集
        if(resultSet.next()){
            //获取当前这条数据的各个字段值
            int no = resultSet.getInt(1);
            String name = resultSet.getString(2);
            String sex = resultSet.getString(3);

            /*
            处理获取的数据: (这里我们要讲三种方式)
             */
            //方式一:
            System.out.println("no = "+no+",name = "+name+",sex ="+sex);

            //方式二:
            Object [] data = new Object[]{no,name,sex};
            //测试方式二:
            Arrays.toString(data);

            //方式三:(将获取的结果集封装在一个java自定义类中)
            Student student = new Student(no,name,sex);
            System.out.println(student);
        }
        
        //关闭资源
        /*
        这里调用了我们创建的JDBC工具类中的关闭相应的资源的方法,我们在JDBCUtils自定义类中声明了一个连接MySQL数据库的方法,
        还提供了几个重载的关闭相应的资源的方法
         */
        JDBCUtils.closeResource(conn,preparedStatement,resultSet);
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值