JDBC 实现 一个通用的查询方法~

本文介绍了一种使用Java反射机制和泛型进行数据库查询的方法。该方法通过获取数据库连接、预编译SQL语句并设置参数值来执行查询。接着通过处理结果集,将查询结果映射到指定Java类的实例中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

条件~必须要有一个类 对应着数据库的表 数据库查询语句的必须取跟对应类的下的变量名一样的别名

1.利用泛型的方法获得类加载器

2.利用泛型返回所查询的对象值

3.方法的参数为数据库表所对应的类加载器,要执行的sql语句,PreparedStatement所对应的占位符的值,这里用可变形参传递

4.实现步骤

    1》获取数据库链接对象

    2》从数据库链接对象获取PreparedStatment对象(用于发送sql语句)(Connection下的 prepareStatement(sql)方法)    1.通过将可变形参设置到占位符上去

            通过setObject(int index )设置上去

            此方法会先通过 instance of判断 object具体是哪个类型然后去发送数据

    3》获得ResultSet对象(PreparedStatement下的 excuteQuary())

    4》从ResultSet下的对象获取ResultSetMetadata(数据源)对象(getMetadata())

    5》通过ResultSetMetadata的 getColumnCount()可知道当前查询了多少列,通过getColumnName(int index)可返回   当前列的别名

      6》新建一个map<String(别名),Object(别名所对应的那列的数据)>

       7》通过第五的两个方法用循环可实现从第一列到最后一列获取列的别名,然后在通过 Result下的 getObject(int index)方法可获    取对应列下的值 。然后将 键:对应的别名  值:别名对应的值 put到map中去。

        8》如果map中有值得话则通过第一个形参的类加载器的 newInstance()创建一个对象 没有的话返回null;

         9》遍历map键值对 通过反射的方式将值设置到第八步所创建的对象中去。(在反射机制那章我们学到 如果有了运行时类对象,有了属性名称,是可以获得对应属性的值,和设置对应数据的值得)

        代码:

            

	private static <T> T get(Class<T> class1,String sql,Object ... args) {
		// TODO Auto-generated method stub
				T object=null;
				Connection connection=null;
				PreparedStatement preparedStatement=null;
				ResultSet resultSet=null;
				ResultSetMetaData resultSetMetaData=null;
				try {
					//1.获取数据库链接对象
					connection=JdbcUtil.getConnection();
					//2.获取preparedStatement对象。
						//1>获取
						preparedStatement=(PreparedStatement) connection.prepareStatement(sql);
						//2>给占位符传值
						for(int i=0;i<args.length;i++) {
							preparedStatement.setObject(i+1, args[i]);
						}
					//1.得到ResultSet对象
					resultSet=preparedStatement.executeQuery();
					//2.得到ResultSetMetaData对象
					resultSetMetaData = (ResultSetMetaData) resultSet.getMetaData();
					//3.创建一个Map<String,Object>对象 键=列别名,值:列的值。
					Map <String,Object> map=new HashMap<>();
					//4.处理结果集
					if(resultSet.next()) {
						for(int i=0;i<resultSetMetaData.getColumnCount();i++) {
							String columnname=resultSetMetaData.getColumnLabel(i+1);
							Object  obj=resultSet.getObject(i+1);
							map.put(columnname, obj);
						}
					}
					//5.遍历map利用反射给Class对象赋值
					if(map.size()>0) {
						object=class1.newInstance();
						for(Map.Entry<String,Object> entry:map.entrySet()) {
							String fieldName=entry.getKey();
							Object value=entry.getValue();
							ReflectionUtils.setFieldValue(object, fieldName, value);//通过反射的方法设置值这是自己创建的类
						}
					}
				} catch (Exception e) {
					// TODO: handle exception
				}finally {
					
					JdbcUtil.release(connection, preparedStatement, resultSet);
					return object;
				}
				
	}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值