基于反射实现自动化restful开发

[Author]: kwu

基于反射实现自动化restful开发,通用的只需要写查询数据库的sql,并加入对应的javabean实现的快速restful服务的开发。

1、编写数据库的查询sql,对应sql.properties

daily = DailyReport;select t.day,t.cnt,t.type from (select day,cnt,type From dailyreport where type=? order by day desc limit ? ) t order by t.day;String,Integer

SQL的属性文件,以";"分隔。说明:

1)pv为该SQL的标签。

2)第一个参数为,DailyReport为对应的JavaBean的类名

3)第二个参数为查询的SQL,参数以 "?" 占位符

4)第三个参数为 参数的类型,以"," 分隔

2、编写对应的pojo类

import com.hexun.bean.base.ChartsData;

public class DailyReport implements ChartsData {
	private String day, type;
	private Integer cnt;

	public String getDay() {
		return day;
	}

	public void setDay(String day) {
		this.day = day;
	}

	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}

	public Integer getCnt() {
		return cnt;
	}

	public void setCnt(Integer cnt) {
		this.cnt = cnt;
	}
}

3、启动restful服务访问

http://localhost:9088/restful?tag=pv&args=3

<img src="http://img.blog.csdn.net/20150709152633218?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

附反射DAO实现:

package com.hexun.dao;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.hexun.bean.base.AttrData;
import com.hexun.bean.base.ChartsData;
import com.hexun.utils.DbUtil;
import com.hexun.utils.GetSqlStatement;

@SuppressWarnings("rawtypes")
public class ChartDao {
	private static DbUtil dbUtil = new DbUtil();

	public static List<ChartsData> getRestData(String tag, String[] args) throws Exception {
		Connection con = dbUtil.getCon();
		String content = GetSqlStatement.getSql(tag);

		if(content==null){
			return new ArrayList<ChartsData>();
		}

		String splited[] = content.split(";");

		String className = splited[0];
		String sql = splited[1];

		Class clazz = Class.forName("com.hexun.bean." + className);

		List<AttrData> listAttr = getClassAttrs(clazz);

		PreparedStatement pstmt = con.prepareStatement(sql);

		if (splited.length == 3) {
			String type = splited[2];
			int idx = 1;
			String[] types = type.split(",");
			for (int i = 0; i < types.length; i++) {
				if (types[i].trim().equalsIgnoreCase("String")) {
					pstmt.setString(idx, args[i]);
				}
				if (types[i].trim().equalsIgnoreCase("Integer")) {
					String tmp = args[i];
					int intVal = Integer.parseInt(tmp);
					pstmt.setInt(idx, intVal);
				}
				idx++;
			}
		}

		ResultSet rs = pstmt.executeQuery();
		List<ChartsData> listData = new ArrayList<ChartsData>();

		while (rs.next()) {
			ChartsData bean = (ChartsData) clazz.newInstance();
			for (AttrData attribute : listAttr) {
				Field f1 = clazz.getDeclaredField(attribute.getName());
				String attrType = attribute.getType();

				if ("class java.lang.Integer".equals(attrType)) {
					Integer val = rs.getInt(attribute.getName());
					f1.setAccessible(true);
					f1.set(bean, val);
				} else {
					String val = rs.getString(attribute.getName());
					f1.setAccessible(true);
					f1.set(bean, val);
				}

			}
			listData.add(bean);
		}

		dbUtil.close(rs, pstmt, con);

		return listData;
	}

	/**
	 * 获取类的属性集合
	 *
	 * @param listAttr
	 * @param clazz
	 */
	private static List<AttrData> getClassAttrs(Class clazz) {
		List<AttrData> listAttr = new ArrayList<AttrData>();
		Field[] fieldlist = clazz.getDeclaredFields();
		for (int i = 0; i < fieldlist.length; i++) {
			AttrData data = new AttrData();
			Field fld = fieldlist[i];

			String type = fld.getType().toString();
			String name = fld.getName();
			data.setName(name);
			data.setType(type);

			listAttr.add(data);
		}
		System.out.println(listAttr);
		return listAttr;
	}

	/**
	 * Rest数据转换成list
	 *
	 * @param restData
	 * @return
	 * @throws ClassNotFoundException
	 */
	public static Map<String, List> getRestDataForList(List<ChartsData> restData, String tag) throws Exception {
		Map<String, List> map = new HashMap<String, List>();
		String content = GetSqlStatement.getSql(tag);
		String splited[] = content.split(";");
		String className = splited[0];

		Class clazz = Class.forName("com.hexun.bean." + className);
		List<AttrData> listAttr = getClassAttrs(clazz);

		for (AttrData attribute : listAttr) {

			String attrType = attribute.getType();

			if ("class java.lang.Integer".equals(attrType)) {
				List<Integer> listData = new ArrayList<Integer>();
				for (ChartsData data : restData) {
					Field f1 = clazz.getDeclaredField(attribute.getName());
					f1.setAccessible(true);
					Object object = f1.get(data);
					listData.add((object == null) ? 0 : Integer.parseInt(object.toString()));

				}
				map.put(attribute.getName(), listData);
			} else {
				List<String> listData = new ArrayList<String>();

				for (ChartsData data : restData) {
					Field f1 = clazz.getDeclaredField(attribute.getName());
					f1.setAccessible(true);
					Object object = f1.get(data);
					listData.add((object == null) ? "" : object.toString());
				}
				map.put(attribute.getName(), listData);
			}

		}

		return map;
	}

	public static void main(String[] args) throws Exception {
		List<ChartsData> restData = ChartDao.getRestData("newsclick", new String[] { "hour_trend", "15" });
		System.out.println(restData);

		// Map<String, List> restDataForList =
		// ChartDao.getRestDataForList(restData, "daily");
		// System.out.println(restDataForList);
	}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-06 23:16:05

基于反射实现自动化restful开发的相关文章

基于Appium的自动化case开发及case分层结构设计

基于Appium的自动化case开发及case分层结构设计 首先为每条case创建一个公共的基类AppiumTestBase,内含setup和teardown两个方法,以后每条case继承该基类即可.代码如下: public class AppiumTestBase { public WebDriverWait webwait; private AndroidDriver driver; @Before public void setUp() throws Exception { File cl

基于反射实现自己主动化restful开发

[Author]: kwu 基于反射实现自己主动化restful开发,通用的仅仅须要写查询数据库的sql.并增加相应的javabean实现的高速restful服务的开发. 1.编写数据库的查询sql.相应sql.properties daily = DailyReport;select t.day,t.cnt,t.type from (select day,cnt,type From dailyreport where type=? order by day desc limit ? ) t o

《软件测试自动化之道》- 基于反射的UI自动化测试框架 - UI Automation Test Framework

测试自动化程序的任务 基于反射的ui测试自动化程序,要完成的6项任务: 通过某种方式从测试套件程序中运行待测程序(AUT: Applicaton Under Test),以便于两个程序之间进行通信 操纵应用程序的窗体,从而模拟用户对窗体所实施的moving和resizing操作 检查应用程序窗体,确定应用程序的状态是否准确 操纵应用程序控件的属性,从而模拟用户的一些操作,比如模拟在一个TextBox控件里输入字符 检查应用程序控件的属性,确定应用程序的状态是否准确 调用应用程序的方法,从而模拟一

《软件测试自动化之道》读书笔记 之 基于反射的UI测试

<软件测试自动化之道>读书笔记 之 基于反射的UI测试 2014-09-24 测试自动化程序的任务待测程序测试程序  启动待测程序  设置窗体的属性  获取窗体的属性  设置控件的属性  获取控件的属性  方法调用  待测程序代码 测试自动化程序的任务 返回 基于反射的ui测试自动化程序,要完成的6项任务: 通过某种方式从测试套件程序中运行待测程序(AUT: Applicaton Under Test),以便于两个程序之间进行通信 操纵应用程序的窗体,从而模拟用户对窗体所实施的moving和r

Java基于ssm框架的restful应用开发

Java基于ssm框架的restful应用开发 好几年都没写过java的应用了,这里记录下使用java ssm框架.jwt如何进行rest应用开发,文中会涉及到全局异常拦截处理.jwt校验.token拦截器等内容. 1.jwt工具类 直接贴代码了,主要包括jwt的sign.verify.decode三个方法,具体实现如下: package com.isoft.util; import java.util.Date; import com.auth0.jwt.JWT; import com.aut

基于Spring4的全注解实现Restful开发

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">[Author]: kwu</span> 全注解实现Spring Restful开发,restful提供了快速的交互形式,以json的为数据传递的格式. 1.Restful控制类实现 package com.hexun.restful; import org.springfr

基于反射和泛型的编程

基于反射和泛型的编程,泛型是容器话的思路统过泛型对象或泛型方法,管理实际 要操作的对象,以实现对于实际对象管理的一种编程. 比如导出excel生成报表这种在平台开发中及其普遍的需求,有多个对象有生成报表 的需求如每个对象编写生成excel逻辑,程序会变得异常复杂,重复逻辑众多,通过将导 出excel逻辑泛型化,需要生成excel的bean本身不需要做任何变化,就可以按照需求生 成对应报表,这是一种很优雅很方便的报表生成方式.

基于AppDomain的&quot;插件式&quot;开发

很多时候,我们都想使用(开发)USB式(热插拔)的应用,例如,开发一个WinForm应用,并且这个WinForm应用能允许开发人员定制扩展插件,又例如,我们可能维护着一个WinService管理系统,这个WinService系统管理的形形色色各种各样的服务,这些服务也是各个"插件式"的类库,例如: public interface IJob { void Run(DateTime time); } public class CollectUserInfo : IJob { public

基于gulp的前端框架开发规范

前端开发及相关规范 - 基于gulp的前端框架开发规范 1.前端开发工具的安装和使用说明 前端开发工具的目录结构 htmlcodeBuilder - v0.9 ├── statics ├── html //静态文件开发 ├── js // 非require引入的js文件 ├── Lib // 第三方JS包 ├── ve_2_1 // ├── css // 样式目录 ├── fonts // bootstrap的图标字体 ├── img // 图片目录 ├── less // less源码 ├──