通过反射获取泛型类型和枚举中指定的属性,进行sql语句的拼接

需求:通过反射获取泛型类型和枚举中指定的属性,进行sql语句的拼接
第一步:

  1. 获取泛型类型
    (1)Entity层
    在这里插入图片描述
    (2)在dao层的实现层里
    在这里插入图片描述
    2.在BaseDaoImpi设置泛型类型T:
    在这里插入图片描述
    3.传入entity实体:
    在这里插入图片描述
    在这里插入图片描述
    获取到的泛型类型:

在这里插入图片描述
第二步:
通过反射获取枚举中的内容:
Nano层中的内容:

在这里插入图片描述
Table中定义接收内容是表名:
在这里插入图片描述
Entity层中的内容:
User中的内容:
在这里插入图片描述
看一下返回的类型是什么:

getAnnotation()方法返回该元素的指定类型的注释,如果是这样的注释,否则返回null。
在这里插入图片描述
查看返回结果:
在这里插入图片描述
获取到所有的字段:
在这里插入图片描述
第三步:进行拼接
在这里插入图片描述
拿到了表名和id
这是对分页排序的sql语句

在这里插入图片描述

//Sql语句拼接:
public T selectBeanById(int id) {
    
    
		//声明
		// conn  st  rs
		Connection conn = null;
		Statement st = null;
		ResultSet rs = null;
		T object = null;
		
		StringBuilder sql=new StringBuilder("select ");
		Field[] fields=entityClass.getDeclaredFields();
		String idname=null;
		for (Field field : fields) {
    
    
			field.setAccessible(true);
			Column column=field.getAnnotation(Column.class);
			
			sql.append(column.name()).append(" , ");
			
			if (field.getAnnotation(ID.class)!=null) {
    
    
				//如果id注解不为空
				idname=column.name();
			}
		}
		//去掉最后一个逗号
		sql.deleteCharAt(sql.length() - 2);
		//获取表名
		String tableName = entityClass.getAnnotation(Table.class).name();
		sql.append(" from ").append(tableName).append(" where ").append(idname).append(" = ").append(id);
		
		System.out.println(sql.toString());
		try {
    
    
			// 获取连接
				conn = jdbcUtil.getConnection();
			//执行语句
				st = conn.createStatement();
				rs = st.executeQuery(sql.toString());
			// rs 拿出查找到的数据
				if (rs.next()) {
    
    
					//true 有数据
					// 通过反射,创建一个对象
					object = entityClass.newInstance();
					// 每一个字段的数据放入对应的 属性中
//					object.setName(rs.getString("name"));
					for (Field field : fields) {
    
    
						field.setAccessible(true);
						Column column = field.getAnnotation(Column.class);
						if (column != null) {
    
    
							field.set(object, rs.getObject(column.name()));
						}
					}
				}
			
			} catch (SQLException e) {
    
    
				e.printStackTrace();
			} catch (InstantiationException e) {
    
    
				e.printStackTrace();
			} catch (IllegalAccessException e) {
    
    
				e.printStackTrace();
			}finally {
    
    
				jdbcUtil.close(conn, st, rs);
			}

			return object;
	}

猜你喜欢

转载自blog.csdn.net/qq_14930709/article/details/104666644
今日推荐