2023年7月24日发(作者:)
ibatis在debug时打印完整的SQL语句 这些年做的项⽬中,对持久层的选型更多的是基于ibatis,⽽且⾃⼰涂鸦的系统开发框架数据层操作也是居于ibatis实现的,不为别的,就因为ibatis使⽤的是纯jdbc操作。 时下流⾏凡是都“原始回归”,“如果能把ibatis进⾏更好地理解和扩展,也不乏为⼀个优秀的杜撰框架”,基于这样的想法,好长时间⾥,我⼀直是钟情于ibatis的源码学习,⾃然从中也学到了很多有⽤的东西,设计模式、算法分析、构建思想和⼀些优秀的API实体类⼯具等。 好,先来⼏句赞美ibatis的浮夸。 ibatis 是⼀个 O/R Mapping 解决⽅案, ibatis 最⼤的特点就是⼩巧,上⼿很快。如果你不需要太多复杂的功能, ibatis 是能满⾜你的要求⼜⾜够灵活的最简单的解决⽅案。ibatis 以SQL开发的⼯作量和数据库移植性上的让步,为系统 设计提供了更⼤的⾃由空间。 ibatis 底层采⽤纯JDBC操作,要求操作⼈员直接编写sql进⾏操作,光从这点看,ibatis本⾝就⼤⼤地提⾼数据层操作的透明度。 好啦,改⼲正事了,这⾥我主要解决的就是⼀个常见的问题,即使⽤ibatis时需要在控制台或⽇志⽂件中打印其当前执⾏的完整sql,⽽不是常见的参数 问号 ? 语句。(这⾥主要基于ibatis2.0以上版本)。
步骤: 1.⽹上下⼀个源码⽂件(没有可找我,我发⼀份给你,我的QQ群:91377268) 2. 最终API执⾏流程,这⾥以insert为例。 具体顺序如下图: 3. 最终根源找到,即修改cutor即可。在代码66⾏处有如下⽅法public int executeUpdate(StatementScope statementScope, Connection conn, String sql, Object[] parameters) throws SQLException {;}insert最终执⾏的就是这个⽅法,恩,就是它了,改吧 4. 在类体中引⼊⽇志打印⼯具private static final Log log = ();
5. 添加debug下执⾏sql打印信息在e(); 执⾏前添加如下:
代码if (gEnabled()) { int count = ameterMetaData().getParameterCount(); for (int i = 0; i < count; i++) { sql = eFirst("?", parameters[i].getClass().getName().equals("") ? "'"+parameters[i].toString()+"'" : parameters[i].toString()); } ("===当前执⾏SQL为===" + sql + ".");}
还是贴⼀下完整的⽅法吧,省得有⼈抱怨我,O(∩_∩)O哈哈~代码public int executeUpdate(StatementScope statementScope, Connection conn, String sql, Object[] parameters) throws SQLException { ErrorContext errorContext = orContext(); ivity("executing update"); ectId(sql); PreparedStatement ps = null; setupResultObjectFactory(statementScope); int rows = 0; try { eInfo("Check the SQL Statement (preparation failed)."); ps = prepareStatement(sion(), conn, sql); setStatementTimeout(tement(), ps); eInfo("Check the parameters (set parameters failed)."); ameterMap().setParameters(statementScope, ps, parameters); eInfo("Check the statement (update failed).");//打印调试信息 startif (gEnabled()) { int count = ameterMetaData().getParameterCount(); for (int i = 0; i < count; i++) { sql = eFirst("?", parameters[i].getClass().getName().equals("") ? "'"+parameters[i].toString()+"'" : parameters[i].toString()); } ("===当前执⾏SQL为===" + sql + ".");}//打印调试信息 end e(); rows = ateCount(); } finally { closeStatement(sion(), ps); } return rows;}
Ok,主要的⼯作就是这样,下⾯开启commons-logginglog4j的debug模式测试⼀下吧。其他⽅式的API⽅法修改也累似了。 可能你会鄙视我,就这点三脚猫还出来“现眼”,笑笑,没事了,反正我就是想和⼤伙分享下⾃⼰的⼼得。⾃然对⼀个框架的扩展修改不会仅限于此(如sqlmap⼀个节点下同时执⾏多个sql、主⼦表同时保存⼀次操作中保证彼此外键的同时赋值关联、selectkey变种扩展为classkey即唯⼀主键由某个类实现⽽不是数据库sql,等等这些都是很容易的事情),如果是这样那我还不如回家种⽥去。可是罪恶的约束限制我只能写这么多,在中国嘛,就是这样了,到哪⾥都《保密协议》,悲哀。。。。。。 后期,如有时间,我会说说ibatis中关于connecting,事物,对象缓存等⼀些⾃⼰的理解,更多的是⼀些读懂代码的体会。 【最近在弄⾃创的WMframework,2.0版本,设计,代码实现基本上完成,还差⼀些⽂档说明,等做好那天再和⼤伙分享吧,不过不要笑我啊,因为我就是涂鸦⽽已。】
(注:本⼈⽂章均为原创,转载请注明出处!⼑光剑影20101013写于深圳。)
发布者:admin,转转请注明出处:http://www.yc00.com/news/1690193012a312383.html
评论列表(0条)