Mybaits在业务层获取执行的完整sql

最近老板提出了一个需求,那就是把执行的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'

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值