PreparedStatement实现针对不同表的通用查询操作:查询一样和多行

PreparedStatementQueryTest

  1. package com.aff.PreparedStatement;
  2. import java.lang.reflect.Field;
  3. import java.sql.Connection;
  4. import java.sql.PreparedStatement;
  5. import java.sql.ResultSet;
  6. import java.sql.ResultSetMetaData;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. import org.junit.Test;
  10. import com.aff.bean.Customer;
  11. import com.aff.bean.Order;
  12. import com.aff.utils.JDBCUtils;
  13.  
  14. //使用PreparedStatement实现针对不同表的通用的查询操作
  15. public class PreparedStatementQueryTest {
  16. @Test
  17. public void testGetForList() {
  18. String sql = "select id ,name,email from customers where id < ? ";
  19. List<Customer> list = getForList(Customer.class, sql, 5);
  20. list.forEach(System.out::println);//list的遍历方法
  21.  
  22. String sql1 = "select order_id orderId, order_name orderName from `order`
    where order_id < ?";
  23. List<Order> list2 = getForList(Order.class, sql1, 5);
  24. list2.forEach(System.out::println);
  25. }
  26.  
  27. // 泛型集合方法加<T>List<T>
  28. public <T> List<T> getForList(Class<T> clazz, String sql, Object... args) {
  29. Connection conn = null;
  30. PreparedStatement ps = null;
  31. ResultSet rs = null;
  32. try {
  33. conn = JDBCUtils.getConnection();
  34. // 执行,获取结果集
  35. ps = conn.prepareStatement(sql);
  36. // 填充占位符
  37. for (int i = 0; i < args.length; i++) {
  38. ps.setObject(i + 1, args[i]);
  39. }
  40. rs = ps.executeQuery();
  41. // 获取结果集的元数据
  42. ResultSetMetaData rsmd = rs.getMetaData();
  43. // 获取列数
  44. int columnCount = rsmd.getColumnCount();
  45.  
  46. // 创建一个集合对象
  47. ArrayList<T> list = new ArrayList<>();
  48. while (rs.next()) {
  49. T t = clazz.newInstance();
  50. // 处理结果集一行数据的每一个列,给t对象指定的属性赋值
  51. for (int i = 0; i < columnCount; i++) {
  52. // 获取每个列的列值
  53. Object columnValue = rs.getObject(i + 1);
  54.  
  55. // 获取列的列名,列数 列名为元数据用来修饰ResultSet(结果集)的,
  56. // 改为获取列的别名
  57. String ColumnLabel = rsmd.getColumnLabel(i + 1);
  58.  
  59. // 通过反射将对象指定名columnName的属性赋给指定的值columnValue
  60. // 先拿到class
  61. Field field = clazz.getDeclaredField(ColumnLabel);
  62. field.setAccessible(true);
  63. field.set(t, columnValue);
  64. }
  65. // 理解成每遍历完一行就添加进list集合中
  66. list.add(t);
  67. }
  68. // while循环结束,再把添加过t对象的集合(理解为表中的每一行)返回
  69. return list;
  70. } catch (Exception e) {
  71. e.printStackTrace();
  72. } finally {
  73. JDBCUtils.closeResource(conn, ps, rs);
  74. }
  75. return null;
  76. }
  77.  
  78. @Test
  79. public void testGetInstance() {
  80. String sql = "select id ,name,email from customers where id = ? ";
  81. Customer customer = getInstance(Customer.class, sql, 12);
  82. System.out.println(customer);
  83.  
  84. String sql1 ="select order_id orderId,order_name orderName from `order` where order_id = ?";
  85. Order order = getInstance(Order.class, sql1, 2);
  86. System.out.println(order);
  87. }
  88.  
  89. public <T> T getInstance(Class<T> clazz, String sql, Object... args) {
  90. Connection conn = null;
  91. PreparedStatement ps = null;
  92. ResultSet rs = null;
  93. try {
  94. conn = JDBCUtils.getConnection();
  95. // 执行,获取结果集
  96. ps = conn.prepareStatement(sql);
  97. // 填充占位符
  98. for (int i = 0; i < args.length; i++) {
  99. ps.setObject(i + 1, args[i]);
  100. }
  101. rs = ps.executeQuery();
  102. // 获取结果集的元数据
  103. ResultSetMetaData rsmd = rs.getMetaData();
  104. // 获取列数
  105. int columnCount = rsmd.getColumnCount();
  106. if (rs.next()) {
  107. T t = clazz.newInstance();
  108.  
  109. for (int i = 0; i < columnCount; i++) {
  110. // 获取每个列的列值
  111. Object columnValue = rs.getObject(i + 1);
  112.  
  113. // 获取列的列名,列数 列名为元数据用来修饰ResultSet(结果集)的,
  114. // String columnName = rsmd.getColumnName(i + 1);-- 不推荐使用
  115. // 改为获取列的别名
  116. String ColumnLabel = rsmd.getColumnLabel(i + 1);
  117.  
  118. // 通过反射将对象指定名columnName的属性赋给指定的值columnValue
  119. // 先拿到class
  120. Field field = clazz.getDeclaredField(ColumnLabel);
  121. field.setAccessible(true);
  122. field.set(t, columnValue);
  123. }
  124. return t;
  125. }
  126. } catch (Exception e) {
  127. e.printStackTrace();
  128. } finally {
  129. JDBCUtils.closeResource(conn, ps, rs);
  130. }
  131. return null;
  132. }
  133. }

PreparedStatement实现针对不同表的通用查询操作的更多相关文章

  1. 分别针对Customers表与Order表的通用查询操作

    1.针对customers表通用的查询操作 CustomerForQuery package com.aff.PreparedStatement; import java.lang.reflect.F ...

  2. poi 操作 PPT,针对 PPTX--图表篇

    poi 操作 PPT,针对 PPTX--图表篇 目录 poi 操作 PPT,针对 PPTX--图表篇 1.读取 PPT 模板 2.替换标题 4.替换图表数据 接下来对 ppt 内的图表进行操作,替换图 ...

  3. PHP数组/Hash表的实现/操作、PHP变量内核实现、PHP常量内核实现 - [ PHP内核学习 ]

    catalogue . PHP Hash表 . PHP数组定义 . PHP变量实现 . PHP常量实现 1. PHP Hash表 0x1: 基本概念 哈希表在实践中使用的非常广泛,例如编译器通常会维护 ...

  4. 走向DBA[MSSQL篇] 针对大表 设计高效的存储过程【原理篇】 附最差性能sql语句进化过程客串

    原文:走向DBA[MSSQL篇] 针对大表 设计高效的存储过程[原理篇] 附最差性能sql语句进化过程客串 测试的结果在此处 本篇详解一下原理 设计背景 由于历史原因,线上库环境数据量及其庞大,很多千 ...

  5. java 散列与散列码探讨 ,简单HashMap实现散列映射表运行各种操作示列

    java 散列与散列码探讨 ,简单HashMap实现散列映射表运行各种操作示列 package org.rui.collection2.maps; /** * 散列与散列码 * 将土拔鼠对象与预报对象 ...

  6. Django 08 Django模型基础3(关系表的数据操作、表关联对象的访问、多表查询、聚合、分组、F、Q查询)

    Django 08 Django模型基础3(关系表的数据操作.表关联对象的访问.多表查询.聚合.分组.F.Q查询) 一.关系表的数据操作 #为了能方便学习,我们进入项目的idle中去执行我们的操作,通 ...

  7. [MySQL数据库之表的详细操作:存储引擎、表介绍、表字段之数据类型]

    [MySQL数据库之表的详细操作:存储引擎.表介绍.表字段之数据类型] 表的详细操作 存储引擎 mysql中建立的库======>文件夹 库中建立的表======>文件 用来存储数据的文件 ...

  8. “ShardingCore”是如何针对分表下的分页进行优化的

    分表情况下的分页如何优化 首先还是要给自己的开原框架打个广告 sharding-core 针对efcore 2+版本的分表组件,首先我们来快速回顾下目前市面上分表下针对分页常见的集中解决方案 分表解决 ...

  9. Oracle中如何实现Mysql的两表关联update操作

    在看<MySQL 5.1参考手册>的时候,发现MySQL提供了一种两表关联update操作.原文如下: UPDATE items,month SET items.price=month.p ...

随机推荐

  1. 编写简单的内核模块及内核源码下载,内核模块Makefile编写

    CentOS的内核源码默认是没有下载的,需要自己下载,首先安装linux的时候就应该知道linux的版本,我装的是Centos7的 下面查一下内核的版本,使用下面的命令 [scut_lcw@local ...

  2. java读源码 之 map源码分析(HashMap,图解)一

    ​ 开篇之前,先说几句题外话,写博客也一年多了,一直没找到一种好的输出方式,博客质量其实也不高,很多时候都是赶着写出来的,最近也思考了很多,以后的博客也会更注重质量,同时也尽量写的不那么生硬,能让大家 ...

  3. .net core HttpClient 使用之掉坑解析(一)

    一.前言 在我们开发当中经常需要向特定URL地址发送Http请求操作,在.net core 中对httpClient使用不当会造成灾难性的问题,这篇文章主要来分享.net core中通过IHttpCl ...

  4. CF#637 D. Nastya and Scoreboard DP

    D. Nastya and Scoreboard 题意 一块电子屏幕上有n个数字. 每个数字是通过这样7个线段显示的,现在你不小心打坏了k个线段,给出打坏之后的n个数字的显示方式,问之前的屏幕表示的最 ...

  5. Vue3语法快速入门以及写一个倒计时组件

    Vue3写一个倒计时组件 vue3 beta版本发布已有一段时间了,文档也大概看了一下,不过对于学一门技术,最好的方法还是实战,于是找了一个比较简单的组件用vue3来实现,参考的是vant的count ...

  6. springBoot整合Mybatis,Junit

    笔记源码:https://gitee.com/ytfs-dtx/SpringBoot 整合Mybatis SpringBoot的版本:2.2.5.RELEASE Mybatis版本:mybatis-s ...

  7. Mysql 常用函数(11)- trim 函数

    Mysql常用函数的汇总,可看下面系列文章 https://www.cnblogs.com/poloyy/category/1765164.html trim 的作用 删除字符串左右两侧的空格 tri ...

  8. unserialize3

    0x01序列化与反序列化 序列化:将变量转换为可保存或传输的字符串的过程. 反序列化:在适当的的时候把这个字符串再转化成原来的变量使用. 优点: 存储和传输数据更方便,使程序维护性更高. 函数: se ...

  9. Spring-mvc 配置文件applicationContext.xml

    相关jar包(4.3.16.RELEASE) <!-- Spring mvc 基础jar包,maven 依赖 --> <dependency> <groupId>o ...

  10. 「雕爷学编程」Arduino动手做(17)---人体感应模块

    37款传感器和模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器与模块,依照实践出真知(动手试试)的理念,以学习和交流为目的,这里准备 ...