MySQL拦截器获取xml id_关于mybatis拦截器,有谁知道怎么对结果集进行拦截,将指定字段查询结果进行格式化...
用MyBatis結(jié)果集攔截器做過這樣一個(gè)需求:
由于項(xiàng)目需求經(jīng)常變動(dòng),項(xiàng)目MySQL數(shù)據(jù)庫都是存放JSON字符串,例如:用戶的基本信息隨著版本升級可能會(huì)有變動(dòng)
數(shù)據(jù)表
CREATE TABLE `account` (
`id` bigint(11) unsigned NOT NULL AUTO_INCREMENT,
`infos` text NOT NULL COMMENT '用戶JSON基本信息',
`createTime` int(10) unsigned NOT NULL COMMENT '創(chuàng)建時(shí)間',
`updateTime` int(10) unsigned NOT NULL COMMENT '更新時(shí)間',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
數(shù)據(jù):
id
infos
createTime
updateTime
1
{"nickName":"Jan","region_area":"","region_city":"深圳市","region_country":"中國","region_province":"廣東省","sex":"男","signature":"只要不放棄就還有機(jī)會(huì)!"}
1467793564
1470795733
JSONPlugin攔截器
使用MyBatis攔截器對ResultSetHandler接口的handleResultSets方法進(jìn)行攔截:
package me.xuebai.modules.mybatis;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.executor.resultset.ResultSetHandler;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Plugin;
import org.apache.ibatis.plugin.Signature;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import me.xuebai.modules.entity.Account;
@Intercepts({@Signature(
type= ResultSetHandler.class,
method = "handleResultSets",
args = {Statement.class})})
public class JSONPlugin implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
Object[] args = invocation.getArgs();
// 獲取到當(dāng)前的Statement
Statement stmt = (Statement) args[0];
// 通過Statement獲得當(dāng)前結(jié)果集
ResultSet resultSet = stmt.getResultSet();
List resultList = new ArrayList();
if(resultSet != null && resultSet.next()) {
Account account = new Account();
// infos字段
String infos = resultSet.getString("infos");
// 判斷是否為空
if(StringUtils.isNotBlank(infos)) {
// fastjson泛型反序列化
Map infMap = JSON.parseObject(infos, new TypeReference(){});
account.setInfos(infMap);
resultList.add(account);
}
// handleResultSets返回結(jié)果一定是一個(gè)List
// size為1時(shí),Mybatis會(huì)取第一個(gè)元素作為接口的返回值。
return resultList;
}
return invocation.proceed();
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
}
}
mybatis-config.xml
在mybatis配置文件中注冊插件:
測試輸出
Account account = accountDao.get(1L);
// {sex=男, region_city=深圳市, region_area=, nickName=Jan, region_country=中國, signature=只要不放棄就還有機(jī)會(huì)!, region_province=廣東省}
System.out.println(account.getInfos());
總結(jié)
以上是生活随笔為你收集整理的MySQL拦截器获取xml id_关于mybatis拦截器,有谁知道怎么对结果集进行拦截,将指定字段查询结果进行格式化...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里云rds for mysql平台介绍
- 下一篇: mysql通过参数文件启动_mysql启