当前位置: 首页 > 工具软件 > MyBatis.NET > 使用案例 >

MyBatis.Net的一些记录

易祖鹤
2023-12-01

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"
    />


 类似资料: