论坛首页 Java企业应用论坛

利用SPRING JDBC 和模板框架实现SQL可配置

浏览 13132 次
精华帖 (0) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-12-21   最后修改:2011-12-21
!!利用SPRING JDBC 和模板框架实现SQL可配置!

入参是Map<String,Object>, 查询返回结果List<Map>

实现功能:

1.主要实现查询功能和SQL可配置化:

2.配置信息可多数据源存储(XML,DATABASE,TXT),可热部署,

3.缓存控制与刷新;

4.物理分页

与MYBATIS比较功能单一了 ,

特点:配置信息可多数据源存储(XML,DATABASE,TXT),可热部署;

简单的添加Dialect 的实现类,进行配置就可实现不同数据库的物理分页;


见org.myframework.jdbc.MyBatis
/**
	 * 查询所有记录
	 * 
	 * @param mapperId
	 * @param map
	 * @return
	 * @throws Exception
	 */
	public List<Map<String, Object>> selectAllList(String sqlKey,
			Map<String, Object> map) {
		SqlMapper sqlMapper = sqlTemplate.getSqlMapper(sqlKey);
		String cacheKey = getCacheKey(sqlKey, map);
		if (sqlMapper == null) {
			throw new RuntimeException("load sqlconfig error :" + sqlKey);
		}
		if (sqlMapper.isFlushCache()) {
			dataCache.removeObject(cacheKey);
		}
		if (sqlMapper.isUseCache()) {
			if (dataCache.getObject(cacheKey) != null) {
				log.debug("load from cacheKey : " + cacheKey);
				return (List<Map<String, Object>>) dataCache
						.getObject(cacheKey);
			} else {
				log.debug("reload   cacheKey : " + cacheKey);
				List<Map<String, Object>> rs = this.queryForList(
						sqlTemplate.getSql(sqlKey, map), map);
				dataCache.putObject(cacheKey, rs);
				return rs;
			}
		} else {
			List<Map<String, Object>> rs = this.queryForList(
					sqlTemplate.getSql(sqlKey, map), map);
			return rs;
		}
	}




可加群203431569讨论
  • src.zip (147.6 KB)
  • 下载次数: 592
  • 大小: 67.4 KB
   发表时间:2011-12-22  
下了源码。还没看。
不过思路挺合适我的心水的。
0 请登录后投票
   发表时间:2011-12-22  
osacar 写道
下了源码。还没看。
不过思路挺合适我的心水的。


就是你和另外一位给的启发,不过功能比起Mybatis变得单一啦
0 请登录后投票
   发表时间:2011-12-22  
json20080301 写道
osacar 写道
下了源码。还没看。
不过思路挺合适我的心水的。


就是你和另外一位给的启发,不过功能比起Mybatis变得单一啦

不是吧?居然还有我的份?说实在的,我最近也在弄类似这样的功能。目的就是要把项目里的hibernate彻底去掉。我认为,功能其实并不需要太多,合适项目使用就可以了。没有最好的,只有最合适的。
0 请登录后投票
   发表时间:2011-12-22  
严重不建议使用Map作为参数的传入传出工具
0 请登录后投票
   发表时间:2011-12-22  
evanzzy 写道
严重不建议使用Map作为参数的传入传出工具

?? 有性能缺陷还是?

我这样做其实就把request里面的参数放到map中,作为查询条件传给要执行的SQL;我要实现的功能比较单一,
1.SQL可配置

2.只做查询,参数都是从request中提取到Map中,返回结果List<Map>即可,
List<Map>可转换化JSONArray ;
0 请登录后投票
   发表时间:2011-12-23  
对你这个表示兴趣,你能不能把你的思想描述的详细一点.
0 请登录后投票
   发表时间:2011-12-23  
json20080301 写道
evanzzy 写道
严重不建议使用Map作为参数的传入传出工具

?? 有性能缺陷还是?

我这样做其实就把request里面的参数放到map中,作为查询条件传给要执行的SQL;我要实现的功能比较单一,
1.SQL可配置

2.只做查询,参数都是从request中提取到Map中,返回结果List<Map>即可,
List<Map>可转换化JSONArray ;


弱类型降低了代码的可读性(语义不清晰)和维护性
0 请登录后投票
   发表时间:2011-12-23  
KimHo 写道
json20080301 写道
evanzzy 写道
严重不建议使用Map作为参数的传入传出工具

?? 有性能缺陷还是?

我这样做其实就把request里面的参数放到map中,作为查询条件传给要执行的SQL;我要实现的功能比较单一,
1.SQL可配置

2.只做查询,参数都是从request中提取到Map中,返回结果List<Map>即可,
List<Map>可转换化JSONArray ;


弱类型降低了代码的可读性(语义不清晰)和维护性

+1,在下深有体会,除非你为每一个交易配置一个文件标识Map中存放内容,并进行一定校验
0 请登录后投票
   发表时间:2011-12-23   最后修改:2011-12-23
当初也同楼主想法差不多,但没能实现ibatis的替换,就简单做了个DTO查询的实现,
代码比较粗糙难看。
异常处理,使用了自己封装的业务异常DataAccessFailureException,可根据需要自己修改。

public abstract class SimpleJDBCDao<T, PK extends Serializable> {

	@Autowired
	protected SimpleJdbcTemplate simpleJdbcTemplate;

	@Autowired
	protected JdbcTemplate jdbcTemplate;

	protected Class<T> entityClass;

	public SimpleJDBCDao() {
		this.entityClass = ReflectionUtils.getSuperClassGenricType(getClass());
	}


	public List<Map<String, Object>> getMapListBySql(final String mapListSql, final Object... args) {
		Assert.notNull(mapListSql, "查询Map集合语句不能为空");
		try {
			if (args == null || args.length < 1) {
				return simpleJdbcTemplate.queryForList(mapListSql);
			}
			return simpleJdbcTemplate.queryForList(mapListSql, args);
		} catch (DataAccessException e) {
			throw new DataAccessFailureException(DATA_ACCESS_EXCEPTION_CODE, e);
		}

	}

	public List<Map<String, Object>> getMapListBySqlMap(final String mapListSql, final Map<String, ?> args) {
		Assert.notNull(mapListSql, "查询Map集合语句不能为空");
		try {
			return simpleJdbcTemplate.queryForList(mapListSql, args);
		} catch (DataAccessException e) {
			throw new DataAccessFailureException(DATA_ACCESS_EXCEPTION_CODE, e);
		}
	}

	public List<Map<String, Object>> getMapListBySqlParam(final String mapListSql, final SqlParameterSource params) {
		Assert.hasText(mapListSql, "查询Map集合语句不能为空");
		try {
			return simpleJdbcTemplate.queryForList(mapListSql, params);
		} catch (DataAccessException e) {
			throw new DataAccessFailureException(DATA_ACCESS_EXCEPTION_CODE, e);
		}
	}

	public T get(final String oneSql, final Object... args) {
		Assert.hasText(oneSql, "查询单条记录语句不能为空");
		logger.debug("jdbc get: " + oneSql);
		try {
			return simpleJdbcTemplate.queryForObject(oneSql, getMapper(), args);
		} catch (DataAccessException e) {
			throw new DataAccessFailureException(DATA_ACCESS_EXCEPTION_CODE, e);
		}
	}

	public T getByMap(final String oneSql, final Map<String, ?> args) {
		Assert.hasText(oneSql, "查询单条记录语句不能为空");
		logger.debug("jdbc get: " + oneSql);
		try {
			return simpleJdbcTemplate.queryForObject(oneSql, getMapper(), args);
		} catch (DataAccessException e) {
			throw new DataAccessFailureException(DATA_ACCESS_EXCEPTION_CODE, e);
		}
	}

	public T getBySqlParam(final String oneSql, final SqlParameterSource params) {
		Assert.hasText(oneSql, "查询单条记录语句不能为空");
		logger.debug("jdbc get: " + oneSql);
		try {
			return simpleJdbcTemplate.queryForObject(oneSql, getMapper(), params);
		} catch (DataAccessException e) {
			throw new DataAccessFailureException(DATA_ACCESS_EXCEPTION_CODE, e);
		}
	}

	public List<T> getListBySql(final String listSql, final Object... args) {
		Assert.hasText(listSql, "查询集合语句不能为空");
		logger.debug("jdbc list: " + listSql);
		try {
			if (args == null || args.length < 1) {
				return simpleJdbcTemplate.query(listSql, getMapper());
			}
			return simpleJdbcTemplate.query(listSql, getMapper(), args);
		} catch (DataAccessException e) {
			throw new DataAccessFailureException(DATA_ACCESS_EXCEPTION_CODE, e);
		}
	}

	public List<T> getListBySqlMap(final String listSql, Map<String, ?> args) {
		Assert.hasText(listSql, "查询集合语句不能为空");
		try {
			return simpleJdbcTemplate.query(listSql, getMapper(), args);
		} catch (DataAccessException e) {
			throw new DataAccessFailureException(DATA_ACCESS_EXCEPTION_CODE, e);
		}
	}

	public List<T> getListBySqlParam(final String listSql, final SqlParameterSource params) {
		Assert.hasText(listSql, "查询集合语句不能为空");
		try {
			return simpleJdbcTemplate.query(listSql, getMapper(), params);
		} catch (DataAccessException e) {
			throw new DataAccessFailureException(DATA_ACCESS_EXCEPTION_CODE, e);
		}
	}

	public RowMapper<T> getMapper() {
		return (RowMapper<T>) ParameterizedBeanPropertyRowMapper.newInstance(entityClass);
	}
}

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics