最近老板提出了一个需求,那就是把执行的sql语句保存在操作日志。
想了一下,反正平时执行的sql语句都已经打印出来了,取出来保存在数据中应该不难。开始准备在百度上搜,只找到了ibatis获取sql的方法,但是很少有介绍mybaits的,只有部分通过拦截器来实现的,虽然可以获取到sql,但是这种获取方法在业务之外,不好控制,因为不是所有的sql都需要保存。
所以还是想通过查阅mybatis的源码来实现。
@Autowired
private SqlSessionTemplate sqlSessionTemplate;
/**
* 获取 mybatis执行的sql
* @param o 参数,对象
* @param id xml ID
* @return sql语句
*/
public String getSql(Object o,String id){
BoundSql boundSql = sqlSessionTemplate.getConfiguration().
getMappedStatement(id).
getBoundSql(o);
String sql = boundSql.getSql();
//获取参数集合
List<ParameterMapping> parms = boundSql.getParameterMappings();
//参数不为空
if(parms != null){
for(ParameterMapping p : parms){
//获取参数名字
String str = p.getProperty();
//封装成getXxx方法
String s = "get"+str.substring(0,1).toUpperCase()+str.substring(1);
try {
//System.out.println("==="+o.getClass().getMethod(s).invoke(o));
//反射getXxx()返回的值替换sql语句的的?
sql = sql.replaceFirst("\\?", "'"+(String)o.getClass().getMethod(s).invoke(o)+"'");
} catch (Exception e) {
e.printStackTrace();
}
}
}
return sql;
}
大功告成,而且把参数都已经赋值进去了。这个只是参数是对象是使用,如果是map/String,参照着单独写即可。
网上关于mybatis的介绍的文章太少,不知道有没有其他更好的方法,因为英语有限,暂时找不出更好的方法。暂时在项目中这样使用
效果:
UPDATE sy_user
SET NAME = 'admin',
DESCRIPTION = '',
FULLNAME = '苏里',
SEX = '1',
PHONE = '',
EMAIL = '',
MOBILEPHONE = '',
FAX = '',
COMP_ID = 'C828000019',
DEPARTMENT = '',
TITLE = '',
STATE = '0',
ADDRESS = '',
ROLE_ID = 'ROLE20131023000002'
WHERE id = 'USER20130903000022'