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表的通用查询操作的更多相关文章

  1. PreparedStatement实现针对不同表的通用查询操作

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

  2. 谈谈数据库中MyISAM与InnoDB区别 针对业务类型选择合适的表

    MyISAM:这个是默认类型,它是基于传统的ISAM类型, ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法. ...

  3. SQL-49 针对库中的所有表生成select count(*)对应的SQL语句

    题目描述 针对库中的所有表生成select count(*)对应的SQL语句CREATE TABLE `employees` (`emp_no` int(11) NOT NULL,`birth_dat ...

  4. [LeetCode] Customers Who Never Order 从未下单订购的顾客

    Suppose that a website contains two tables, the Customers table and the Orders table. Write a SQL qu ...

  5. Hive:表1inner join表2结果group by优化

    问题背景 最近遇到一个比较棘手的事情:hive sql优化: lib表(id,h,soj,noj,sp,np)         --一个字典表 mitem表(md,mt,soj,noj,sp,np)- ...

  6. Day055--MySQL--外键的变种,表与表的关系,单表查询,多表查询, 内连接,左右连接,全外连接

    表和表的关系 ---- 外键的变种 * 一对多或多对一 多对多 一对一 参考 https://www.cnblogs.com/majj/p/9169416.html 如何找出两张表之间的关系 分析步骤 ...

  7. [SQL]LeetCode183. 从不订购的客户 | Customers Who Never Order

    Suppose that a website contains two tables, the Customers table and the Orders table. Write a SQL qu ...

  8. python mysql 单表查询 多表查询

    一.外键 变种: 三种关系: 多对一 站在左表的角度: (1)一个员工 能不能在 多个部门? 不成立 (2)多个员工 能不能在 一个部门? 成立 只要有一个条件成立:多 对 一或者是1对多 如果两个条 ...

  9. SQL Server进阶(六)表表达式--派生表、公用表表达式(CTE)、视图和内联表值函数

    概述 表表达式是一种命名的查询表达式,代表一个有效地关系表.可以像其他表一样,在数据处理中使用表表达式. SQL Server支持四种类型的表表达式:派生表,公用表表达式,视图和内联表值函数. 为什么 ...

随机推荐

  1. RF(用例执行方法)

    一.执行 RF 脚本方法 1.执行整个项目下的所有用例 dos 窗口下输入 robot + 项目绝对路径 2.执行单个 Suite 中的所有用例 dos 窗口下输入 robot + 用例套件绝对路径 ...

  2. OSG程序设计之osg::Group

    以下是一个简单的模型读取程序: #include <osgDB/ReadFile> #include <osgViewer/Viewer> #include <osg/N ...

  3. java1.8新特性之stream

    什么是Stream? Stream字面意思是流,在java中是指一个来自数据源的元素队列并支持聚合操作,存在于java.util包中,又或者说是能应用在一组元素上一次执行的操作序列.(stream是一 ...

  4. Linux dts 设备树详解(二) 动手编写设备树dts

    Linux dts 设备树详解(一) 基础知识 Linux dts 设备树详解(二) 动手编写设备树dts 文章目录 前言 硬件结构 设备树dts文件 前言 在简单了解概念之后,我们可以开始尝试写一个 ...

  5. FPGA六位共阳极数码管动态显示

    `timescale 1ns/1ps module adc_dis( clk , rst_n , sm_seg , sm_bit ); input clk;//50HZ input rst_n; :] ...

  6. 关于日常操作中sql的性能

    最近接手了一个项目.使用的数据库是sql server,但是遇到一些关于日期的查询的时候,查询结果非常慢.看了下别人的sql //sql = sql + " and CONVERT(nvar ...

  7. Mysql 常用函数(13)- right 函数

    Mysql常用函数的汇总,可看下面系列文章 https://www.cnblogs.com/poloyy/category/1765164.html right 的作用 返回字符串 str 中最右边的 ...

  8. mybatis 插入数据返回ID

    hibernate中插入数据后会返回插入的数据的ID,mybatis要使用此功能需要在配置文件中显示声明两个属性即可:

  9. 利用python在微信群中签到、抢沙发(适用于任何账号)

    利用python在微信群中签到.抢沙发 注意 程序仅能在电脑上运行,运行时需要保证群界面在最前端且不被移动. 背景 我是一名高中生(2020年),疫情期间,在家上网课,有的老师让我们在班群里签到. 其 ...

  10. java 版本比较

    public class version { public static int compareVersion(String version1, String version2) throws Exc ...