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. ASP.NET Core的配置信息

    ASP.NET Core的配置信息 Key-Value键值对 内存里.JSON.XML.INI等文件 配置信息与配置系统是解耦的 可以依赖注入 ASP.NET Core的配置信息来源 appsetti ...

  2. 数据结构--队列(Java实现)

    数据结构--队列(Java实现) 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 简介 队列是一种特殊的线性表,特殊之处在于它只 ...

  3. E. Height All the Same

    E. Height All the Same 题目大意: 给你一个n*m 的矩阵,让你在里面填数字代表这个位置的高度,数字的范围是[L,R],有两种操作,第一种就是给一位置的高度加2,第二种就是给两个 ...

  4. Listener:监听器

    目录 Listener概述 ServletContextListener Listener概述 web的三大组件之一 Servlet.Filter.Listener 事件监听机制 事件:一件事情 事件 ...

  5. Spring 框架介绍 [Spring 优点][Spring 应用领域][体系结构][目录结构][基础 jar 包]

    您的"关注"和"点赞",是信任,是认可,是支持,是动力...... 如意见相佐,可留言. 本人必将竭尽全力试图做到准确和全面,终其一生进行修改补充更新. 目录 ...

  6. Kafka的参数调优

    这篇文章主要说一下在生产过程中的kafka常用的调优参数, 首先kafka的版本是0.9.0.1,针对以下几个方面来说, 针对kafka的堆内存: 针对kafka的集群调优: kafka的的消息机制有 ...

  7. train loss与test loss结果分析/loss不下降

    train loss与test loss结果分析 train loss 不断下降,test loss不断下降,说明网络仍在学习; train loss 不断下降,test loss趋于不变,说明网络过 ...

  8. 在微服务框架Demo.MicroServer中添加SkyWalking+SkyApm-dotnet分布式链路追踪系统

    1.APM工具的选取 Apm监测工具很多,这里选用网上比较火的一款Skywalking. Skywalking是一个应用性能监控(APM)系统,Skywalking分为服务端Oap.管理界面UI.以及 ...

  9. python --内建结构 汉诺塔结构

    规则: 1.每次移动一个盘子 2.任何时候大盘子在下面,小盘子在上面 方法: 1.n=1:直接将A上的盘子移动到c 上面,A->C 2.n=2: 1>A->B 2>A-> ...

  10. input输入框直接拉起九宫格数字键盘

    <input type="number" pattern="\d*">