1、配置文件监控
在MyBatis.Net的帮助文档中,有一段关于创建ISqlMap的代码,而这段代码在dll中是已经提供了的,代码如下
ConfigureHandler handler = new ConfigureHandler(Configure);
DomSqlMapBuilder builder = new DomSqlMapBuilder();
_mapper = builder.ConfigureAndWatch(handler);
ConfigureAndWatch这个方法是监控文件变化,好吧,坑来了
1.1)、这个方法里面会去调用两个静态方法
ConfigWatcherHandler.ClearFilesMonitored();//清除所有的文件监控
ConfigWatcherHandler.AddFileToWatch();//重新添加要监控的文件(监控还未开始)
所以如果要实现多数据库的监控,嘿嘿,只要用了builder.ConfigureAndWatch,之前的文件监控都会被清空,所以如果多数据库,要么自己实现文件监控以及通知,要么就要实例多个DomSqlMapBuilder分别监控,甚至干脆就不要监控......
1.2)、ConfigureHandler,这是一个委托,当监控的文件发生变化时调用,该委托存在一个object参数,但你知道这个传递过来的object实际是什么吗?
/// <summary>
/// Callback called when the SqlMap.config file has changed.
/// </summary>
/// <param name="obj">The <see cref="StateConfig"/> object.</param>
public static void OnConfigFileChange(object obj)
{
StateConfig state = (StateConfig)obj;
state.ConfigureHandler( null );
}
居然是null...当然,单数据库文件监控这部分其实也无所谓了......
2、Ibatis.DataMapper.1.6.2版本中发现的bug
2.1)statements配置节点下的generate,这个xml参数是用来自动生成insert,update,delete对应的sql语句的,大多数情况下它都是对的,但在update时,它偶尔会出错,具体就是生成的@param与传递的param不一致,碰到这种情况,就只能自己写sql了,当然,为了parameterMap还能起作用,我会将自己写的sql中直接写上相应顺序的@param1,@param2...否则就只能去掉parameterMap,然后用#pro#的方式了
2.2)跟2.1相关,如果指定了parameterMap,那么如果还使用##或者$ $的方式,mybatis不会自动替换##以及$ $对应的部分。。。但神奇的是它还会传入@param1,@param2...
3、DataMapper的一些技巧
3.1)在SqlMap.config中可以不指定实际的connectionString,只要输入不为空的字符串就可以,实际可以在应用中修改连接字符串,一种方式是在ISqlMapper被实例化之前通过DomSqlMapBuilder,这个在官方文档中有,还有一个就是在实例化后修改,代码如下:
Mapper.Instance().DataSource.ConnectionString = "ConnectionString";
这样我们就可以对连接字符串进行加密了,当然这样之后,也就必须提供一个统一的获取ISqlMapper的方法了
3.2)查询返回复杂实体,包含对于N+1问题如何处理,这个在官方文档中也有,还是蛮详细的,就不记录代码了
4、数据库支持
增加Frame4.0支持,其它虽未验证,但应该也是一致的
<provider
name="sqlServer4.0"
enabled="true"
default="true"
description="Microsoft SQL Server, provider V4.0.0.0 in framework .NET V4.0"
assemblyName="System.Data, Version=4.0.0.0, Culture=Neutral, PublicKeyToken=b77a5c561934e089"
connectionClass="System.Data.SqlClient.SqlConnection"
commandClass="System.Data.SqlClient.SqlCommand"
parameterClass="System.Data.SqlClient.SqlParameter"
parameterDbTypeClass="System.Data.SqlDbType"
parameterDbTypeProperty="SqlDbType"
dataAdapterClass="System.Data.SqlClient.SqlDataAdapter"
commandBuilderClass=" System.Data.SqlClient.SqlCommandBuilder"
usePositionalParameters = "false"
useParameterPrefixInSql = "true"
useParameterPrefixInParameter = "true"
parameterPrefix="@"
allowMARS="true"
/>