iBATIS.net获取运行时sql语句

iBATIS.net获取运行时sql语句

2023年7月24日发(作者:)

获取运⾏时sql语句  【本⽂原创,第⼀次离⾸页如此之近。发在候选区攒攒rp,管理员看着不合适可以撤下。】

  虽然只在iBatis的世界⾥⼩打⼩闹匆匆数⽉,却历经数次与领导和同事激辩,再通过不懈努⼒学习和开发积累,楼猪终于被它⼩巧⽽不失强⼤,稳定⽽不失灵活所折服。作为80后顽固、偏执和nc⼀族,楼猪⼀向保守认为⾃⼰是美貌与智慧并存的。仗着天资聪慧,在之前的“

”⾥曾经公然抱怨iBATIS对sql语句的直接查看灰常的不友好,调试不⽅便,排除错误⾮常考验眼神,很重要的⼀条(甚⾄应该算是楼猪⼀开始就讨厌排斥iBatis的罪魁祸⾸)就是参数化的sql语句。但是也不能说获取到的运⾏时sql语句⼀点⽤⽊有,⾄少我们还是可以看到sql语句的⼤致组装情况的。说到这⾥,再对照标题,您可能会认为楼猪是要教⼤家怎么获取运⾏时的sql语句。以楼猪⼀贯⾃恋臭美的作风,这次会这么肤浅么......

  再给⼤家⼀次⼤胆猜测的机会......当当当当,我kao,新年新⽓象,⼤家变得更聪明了,⼀点惊喜和意外都⽊有,果然。好了,有没有新意,看看楼猪的介绍再说吧:

⼀、常见获取运⾏时sql语句⽅式

通常我们都是在⼀个公共类⾥写⼀个⽅法,单独作为获取sql语句的帮助类(),然后在sqlmapper⽅法调⽤的地⽅调⽤帮助类和它的⽅法。

1、实现代码17181926 ///

/// 得到运⾏时动态⽣成的SQL /// /// /// /// /// public static string GetRuntimeSql(ISqlMapper sqlMapper, string statementName, object paramObject) { string result = ; try { IMappedStatement statement = pedStatement(statementName); if (!ionStarted) { nnection(); } RequestScope scope = uestScope(statement, paramObject, ession); result = edSql; } catch (Exception ex) { result = "获取SQL语句出现异常:" + e; } return result; }2、使⽤帮助类获取sql语句

接着采⽤类似如下实现⽅式进⾏调⽤:

12345 public IList SelectPersons(Person model) { string sql = timeSql(per, tementName("SelectPersons"), model); return orList(tementName("SelectPersons"), model); }在之前做过的⼤⼤⼩⼩形形⾊⾊的项⽬中,楼猪没少这么写,开发团队其他成员也是⼀样的,灰常和谐默契。

⼆、

获取运⾏时sql语句⽅式的改进  但是每做⼀个新项⽬就要写个⼀模⼀样的帮助类来(嗨,您现在嗅到坏味道并且看到杯具了吧?!),偏执追求完美的nc楼猪就想,各位⼤神早就教导我们重复是邪恶的(Duplication is Evil (DIE)),⼤家⼀起不亦乐乎地重复呢?这⾥您⼀定会善意建议楼猪把帮助类写进公共类库⾥,⼤家以后公共调⽤那个类库就可以了。思路确实没错,很不客⽓地说,楼猪第⼀次使⽤iBatis就想这么⼲了。看到这⾥含蓄的您可能已经会⼼⼀笑,豪放点的也许已经也有“tmd,⽼⼦也和你想到⼀块去了”之感。其实在很多技术问题上,⼤家的看法最终还是⾮常容易达到⾼度统⼀的。   楼猪是通过抽象出⼀个具有获取运⾏时sql语句的⽅法的BaseIBatisDao基类,封装并改进初始化SqlMapper对象的⽅式实现公共调⽤的:

1、BaseIBatisDao泛型抽象类

829363738394647484956575859606162using System;using pper;using ;using Statements;

namespace Util{ public abstract class BaseIBatisDao where T : class { #region Properties

public ISqlMapper SqlMapper { get; set; }

#endregion

#region Constructor

public BaseIBatisDao() { }

public BaseIBatisDao(string mapperName) { per = per(mapperName); }

#endregion

#region Functions

///

/// 得到运⾏时动态⽣成的SQL /// /// /// /// /// public virtual string GetRuntimeSql(ISqlMapper sqlMapper, string statementName, object paramObject) { string result = ; try { IMappedStatement statement = pedStatement(statementName); if (!ionStarted) { nnection(); } RequestScope scope = uestScope(statement, paramObject, ession); result = edSql; } catch (Exception ex) { result = "获取SQL语句出现异常:" + e; } return result; }

///

/// 获取sqlMap对应statement的完整id /// /// /// 62636465666768697071 /// protected virtual string GetStatementName(string name) { return ("{0}.{1}", typeof(T).Namespace, name); }

#endregion

}}在这个基类中,在初始化SqlMapper对象的地⽅,楼猪是通过⼀个辅助类(SqlMapperManager)通过单例模式实现的:82936373839464748495657585960using System;using c;using pper;using uration;using nStore;

namespace Util{ ///

/// SqlMap创建管理 /// public class SqlMapperManager { private static readonly object objSync = new object(); private static readonly IDictionary dictMappers = null;

static SqlMapperManager() { dictMappers = new Dictionary(); }

///

/// 实例化SqlMap对象 /// /// 通常.config⽂件 /// public static ISqlMapper GetMapper(string mapperName) { if (OrEmpty(mapperName)) { throw new Exception("MapperName为空!"); } if (r().LastIndexOf(".config") == -1) { mapperName += ".config"; } ISqlMapper mapper = null; if (nsKey(mapperName)) { mapper = dictMappers[mapperName]; } else { if (mapper == null) { lock (objSync) { if (mapper == null) { mapper = new DomSqlMapBuilder().Configure(mapperName); nStore = new HybridWebThreadSessionStore(); (mapperName, mapper); } } } } return mapper; } }}2、在DAO中调⽤BaseIBatisDao基类 8293637383946474849565758596using c;using Util;using ;

namespace { public class PersonDao : BaseIBatisDao { public PersonDao() : base("") { }

public IList SelectPersons(Person model) { string sql = timeSql(per, tementName("SelectPersons"), model); return orList(tementName("SelectPersons"), model); }

public IDictionary SelectDictStoreInfo(Person model) { string sql = timeSql(per, tementName("SelectPersons"), model); return orDictionary(tementName("SelectPersons"), model, "Id"); }

public IList SelectPagerPersons(Person model) { string sql = timeSql(per, tementName("SelectPagerPersons"), model); return orList(tementName("SelectPagerPersons"), model); }

public int InsertPerson(Person model) { string sql = timeSql(per, tementName("InsertPerson"), model); int result = 0; object obj = (tementName("InsertPerson"), model); if (obj != null) { result = (ng()); } return result; }

public int DeletePersonById(int id) { string sql = timeSql(per, tementName("DeletePersonById"), id); int result = 0; object obj = (tementName("DeletePersonById"), id); if (obj != null) { result = (ng()); } return result; }

public int UpdatePersonById(Person model) { string sql = timeSql(per, tementName("UpdatePersonById"), model); int result = 0; object obj = (tementName("UpdatePersonById"), model); if (obj != null) { result = (ng()); } return result;65666768 return result; } }} 如您所看到的那样,在每⼀个⽅法⾥,我们要获取运⾏时sql语句,只要⽤this来get⼀下就可以了,看上去这个⽅法就像是ibatis直接封装好提供给我们的⼀样,再对照之前的⽅式,强弱悬殊,⾼下⽴判。这⾥要特别说明,获取运⾏时sql语句通常都是开发者调试时的⼀种辅助。调试成功后,您可以及时把获取sql的那⼀⾏注释掉。有了这个⽅法,普通开发调试就⽐较圆满了(您还可以按照项⽬需要扩展出其他⽅法,⽐如通过datatable,datareader等等获取sql语句),⽽且调⽤灰常省事。

3、关于DAL层的⼏句废话

a、在本⽂最下⾯,楼猪会给出demo下载链接。之前的⼏篇介绍总结iBatis的⽂章⾥,iBatis的类库版本较低(1.3.0.0),现在已经升级到(1.6.1.0),开发环境Vs2008+Sql Server2005 Express.在运⾏程序的时候,请先在Sql Server上执⾏

Script

⽂件夹下的sql脚步建数据库和对应的表。要下载学习的童鞋请注意。

b、model层的说明

Person类直接继承的第⼀个基类(BaseModel)存的是其他表也可能⽤到的公共字段(主键Id);BaseModel直接继承⾃⽤于作为扩展查询条件的BaseQuery类;BaseQuery类继承⾃⽀持with⽅式分页的PagerBase类。其实看命名您可以猜到它们的各⾃作⽤了。不同的实体类可以按需要继承这三个类。

c、with分页查询⽅式

这个是sql server2005的with和公⽤表表达式提供的功能,分页效率和效果都很不错,dao所对应的xml⽂件⾥⽤到了“

”功能。sql server2005前版本和⾮sql server的数据库不⽀持此⽅式。楼猪之前都是通过更通⽤的⼆次top⽅式进⾏分页,希望您留意。

最后ps,本来计划在本⽂把iBatis事务和它的⾃带分页功能⼀并介绍的,⼀想起曾经⽆⽐挫折的事务使⽤经历,兴致全⽆。低俗的⼀句结束:⽇后再说。

demo下载:

发布者:admin,转转请注明出处:http://www.yc00.com/news/1690193277a312418.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信