注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

ORM的分析之二iBatisNet(现在叫MyBatis)的应用之三DAO和LOG  

2012-08-07 13:10:49|  分类: NET(C#) |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 

ORM的分析之二iBatisNet(现在叫MyBatis)的应用之三DAO和LOG

讲完了映射,开始讲DAO,因为在工作的过程中大家一般都希望能看到工作的过程。所以IBATIS提供了日志Log4net.dll这个库。

建立一个工程MyBatisORM,然后再建立BLL层工程,DAL工程和实体映射类工程以及DAO管理工程。除了第一个为运行项目,其它均为类库项目,如下图:

ORM的分析之二iBatisNet(现在叫MyBatis)的应用之三DAO和LOG - 还东国 - 还东国的博客

 

因为是说DAO,所以这里的配置文件是重点,其实大家可以发现,在IBATIS中,配置文件一直是相当重要的,许多的错误和异常其实都是配置文件配置的不好的原因,这个好象网上有专门弄这个的工具。看配置文件dao.config:

<?xml version="1.0" encoding="utf-8"?>

<daoConfig xmlns="http://ibatis.apache.org/dataAccess" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

 

  <providers embedded="providers.config, TestMyBatisORM" />

 

  <context id="SqlMapDao" default="true">

 

    <!-- ==== SqlServer : SqlServerClient configuration ========= -->

    <database>

      <provider name="sqlServer2.0" />

      <dataSource name="sqlServer2.0" connectionString="data source=(local);database=BaseCardDB;user id=sa;password=123456;" />

    </database>

    <daoSessionHandler id="SqlMap">

      <property name="embedded" value="SqlMap.config, TestMyBatisORM" />

    </daoSessionHandler>

 

    <daoFactory>

      <!-- Entity_1:Entity1 -->

      <dao interface="CustomerPersistencePI.InterFaces.ICustomerDao, CustomerPersistencePI"

          implementation="CustomerPersistencePI.MapperDao.CustomerMapDao, CustomerPersistencePI" />

 

      <!-- Entity_2:Entity2 -->

      <dao interface="CustomerPersistencePI.InterFaces.IProductMapDao,CustomerPersistencePI"

          implementation="CustomerPersistencePI.MapperDao.ProductMapDao,CustomerPersistencePI" />

 

    </daoFactory>

  </context>

 

</daoConfig>

其实这里主要是<daoFactory>和context id="SqlMapDao"这两节,另外两个配置文件sqlmap.config和provider.config,这里不再多说,上一节说得很清楚,仍然注意的问题是资源做为嵌入式或者资源以及相应的数据库要ENABLE为TRUE。

这个配置文件还是吃了苦头的,因为IBATIS对NET4支持的不是很好,所以如果想使用的话最好使用Net3.5以下。否则报下面的错误:

- The error occurred while configure DaoSessionHandler.

- The error occurred in <property name="embedded" value="SqlMap.config, IBatisORM" xmlns="http://ibatis.apache.org/dataAccess" />. 

- Check the IBatisNet.DataAccess.DaoSessionHandlers.SqlMapDaoSessionHandler.

 

 

There is no DAO implementation found for ICustomerDao in this context.

或者类似的错误,使用低版本的NET就没这个问题了。可能算是IBATIS的不足或者说是BUG吧。

There is no DAO implementation found for ICustomerDao in this context.这个错误,如果配置文件通过引起出错误的代码在CustomerService.cs中:

            _getDaoManager = ServiceConfig.GetInstance().DaoManager;

            try

            {

                //There is no DAO implementation found for class问¨?题?a--fjf

                if (_getDaoManager != null)

                    _getbaseService = _getDaoManager.GetDao(typeof(ICustomerDao)) as ICustomerDao;

                    //_getbaseService = _getDaoManager.GetDao(typeof(CustomerMapDao)) as ICustomerDao;

            }

            catch (Exception e)

            {

                string x = e.Message.ToString();

            }

红色代码部分会产生上文提到的那个异常。查了下资料,一个是说把typeof里的类换成接口,但解决不了问题,第二种怀疑是配置文件,因为是接口文件找不到,象上文说的换成NET3.5就可以了。

另外一个需要注意的是ProductMap.xml中的:

原文:

    <select id="SelectAllProduct" resultMap="List">

      SELECT * FROM Product

    </select>

修改:

    <select id="SelectAllProduct" resultMap="SelectAllResult">

      SELECT * FROM Product

    </select>

同时修改后得增加:

  <resultMaps>

    <resultMap id="SelectAllResult" class="EntityModel.Product">

      <result property="ProductId" column="ProductID" />

      <result property="ProductName" column="Product_Name" />

      <result property="ProductCompany" column="Product_Company" />

      <result property="SignDate" column="SignOn_Data" />

      <result property="UpdateData" column="Update_Data" />

    </resultMap>

    </resultMaps>

否则,报一个错误:

“不能将ArrayList转换成List”的错误,这个估计可能也是版本的问题,估计老版本是支持这样的,高版本不支持了。出错的地方在:

        public List<Product> GetAllProductList()

        {

            if (_getsqlManager != null)

            {

                IList<Product> iTemp = null;

                List<Product> getproductlist = new List<Product>();

                //getproductlist = _getsqlManager.QueryForList<Product>("SelectAllProduct", null).ToList<Product>();

                iTemp = _getsqlManager.QueryForList<Product>("SelectAllProduct", null);

                getproductlist = iTemp.ToList<Product>();

                return getproductlist;

            }

            return null;

        }

红色代码部分。

然后就是日志部分:

在增加对Log4Net.dll和IBatisNet.Common.Logging.Log4Net.dll后,在web.config中增加下列节:(WinForm对应的是*.exe.config,WebForm对应的是*.config)

         <iBATIS>

                   <logging>

                            <logFactoryAdapter type="IBatisNet.Common.Logging.Impl.Log4NetLoggerFA, IBatisNet.Common.Logging.Log4Net">

                                     <arg key="configType" value="inline"/>

                                     <arg key="showLogName" value="true"/>

                                     <arg key="showDataTime" value="true"/>

                                     <arg key="level" value="ALL"/>

                                     <arg key="dateTimeFormat" value="yyyy/MM/dd HH:mm:ss:SSS"/>

                            </logFactoryAdapter>

                   </logging>

         </iBATIS>

         <log4net>

                   <!-- Define some output appenders -->

                   <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">

                            <param name="File" value="log.txt"/>

                            <param name="AppendToFile" value="true"/>

                            <param name="MaxSizeRollBackups" value="2"/>

                            <param name="MaximumFileSize" value="100KB"/>

                            <param name="RollingStyle" value="Size"/>

                            <param name="StaticLogFileName" value="true"/>

                            <layout type="log4net.Layout.PatternLayout">

                                     <param name="Header" value="[Header]\r\n"/>

                                     <param name="Footer" value="[Footer]\r\n"/>

                                     <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"/>

                            </layout>

                   </appender>

                   <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">

                            <layout type="log4net.Layout.PatternLayout">

                                     <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] &lt;%X{auth}&gt; - %m%n"/>

                            </layout>

                   </appender>

                   <!-- Set root logger level to ERROR and its appenders -->

                   <root>

                            <level value="DEBUG"/>

                            <appender-ref ref="RollingLogFileAppender"/>

                            <appender-ref ref="ConsoleAppender"/>

                   </root>

                   <!-- Print only messages of level DEBUG or above in the packages -->

                   <logger name="IBatisNet.DataMapper.Configuration.Cache.CacheModel">

                            <level value="DEBUG"/>

                   </logger>

                   <logger name="IBatisNet.DataMapper.Configuration.Statements.PreparedStatementFactory">

                            <level value="DEBUG"/>

                   </logger>

                   <logger name="IBatisNet.DataMapper.LazyLoadList">

                            <level value="DEBUG"/>

                   </logger>

                   <logger name="IBatisNet.DataAccess.DaoSession">

                            <level value="DEBUG"/>

                   </logger>

                   <logger name="IBatisNet.DataMapper.SqlMapSession">

                            <level value="DEBUG"/>

                   </logger>

                   <logger name="IBatisNet.Common.Transaction.TransactionScope">

                            <level value="DEBUG"/>

                   </logger>

                   <logger name="IBatisNet.DataAccess.Configuration.DaoProxy">

                            <level value="DEBUG"/>

                   </logger>

         </log4net>

在config文件中的配置

要使用log4net,首先要在config文件的<configSections>节点中增加配置(如果没有这个节点请手动增加),如下:

 

1.  <configSections> 

2.    <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/> 

3.  </configSections> 

除此之外,还要在顶级节点<configuration>下增加<log4net>子节点。在<log4net>节点下就可以增加<appender>子节点,每个<appender>子节点代表一种记录日志的方式(仅在这里配置了不代表启用了)。

具体说来有如下Appender:

AdoNetAppender:利用ADO.NET记录到数据库的日志。

AnsiColorTerminalAppender:在ANSI 窗口终端写下高亮度的日志事件。

AspNetTraceAppender:能用asp.net中Trace的方式查看记录的日志。

BufferingForwardingAppender:在输出到子Appenders之前先缓存日志事件。

ConsoleAppender:将日志输出到控制台。

EventLogAppender:将日志写到Windows Event Log.

FileAppender:将日志写到文件中。

LocalSyslogAppender:将日志写到local syslog service (仅用于UNIX环境下).

MemoryAppender:将日志存到内存缓冲区。

NetSendAppender:将日志输出到Windows Messenger service.这些日志信息将在用户终端的对话框中显示。

RemoteSyslogAppender:通过UDP网络协议将日志写到Remote syslog service。

RemotingAppender:通过.NET Remoting将日志写到远程接收端。

RollingFileAppender:将日志以回滚文件的形式写到文件中。

SmtpAppender:将日志写到邮件中。

TraceAppender:将日志写到.NET trace 系统。

UdpAppender:将日志connectionless UDP datagrams的形式送到远程宿主或以UdpClient的形式广播。

关于使用log4net中可能会使用到的一些参数

%m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息

%n(new line):换行

%d(datetime):输出当前语句运行的时刻

%r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数

%t(thread id):当前语句所在的线程ID

%p(priority): 日志的当前优先级别,即DEBUG、INFO、WARN…等

%c(class):当前日志对象的名称,例如:

%f(file):输出语句所在的文件名。

%l(line):输出语句所在的行号。

%数字:表示该项的最小长度,如果不够,则用空格填充,如“%-5level”表示level的最小宽度是5个字符,如果实际长度不够5个字符则以空格填充。

下面以一个实际的例子来说明问题,比如在配置中有“%date [%thread] (%file:%line) %-5level %logger [%property{NDC}] - %message%newline”,那么实际的日志中会是如下格式:

“记录时间:2010-11-17 16:16:36,561 线程ID:[9] 日志级别:文件:所在行ERROR 出错类:Log4NetDemo.Program property:[(null)] - 错误描述:error

System.Exception: 在这里发生了一个异常,Error Number:2036084948”

更详细的请参看周公的BLOG:

log4net使用详解

http://blog.csdn.net/zhoufoxcn/article/details/2220533

Log4Net使用详解(续)

http://zhoufoxcn.blog.51cto.com/792419/429988

IBITS基本就这样了,虽然还有一些未尽事宜,下来是DAPPER这个ORM平台,俗话说:

还是要有一点缺憾为好。

其实就是先挖一小坑,谁跳进来算谁,哈哈。

  评论这张
 
阅读(2122)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017