分别针对Customers表与Order表的通用查询操作
1.针对customers表通用的查询操作
CustomerForQuery
package com.aff.PreparedStatement; import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import org.junit.Test; import com.aff.bean.Customer;
import com.aff.utils.JDBCUtils; //对于Customers表的查询操作
public class CustomerForQuery {
@Test
public void testqueryForCustomers() {
String sql = "select id,name,email from customers where id =?";
Customer customer = queryForCustomers(sql, 12);
System.out.println(customer); } // 针对customers表通用的查询操作
public Customer queryForCustomers(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
ResultSetMetaData rsmd = rs.getMetaData();
// 通过ResultSetMetaData获取结果集中的列数
int columnCount = rsmd.getColumnCount();
if (rs.next()) {
// 对象调一次就行了,一条数据,只造一个对象
Customer cust = new Customer();
for (int i = 0; i < columnCount; i++) {
// 处理结果集,也就是表中的一行中的每一个列
Object columvalue = rs.getObject(i + 1);// 获取列值
String columName = rsmd.getColumnName(i + 1);// 获取列名 // 给cust对象指定的columName属性,赋值为columvalue,通过反射完成
// 把名为columName的属性拿到,因为表中列名和属性是对应的
Field field = Customer.class.getDeclaredField(columName);// 和列名相同的属性
field.setAccessible(true);// 可能是私有的,这样设置使的能够访问 // 把这个属性名的值设置给当前的cust,赋值为columvalue
field.set(cust, columvalue);
}
return cust;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(conn, ps, rs);
}
return null;
} @Test
public void tesQuery() {
Connection conn = null;
PreparedStatement ps = null;
// 执行,并返回一个结果集
ResultSet rs = null;
try {
conn = JDBCUtils.getConnection();
String sql = "select id ,name, email,birth from customers where id =?";
ps = conn.prepareStatement(sql);
ps.setObject(1, 1); rs = ps.executeQuery();
// 处理结果集
if (rs.next()) {//判断结果集的下一条是否有数据,如果有数据返回true,并指针下移,
//返回false指针不下移,直接结束
int id = rs.getInt(1);
String name = rs.getString(2);
String email = rs.getString(3);
Date birth = rs.getDate(4);
// 方式一
// System.out.println("id = " + id + ",name = " + name + ",email
// = "
// + email + ",birth = " + birth); // 方式二
// Object[] data = new Object[] { id, name, email, birth }; // 方式三
Customer customer = new Customer(id, name, email, birth);
System.out.println(customer);
}
} catch (Exception e) {
e.printStackTrace();
}
// 关闭资源
JDBCUtils.closeResource(conn, ps, rs);
}
}
2.针对Order表的通用查询
OrderForQuery
package com.aff.PreparedStatement; import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import org.junit.Test; import com.aff.bean.Order;
import com.aff.utils.JDBCUtils; //针对Order表的通用查询
public class OrderForQuery {
/*
* 针对表的字段名与类的属性名不相同的情况
* 1.必须声明sql时,使用的类的属性名用来命名字段的别名
* 2.使用ResultSetMetaData时,需要使用getColumnLabel()来替换getColumnName()方法,获取类的别名
* 说明: sql中没有给字段起别名,那么getColumnLabel() 获取的就是列名
*/ @Test
public void testorderForQuery() {
String sql = "select order_id orderId ,order_name orderName,order_date orderDate from `order` where order_id = ?";
Order order = orderForQuery(sql, 1);
System.out.println(order);
} // 针对Order表的通用查询
public Order orderForQuery(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();
// 获取列数
int columnCount = rsmd.getColumnCount();
if (rs.next()) { Order order = new Order();
for (int i = 0; i < columnCount; i++) {
// 获取每个列的列值
Object columnValue = rs.getObject(i + 1); // 获取列的列名,列数 列名为元数据用来修饰ResultSet(结果集)的,
// String columnName = rsmd.getColumnName(i + 1);-- 不推荐使用
// 改为获取列的别名
String ColumnLabel = rsmd.getColumnLabel(i+1); // 通过反射将对象指定名columnName的属性赋给指定的值columnValue
// 先拿到class
Field field = Order.class.getDeclaredField(ColumnLabel);
field.setAccessible(true);
field.set(order, columnValue);
}
return order;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(conn, ps, rs);
}
return null;
} @Test
public void testQuery1() {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JDBCUtils.getConnection();
String sql = "select order_id, order_name,order_date from `order` where order_id = ?";
ps = conn.prepareStatement(sql);
// 查询id = 1数据
ps.setObject(1, 1);
rs = ps.executeQuery();
if (rs.next()) {
// 对应表中一行三列数据
int id = (int) rs.getObject(1);
String name = (String) rs.getObject(2);
Date date = (Date) rs.getObject(3); Order order = new Order(id, name, date);
System.out.println(order);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(conn, ps, rs);
}
}
}
Customer
package com.aff.bean; import java.sql.Date; //ORM编程思想 Object relational mapping
//一个数据表对应一个java类
//表中的一条记录对应java类的一个对象
//表中的一个字段对应java类的一个属性
//java.sql.Date -------------- Date sql类型
public class Customer {
private int id;
private String name;
private String email;
private Date birth;
public Customer() {
super();
// TODO Auto-generated constructor stub
}
public Customer(int id, String name, String email, Date birth) {
super();
this.id = id;
this.name = name;
this.email = email;
this.birth = birth;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
@Override
public String toString() {
return "Customer [id=" + id + ", name=" + name + ", email=" + email + ", birth=" + birth + "]";
} }
Order
package com.aff.bean;
import java.sql.Date;
public class Order {
private int orderId;
private String orderName;
private Date orderDate;
public Order() {
super();
}
public Order(int orderId, String orderName, Date orderDate) {
super();
this.orderId = orderId;
this.orderName = orderName;
this.orderDate = orderDate;
}
public int getOrderId() {
return orderId;
}
public void setOrderId(int orderId) {
this.orderId = orderId;
}
public String getOrderName() {
return orderName;
}
public void setOrderName(String orderName) {
this.orderName = orderName;
}
public Date getOrderDate() {
return orderDate;
}
public void setOrderDate(Date orderDate) {
this.orderDate = orderDate;
}
@Override
public String toString() {
return "Order [orderId=" + orderId + ", orderName=" + orderName + ", orderDate=" + orderDate + "]";
}
}
分别针对Customers表与Order表的通用查询操作的更多相关文章
- PreparedStatement实现针对不同表的通用查询操作
PreparedStatement实现针对不同表的通用查询操作:查询一样和多行 PreparedStatementQueryTest package com.aff.PreparedStatement ...
- 谈谈数据库中MyISAM与InnoDB区别 针对业务类型选择合适的表
MyISAM:这个是默认类型,它是基于传统的ISAM类型, ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法. ...
- SQL-49 针对库中的所有表生成select count(*)对应的SQL语句
题目描述 针对库中的所有表生成select count(*)对应的SQL语句CREATE TABLE `employees` (`emp_no` int(11) NOT NULL,`birth_dat ...
- [LeetCode] Customers Who Never Order 从未下单订购的顾客
Suppose that a website contains two tables, the Customers table and the Orders table. Write a SQL qu ...
- Hive:表1inner join表2结果group by优化
问题背景 最近遇到一个比较棘手的事情:hive sql优化: lib表(id,h,soj,noj,sp,np) --一个字典表 mitem表(md,mt,soj,noj,sp,np)- ...
- Day055--MySQL--外键的变种,表与表的关系,单表查询,多表查询, 内连接,左右连接,全外连接
表和表的关系 ---- 外键的变种 * 一对多或多对一 多对多 一对一 参考 https://www.cnblogs.com/majj/p/9169416.html 如何找出两张表之间的关系 分析步骤 ...
- [SQL]LeetCode183. 从不订购的客户 | Customers Who Never Order
Suppose that a website contains two tables, the Customers table and the Orders table. Write a SQL qu ...
- python mysql 单表查询 多表查询
一.外键 变种: 三种关系: 多对一 站在左表的角度: (1)一个员工 能不能在 多个部门? 不成立 (2)多个员工 能不能在 一个部门? 成立 只要有一个条件成立:多 对 一或者是1对多 如果两个条 ...
- SQL Server进阶(六)表表达式--派生表、公用表表达式(CTE)、视图和内联表值函数
概述 表表达式是一种命名的查询表达式,代表一个有效地关系表.可以像其他表一样,在数据处理中使用表表达式. SQL Server支持四种类型的表表达式:派生表,公用表表达式,视图和内联表值函数. 为什么 ...
随机推荐
- 多线程高并发编程(7) -- Future源码分析
一.概念 A Future计算的结果. 提供方法来检查计算是否完成,等待其完成,并检索计算结果. 结果只能在计算完成后使用方法get进行检索,如有必要,阻塞,直到准备就绪. 取消由cancel方法执行 ...
- socket编程之时间回射服务器
使用到的函数: // 返回值:读到的字节数,若已到文件尾,返回0:若出错,返回-1 ssize_t read(int fd, void *buf, size_t nbytes); // 返回值:若成功 ...
- 斜率dp A - Print Article HDU - 3507
A - Print Article HDU - 3507 今天刚刚学习了一下斜率dp,感觉还ok,主要就是要推这个斜率,然后利用数据结构来优化. 推荐两篇写的比较好的博客,https://www.cn ...
- spring表达式语言
使用文本表达式 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http: ...
- Spring杂谈 | 什么是ObjectFactory?什么是ObjectProvider?
在Spring的学习过程中,总是学的越多,不懂的越多.本来只是想将ApplicationContext的相关内容全部梳理一遍,结果发现涉及的东西越来越多,比如上篇文章中的ResolvableType, ...
- js获取对象属性的两种方法,object.属性名,[‘属性名’ ]
1.通过点的方式 2.通过括号的方式 例: <input type="text" value="hello" id="text"/&g ...
- python语法学习第七天--文件
打开文件:open() 使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法. open(file, mode='r', buffering=-1, encoding=None ...
- python 基础知识5-集合
1.集合set概念: 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 1.去重,把一个列表变成集合, ...
- python之导入模块的方法
一.导入标准库模块 1.第一种方式: 可以通过以下方法导入 import time 当使用时间模块的sleep方法时可以使用 time.sleep(2) 2.第二种方式: 当只想使用sleep函数时, ...
- java8 新特性Stream流的应用
作为一个合格的程序员,如何让代码更简洁明了,提升编码速度尼. 今天跟着我一起来学习下java 8 stream 流的应用吧. 废话不多说,直入正题. 考虑以下业务场景,有四个人员信息,我们需要根据性 ...