java执行SQL语句实现查询的通用方法

1 篇文章 0 订阅

完成SQL查询  并将查询结果放入Vector容器,以便其他程序使用

/*
	 * 执行sql查询语句
	 */
	public static <T> Vector<T> executeQuery(Class<T> clazz, String sql, Object... args) {
		Connection conn = null;
		PreparedStatement preparedstatement = null;
		ResultSet rs = null;
		Vector<T> vecRs = new Vector<T>();
		T obj = null;
		try {
			conn = JDBCTools.getConnection();
			preparedstatement = conn.prepareStatement(sql);
			// 通过sql语句来判断选择了那些列
			for (int i = 0; i < args.length; i++) {
				preparedstatement.setObject(i + 1, args[i]);
			}
			// 利用sql查询获取结果集
			// 利用反射创建实体类的对象
			// 获取结果街的别名Stud_id 获取JDBC的元数据
			// 获取结果集每一列的值,结合上一步得到一个Map键值对
			// 键:列的别名 值:列的值
			// 在利用反射对实体类对象的属性赋值
			// 属性为Map的键 值为Map的值
			rs = preparedstatement.executeQuery();
			// 获取元数据
			ResultSetMetaData rsmd = rs.getMetaData();
			Map<String, Object> mapMetaData = new HashMap<String, Object>();
			// 打印一列的列名

			while (rs.next()) {
				//获取数据表中满足要求的一行数据,并放入Map中
				for (int i = 0; i < rsmd.getColumnCount(); i++) {
					String columnLabel = rsmd.getColumnLabel(i + 1);
					Object columnValue = rs.getObject(columnLabel);
					// System.out.println(columnLabel);
					mapMetaData.put(columnLabel, columnValue);
				}
				//将Map中的数据通过反射初始化T类型对象
				if (mapMetaData.size() > 0) {
					
					obj = clazz.newInstance();
					for (Map.Entry<String, Object> entry : mapMetaData.entrySet()) {
						String fieldkey = entry.getKey();
						Object fieldvalue = entry.getValue();
						// System.out.println(fieldkey + ":" + fieldvalue);
						ReflectionUtils.setFieldValue(obj, fieldkey, fieldvalue);
						//通过反射赋值
					}
				}
				//将对象装入Vector容器
				vecRs.add(obj);
			}

		} catch (Exception e) {
			e.printStackTrace();
		}

		return vecRs;
	}

其中使用到的工具类方法

获取数据库连接JDBCTools.getConnection()

/*
	 * 获取数据库的连接
	 */
	public static Connection getConnection() throws Exception {
		Connection conn = null;

		String driver = null;
		String jdbcUrl = null;
		String username = null;
		String password = null;
		// 获取Properties对象
		Properties properties = new Properties();
		InputStream in = JDBCTools.class.getClassLoader().getResourceAsStream("jdbc.properties");
		properties.load(in);

		driver = properties.getProperty("driver");
		jdbcUrl = properties.getProperty("jdbcUrl");
		username = properties.getProperty("user");
		password = properties.getProperty("password");

		Class.forName(driver);
		conn = DriverManager.getConnection(jdbcUrl, username, password);

		return conn;
	}

ReflectionUtils.setFieldValue(obj, fieldkey, fieldvalue);

将obj对象的fieldkey属性赋值为fieldvalue

//设置对象的属性
	public static void setFieldValue(Object obj,String fieldName,Object value){
		Field field=getDeclaredField(obj, fieldName);
		if(field==null){
			throw new IllegalArgumentException("Could not find field["+
		fieldName+"] on target ["+obj+"]");
		}
		
		makeAccessiable(field);
		try{
			field.set(obj, value);
		}catch(IllegalAccessException e){
			System.out.println("不可能抛出的异常");
		}
		
	}
	
	//判断field的修饰符是否是public,并据此改变field的访问权限
	public static void makeAccessiable(Field field){
		if(!Modifier.isPublic(field.getModifiers())){
			field.setAccessible(true);
		}
	}
	
	//获取field属性,属性有可能在父类中继承
	public static Field getDeclaredField(Object obj,String fieldName){
		for(Class<?> clazz=obj.getClass(); clazz!=Object.class; clazz=clazz.getSuperclass()){
			try{
				return clazz.getDeclaredField(fieldName);
			}catch(Exception e){
				
			}
		}
		return null;
	}













  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OOP(机试)[具体要求在压缩文档中给出] 项目名称: Air Infomation System 基于控制台的航班信息系统,简称AIS 具体要求如下: (1)显示航班信息系统主菜单,如图-1所示,包括: 1)列出所有航班 2)按起飞时间查询 3)按目的地查询 4)删除航班 5)更新航班 6)退出系统 (2)列出所有航班:查出所有航班的信息,以列表形式显示,包括:编号,航班号,目的地,起飞日期。 (3)按起飞时间查询:输入起飞时间(格式如2011-2-25),查出所有这一天的航班。 (4)按目的地查询:输入目的地,查出所有飞往此地的航班。 (5)删除航班:删除指定编号的航班。 (6)更新航班:更新指定编号的航班。 (7)退出系统。 三、类的设计 需要定义如下类 航班信息实体类(AirInfo) 航班编号(id) 航班号(flight_number) 目的地(destination) 起飞日期(flight_date) 航班信息管理类AirInfoManager类 程序入口类TestAirInfo类 四、具体要求及推荐实现步骤 6.创建实体类AirInfo,属性私有化,根据业务提供需要的构造方法和setter/getter方法。 7.创建航班管理AirInfoManager类,在类中提供列出所有航班的方法,按起飞时间查询方法、按目的地查询方法、删除航班的方法、更新航班的方法、退出系统的方法。 8.创建TestAirInfo类,启动和运行系统。 9.航班的信息用ArrayList(或数组)保存。 10.要求代码规范,命名正确。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值