zoukankan      html  css  js  c++  java
  • PreparedStatementQueryTest.java

    package com.atguigu3.preparedstatement.crud;
    
    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 java.util.List;
    
    import org.junit.Test;
    
    import com.atguigu3.bean.Customer;
    import com.atguigu3.bean.Order;
    import com.atguigu3.util.JDBCUtils;
    
    /**
     * 
     * @Description 使用PreparedStatement实现针对于不同表的通用的查询操作
     * @author shkstart Email:shkstart@126.com
     * @version
     * @date 上午11:32:55
     *
     */
    public class PreparedStatementQueryTest {
    	
    	@Test
    	public void testGetForList(){
    		
    		String sql = "select id,name,email from customers where id < ?";
    		List<Customer> list = getForList(Customer.class,sql,12);
    		list.forEach(System.out::println);
    		
    		String sql1 = "select order_id orderId,order_name orderName from `order`";
    		List<Order> orderList = getForList(Order.class, sql1);
    		orderList.forEach(System.out::println);
    	}
    	
    	public <T> List<T> getForList(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
    			ResultSetMetaData rsmd = rs.getMetaData();
    			// 通过ResultSetMetaData获取结果集中的列数
    			int columnCount = rsmd.getColumnCount();
    			//创建集合对象
    			ArrayList<T> list = new ArrayList<T>();
    			while (rs.next()) {
    				T t = clazz.newInstance();
    				// 处理结果集一行数据中的每一个列:给t对象指定的属性赋值
    				for (int i = 0; i < columnCount; i++) {
    					// 获取列值
    					Object columValue = rs.getObject(i + 1);
    
    					// 获取每个列的列名
    					// String columnName = rsmd.getColumnName(i + 1);
    					String columnLabel = rsmd.getColumnLabel(i + 1);
    
    					// 给t对象指定的columnName属性,赋值为columValue:通过反射
    					Field field = clazz.getDeclaredField(columnLabel);
    					field.setAccessible(true);
    					field.set(t, columValue);
    				}
    				list.add(t);
    			}
    			
    			return list;
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			JDBCUtils.closeResource(conn, ps, rs);
    
    		}
    
    		return null;
    	}
    	
    	@Test
    	public void testGetInstance(){
    		String sql = "select id,name,email from customers where id = ?";
    		Customer customer = getInstance(Customer.class,sql,12);
    		System.out.println(customer);
    		
    		String sql1 = "select order_id orderId,order_name orderName from `order` where order_id = ?";
    		Order order = getInstance(Order.class, sql1, 1);
    		System.out.println(order);
    	}
    	/**
    	 * 
    	 * @Description 针对于不同的表的通用的查询操作,返回表中的一条记录
    	 * @author shkstart
    	 * @date 上午11:42:23
    	 * @param clazz
    	 * @param sql
    	 * @param args
    	 * @return
    	 */
    	public <T> T getInstance(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
    			ResultSetMetaData rsmd = rs.getMetaData();
    			// 通过ResultSetMetaData获取结果集中的列数
    			int columnCount = rsmd.getColumnCount();
    
    			if (rs.next()) {
    				T t = clazz.newInstance();
    				// 处理结果集一行数据中的每一个列
    				for (int i = 0; i < columnCount; i++) {
    					// 获取列值
    					Object columValue = rs.getObject(i + 1);
    
    					// 获取每个列的列名
    					// String columnName = rsmd.getColumnName(i + 1);
    					String columnLabel = rsmd.getColumnLabel(i + 1);
    
    					// 给t对象指定的columnName属性,赋值为columValue:通过反射
    					Field field = clazz.getDeclaredField(columnLabel);
    					field.setAccessible(true);
    					field.set(t, columValue);
    				}
    				return t;
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			JDBCUtils.closeResource(conn, ps, rs);
    
    		}
    
    		return null;
    	}
    
    }
    
  • 相关阅读:
    【转载】 NumPy之:数据类型对象dtype
    在深度学习的视觉VISION领域数据预处理的魔法常数magic constant、黄金数值的复现: mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225]
    关于Numpy数据类型对象(dtype)使用详解
    【转载】 大端模式和小端模式的区别是什么?
    在使用pytorch官方给出的torchvision中的预训练模型参数时为保证收敛性要求使用原始的数据预处理方式
    【转载】 解决 sudo echo x > 时的 Permission denied错误
    Javascript高级程序设计第二版前三章基本数据等笔记
    冒号课堂§3.4:事件驱动
    理解 JavaScript 闭包
    Browser clientX scrollLeft clientLeft
  • 原文地址:https://www.cnblogs.com/fenxiangyuan/p/14695231.html
Copyright © 2011-2022 走看看