如果我们的数据库中的数据是以键值对key-value的形式保存在表中的话(注意表字段名称不能定义成key,与关键字重名),我们可以定义一个vo类,直接获取表中的value。
假设数据库表结构:
id | value |
default.welcome_info.key | 欢迎光临! |
time.interval.key | 500 |
VO类:
package com.jzz.dbutils.vo;
public class CodeVo {
private String key;
private Object value;
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
}
执行查询,将每行的结果保存到bean中,然后将所有的bean保存到list中
/**
* @param entityClass 类名
* @param sql sql语句
* @return 查询结果
*/
public <T> List<T> find(Class<T> entityClass, String sql) {
return find(entityClass, sql, null);
}
public <T> List<T> find(Class<T> entityClass, String sql, Object[] params) {
queryRunner = new QueryRunner(dataSource);
List<T> list = new ArrayList<T>();
try {
if (params == null) {
list = (List<T>) queryRunner.query(sql, new BeanListHandler(
entityClass));
} else {
list = (List<T>) queryRunner.query(sql, new BeanListHandler(
entityClass), params);
}
} catch (SQLException e) {
LOG.error("Error occured while attempting to query data", e);
}
return list;
}
/**
* 执行查询,将每行的结果保存到一个Map对象中,然后将所有Map对象保存到List中
*
* @param sql
* sql语句
* @return 查询结果
*/
public List<Map<String, Object>> find(String sql) {
return find(sql, null);
}
public List<Map<String, Object>> find(String sql, Object[] params) {
queryRunner = new QueryRunner(dataSource);
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
try {
if (params == null) {
list = (List<Map<String, Object>>) queryRunner.query(sql,
new MapListHandler());
} else {
list = (List<Map<String, Object>>) queryRunner.query(sql,
new MapListHandler(), params);
}
} catch (SQLException e) {
LOG.error("Error occured while attempting to query data", e);
}
return list;
}
通常,我们会以以下方式操作数据库:
BaseDao baseDao=new BaseDao();
BasicDataSource basicDataSource=new BasicDataSource();
basicDataSource.setDriverClassName("com.mysql.jdbc.Driver");
basicDataSource.setUrl("jdbc:mysql://localhost:3306/imark?characterEncoding=utf-8");
basicDataSource.setUsername("root");
basicDataSource.setPassword("jzz");
baseDao.setDataSource(basicDataSource);
String sql = "select id as 'key',value from imark_code";
List<Map<String,Object>> result = baseDao.find(sql);
for(Map<String,Object> map:result){
for(String key:map.keySet()){
System.out.println(map.get(key));
}
}
此时,返回结果如下:
time.interval.key
300
stage.finish.key
4
default.reply.key
欢迎来到......我们会以最快的时间进行处理。提交有惊喜!come on!
json.start.str
R:
这种方法太复杂,因为它把key也查询出来了,我们要获得value值,查询时还得跳过key值。
所以,我们把这种key-value形式的数据结构封装成一个VO类,如上述CodeVo类。这样我们就可以将vo类保存到list中,再将vo类的key、value放入到一个map中,如下:
public Map<String, Object> getCodeMap(String sql) {
Map<String, Object> map = new HashMap<String, Object>();
List<CodeVo> list = this.find(CodeVo.class, sql);
for (CodeVo codeVo : list) {
map.put(codeVo.getKey(), codeVo.getValue());
}
return map;
}
这样,我们可以一个map:
Map<String, Object> codeMap = baseDao.getCodeMap(sql);
System.out.println("imark_code_result : "+ codeMap);
再使用工具类直接可以获得map中指定key的value值:
String interval = MapUtils.getString(codeMap,ImarkContants.TIME_INTERVAL_KEY, "300");// 时间间隔
System.out.println(interval);//结果为500