一个简单的数据库查询自动封装工具

stevenkang 发布于 2014/03/24 14:11
阅读 890
收藏 3

原理是根据事先约定好的规则来进行自动封装,零配置、零注解、零依赖,不知道这是否是“约定优于配置”。

下面这里是测试代码,getObject()的第一个参数为bean对象,1为对象id,这里测试就直接getObject()从数据库中查询id为1的wx_test数据

数据库和bean对象,查询的时候wx_test表自动转为WxTest对象。



//测试阶段,这里就直接写成的静态代码,稍后改进。
	public static Object getObject(Class clazz, Integer id) {
		//获取clazz的类名称,根据事先约定好的规则转换成表名称
		String simpleName = clazz.getSimpleName();
		String mapping = getMapping(simpleName);
		System.out.println(String.format("simpleName: %s, mapping: %s", simpleName, mapping));
		
		//通过转换后的表名称进行数据查询,这里的Session是自己封装的JDBC,查询结果为List<Map<String, Object>>集合
		String autoSql = String.format("select * from %s where id = %d", mapping, id);
		Session session = SessionFactory.getSessionFactory().buildShortSession();
		List<Map<String, Object>> datas = session.executeQuery(autoSql);
		
		//调用封装函数,返回查询后的对象
		List<?> objs = pack(datas, clazz);
		Object obj = null;
		if (objs.size() > 0) {
			obj = objs.get(0);
		} else {
			try {
				obj = clazz.newInstance();
			} catch (Exception e) {
				e.printStackTrace();
				obj = null;
			}
		}
		return obj;
	}
	
	//数据集合转换为对象集合
	public static List<?> pack(List<Map<String, Object>> datas, Class clazz) {
		try {
			//获取clazz的所有方法,如果是set开头的方法,则表名是设置数据的方法
			Method[] methods = clazz.getMethods();
			List<Object> objs = new ArrayList<Object>();
			for (Map<String, Object> data : datas) {
				Object obj = clazz.newInstance();
				for (Method method : methods) {
					if (method.getName().indexOf("set") == 0) {
						//截取set后面的名字,根据约定的规则获取数据库中的字段名字,然后从数据集中取出来set到bean对象中
						String field = method.getName().substring("set".length());
						String mapping = getMapping(field);
						method.invoke(obj, data.get(mapping));
					}
				}
				objs.add(obj);
			}
			return objs;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	//约定的规则
	//WxTest会被转换为wx_test,大写字母会被转换为小写字母并在前面带上下划线
	//例如一个用户表名字为db_user,里面的字段有username、password、register_time
	//   则bean对象的名字应为DbUser,属性有username、password、registerTime;
	public static String getMapping(String s) {
		try {
			String ss = s.replaceAll("[A-Z]", "_$0");
			ss = ss.substring(1);
			return ss.toLowerCase();
		} catch (Exception e) {
			e.printStackTrace();
			return s;
		}
	}




加载中
返回顶部
顶部