JDBC学习(四):研究查询操作源代码

简介: JDBC学习(四):研究查询操作源代码

现在主要是学习源代码,其实后面都是可以直接实现的。


1、针对特定表的一条数据查询

package demo02;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import org.junit.jupiter.api.Test;
import utils.Bean;
import utils.JDBCUtils;
public class PreparedStatementQuary {
  /***
   * 针对beauty表的某一个查询操作
   */
  @Test
  public void testQuary(){
    Connection conn = null;
    PreparedStatement ps = null;
    ResultSet resultSet = null;
    try {
      conn = JDBCUtils.getConnection();
      //sql语句只能指定,因此只能针对单一操作
      String sql = "select name,borndate,phone from beauty where id = ?";
      ps = conn.prepareStatement(sql);
      ps.setObject(1, 1);
      //执行,并返回结果集
      resultSet = ps.executeQuery();
      //处理结果集
      if(resultSet.next()) {  //判断结果集的下一条是否有数据
        //获取当前数据的各个字段值
        Object name = resultSet.getObject(1);
        Object borndate = resultSet.getObject(2);
        Object phone = resultSet.getObject(3);
        //将数据封装为一个对象
        Bean bean = new Bean(name,borndate,phone);
        System.out.println(bean);     
      }
    } catch (Exception e) {
      e.printStackTrace();
    }finally {
      //关闭资源
      JDBCUtils.closeResourse(conn, ps, resultSet);
    }
  }
}


对应的Bean类(其实应起名为Beauty类更为合理,一个表对应一个类。当时初学没有意识到这个问题):

package utils;
public class Bean {
  private Object name;
  private Object borndate;
  private Object phone;
  public Bean() {
    super();
  }
  public Bean(Object name, Object borndate, Object phone) {
    super();
    this.name = name;
    this.borndate = borndate;
    this.phone = phone;
  }
  public Object getName() {
    return name;
  }
  public void setName(Object name) {
    this.name = name;
  }
  public Object getBorndate() {
    return borndate;
  }
  public void setBorndate(Object borndate) {
    this.borndate = borndate;
  }
  public Object getPhone() {
    return phone;
  }
  public void setPhone(Object phone) {
    this.phone = phone;
  }
  @Override
  public String toString() {
    return "Bean [name=" + name + ", borndate=" + borndate + ", phone=" + phone + "]";
  }
}


2、针对特定表的通用查询操作,,只能返回一条数据

package demo02;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import org.junit.jupiter.api.Test;
import utils.Bean;
import utils.JDBCUtils;
public class PreparedStatementQuary_2 {
  @Test
  public void test() {
    String sql = "select name,borndate from beauty where id=?";
    Bean bean = quary(sql,13);
    System.out.println(bean);
  }
  /***
   * 针对beauty表的通用查询操作
   * @param sql
   * @param args
   * @return
   */
  public Bean quary(String sql,Object ...args){
    Connection conn = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    try {
      conn = JDBCUtils.getConnection();
      ps = conn.prepareStatement(sql);
      for (int i = 0; i < args.length; i++) {
        ps.setObject(i+1, args[i]);
      }
      rs = ps.executeQuery();
      //获取结果集的元数据
      ResultSetMetaData rsmd = rs.getMetaData();
      //通过ResultSetMetaData获取元数据中的列数,以列数控制下面的for循环
      int columnCount = rsmd.getColumnCount();
      if(rs.next()) {
        Bean bean = new Bean();
        //处理结果集一行数据中的每一个列
        for (int i = 0; i < columnCount; i++) {
          //获取填充占位符的元素
          Object columnValue = rs.getObject(i+1);
          //获取每个列的列名
          String columnName = rsmd.getColumnName(i+1);
          //给Bean对象指定的columnName,赋值为columnValue,通过反射
          Field field = Bean.class.getDeclaredField(columnName);
          //防止私有
          field.setAccessible(true);
          field.set(bean, columnValue);
        }
        return bean;      
      }
    }  catch (Exception e) {
      e.printStackTrace();
    }finally {
      JDBCUtils.closeResourse(conn, ps, rs);
    }
    //没成功就返回null
    return null;
  }
}


3、针对所有表的通用查询操作,只能返回一条数据

package demo02;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import org.junit.jupiter.api.Test;
import utils.Bean;
import utils.Boys;
import utils.JDBCUtils;
public class PreparedStatementQuary_3 {
  @Test
  public void test() {
    String sql = "select name,phone from beauty where id=?";
    Bean bean = quary(Bean.class, sql, 13);
    System.out.println(bean);
    String sql_2 = "select boyName,userCP from boys where id=?";
    Boys boys = quary(Boys.class, sql_2, 1);
    System.out.println(boys);
  }
  /***
   * 针对所有表的preparedStatement通用查询,返回表中一条记录
   * @param clazz
   * @param sql
   * @param args
   * @return
   */
  public <T> T quary(Class<T> clazz, String sql, Object... args) {
    Connection conn = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    try {
      conn = JDBCUtils.getConnection();
      ps = conn.prepareStatement(sql);
      for (int i = 0; i < args.length; i++) {
        ps.setObject(i + 1, args[i]);
      }
      rs = ps.executeQuery();
      // 获取结果集的元数据
      ResultSetMetaData rsmd = rs.getMetaData();
      // 通过ResultSetMetaData获取元数据中的列数,以列数控制下面的for循环
      int columnCount = rsmd.getColumnCount();
      if (rs.next()) {
        T t = clazz.newInstance();
        // 处理结果集一行数据中的每一个列
        for (int i = 0; i < columnCount; i++) {
          // 获取填充占位符的元素
          Object columnValue = rs.getObject(i + 1);
          // 获取每个列的列名
          String columnName = rsmd.getColumnName(i + 1);
          // 给t对象指定的columnName,赋值为columnValue,通过反射
          Field field = clazz.getDeclaredField(columnName);
          // 防止私有
          field.setAccessible(true);
          field.set(t, columnValue);
        }
        return t;
      }
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      JDBCUtils.closeResourse(conn, ps, rs);
    }
    // 没成功就返回null
    return null;
  }
}



4,针对所有表的通用查询操作,返回任意条数据

package demo02;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import org.junit.jupiter.api.Test;
import utils.Boys;
import utils.JDBCUtils;
public class PreparedStatementQuary_4 {
  @Test
  public void test() {
    String sql = "select boyName,userCP from boys where id<?";
    ArrayList<Boys> boys = quary(Boys.class, sql, 4);
    boys.forEach(System.out::println);
  }
  /***
   * 针对所有表的通用查询操作,查询多条数据
   * @param clazz
   * @param sql
   * @param args
   * @return
   */
  public <T> ArrayList<T> quary(Class<T> clazz, String sql, Object ...args) {
    Connection conn = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    try {
      conn = JDBCUtils.getConnection();
      ps = conn.prepareStatement(sql);
      for (int i = 0; i < args.length; i++) {
        ps.setObject(i + 1, args[i]);
      }
      rs = ps.executeQuery();
      // 获取结果集的元数据
      ResultSetMetaData rsmd = rs.getMetaData();
      // 通过ResultSetMetaData获取元数据中的列数,以列数控制下面的for循环
      int columnCount = rsmd.getColumnCount();
      ArrayList<T> arrayList = new ArrayList<T>();
      while (rs.next()) {
        T t = clazz.newInstance();
        // 处理结果集一行数据中的每一个列
        for (int i = 0; i < columnCount; i++) {
          // 获取填充占位符的元素
          Object columnValue = rs.getObject(i + 1);
          // 获取每个列的列名
          String columnName = rsmd.getColumnName(i + 1);
          // 给t对象指定的columnName,赋值为columnValue,通过反射
          Field field = clazz.getDeclaredField(columnName);
          // 防止私有
          field.setAccessible(true);
          field.set(t, columnValue);
        }
        arrayList.add(t);
      }
      return arrayList;
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      JDBCUtils.closeResourse(conn, ps, rs);
    }
    // 没成功就返回null
    return null;
  }
}
相关文章
|
5月前
|
SQL Java 数据库连接
java使用jdbc操作数据库
java使用jdbc操作数据库
|
5月前
|
Java 关系型数据库 数据库连接
实时计算 Flink版操作报错之在使用JDBC连接MySQL数据库时遇到报错,识别不到jdbc了,怎么解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
2月前
|
SQL Java 数据库连接
JDBC连接SQL Server2008 完成增加、删除、查询、修改等基本信息基本格式及示例代码
这篇文章提供了使用JDBC连接SQL Server 2008数据库进行增加、删除、查询和修改操作的基本步骤和示例代码。
|
4月前
|
SQL Java 数据库连接
使用Python通过JDBC操作数据库(达梦数据库)
使用Python通过JDBC操作数据库(达梦数据库)
435 0
|
5月前
|
SQL Java 数据库连接
Java JDBC连接与操作深度解析
Java JDBC连接与操作深度解析
35 1
|
4月前
|
Java 数据库连接 数据库
JDBC之Statement与PreparedStatement操作数据库对比
JDBC之Statement与PreparedStatement操作数据库对比
|
5月前
|
Java 数据库连接 数据库
实时计算 Flink版操作报错合集之flink jdbc写入数据时,长时间没写入后报错,是什么原因导致的
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
122 9
|
5月前
|
SQL Java 关系型数据库
JavaWeb(JDBC编程)看这一篇就够了 —— 如何使用Java操作mysql数据库
JavaWeb(JDBC编程)看这一篇就够了 —— 如何使用Java操作mysql数据库
97 0
|
5月前
|
SQL Java 数据库连接
Java从入门到精通:2.3.1数据库编程——学习JDBC技术,掌握Java与数据库的交互
ava从入门到精通:2.3.1数据库编程——学习JDBC技术,掌握Java与数据库的交互
|
5月前
|
SQL Java 数据库连接
Springboot框架整合Spring JDBC操作数据
JDBC是Java数据库连接API,用于执行SQL并访问多种关系数据库。它包括一系列Java类和接口,用于建立数据库连接、创建数据库操作对象、定义SQL语句、执行操作并处理结果集。直接使用JDBC涉及七个步骤,包括加载驱动、建立连接、创建对象、定义SQL、执行操作、处理结果和关闭资源。Spring Boot的`spring-boot-starter-jdbc`简化了这些步骤,提供了一个在Spring生态中更便捷使用JDBC的封装。集成Spring JDBC需要添加相关依赖,配置数据库连接信息,并通过JdbcTemplate进行数据库操作,如插入、更新、删除和查询。
56 0
下一篇
无影云桌面