为了账号安全,请及时绑定邮箱和手机立即绑定

MyBatis.Net 学习手记

标签:
C#

MyBatis.NET的前身为IBatis,是JAVA版MyBatis在.NET平台上的翻版,相对NHibernate、EntityFramework等重量级ORM框架而言,MyBatis.NET必须由开发人员手动写SQL,相对灵活性更大,更容易保证DB访问的性能,适用开发团队里有SQL熟手的场景。

下面是使用步骤:

1、到官网http://code.google.com/p/mybatisnet/ 下载相关dll和文档

Doc-DataAccess-1.9.2.zip
Doc-DataMapper-1.6.2.zip
IBatis.DataAccess.1.9.2.bin.zip
IBatis.DataMapper.1.6.2.bin.zip

一共有4个zip包

2、创建一个Web应用,参考下图添加程序集引用

3、修改web.config,主要是配置log4net,参考下面的内容:

 1 <?xml version="1.0"?> 
 2 <configuration> 
 3     <configSections> 
 4         <sectionGroup name="iBATIS"> 
 5             <section name="logging" type="IBatisNet.Common.Logging.ConfigurationSectionHandler, IBatisNet.Common"/> 
 6         </sectionGroup> 
 7         <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> 
 8     </configSections> 
 9     <system.web>
 10         <compilation debug="true" targetFramework="4.0"/>
 11     </system.web>
 12     <iBATIS>
 13         <logging>
 14             <logFactoryAdapter type="IBatisNet.Common.Logging.Impl.Log4NetLoggerFA, IBatisNet.Common.Logging.Log4Net">
 15                 <arg key="configType" value="inline"/>
 16                 <arg key="showLogName" value="true"/>
 17                 <arg key="showDataTime" value="true"/>
 18                 <arg key="level" value="ALL"/>
 19                 <arg key="dateTimeFormat" value="yyyy/MM/dd HH:mm:ss:SSS"/>
 20             </logFactoryAdapter>
 21         </logging>
 22     </iBATIS>
 23     <log4net>
 24         <!-- Define some output appenders -->
 25         <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
 26             <param name="File" value="mybatis.log"/>
 27             <param name="AppendToFile" value="true"/>
 28             <param name="MaxSizeRollBackups" value="2"/>
 29             <param name="MaximumFileSize" value="100KB"/>
 30             <param name="RollingStyle" value="Size"/>
 31             <param name="StaticLogFileName" value="true"/>
 32             <layout type="log4net.Layout.PatternLayout">
 33                 <param name="Header" value="[Header]\r\n"/>
 34                 <param name="Footer" value="[Footer]\r\n"/>
 35                 <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"/>
 36             </layout>
 37         </appender>
 38         <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
 39             <layout type="log4net.Layout.PatternLayout">
 40                 <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] &lt;%X{auth}&gt; - %m%n"/>
 41             </layout>
 42         </appender>
 43         <!-- Set root logger level to ERROR and its appenders -->
 44         <root>
 45             <level value="DEBUG"/>
 46             <appender-ref ref="RollingLogFileAppender"/>
 47             <appender-ref ref="ConsoleAppender"/>
 48         </root>
 49         <!-- Print only messages of level DEBUG or above in the packages -->
 50         <logger name="IBatisNet.DataMapper.Configuration.Cache.CacheModel">
 51             <level value="DEBUG"/>
 52         </logger>
 53         <logger name="IBatisNet.DataMapper.Configuration.Statements.PreparedStatementFactory">
 54             <level value="DEBUG"/>
 55         </logger>
 56         <logger name="IBatisNet.DataMapper.LazyLoadList">
 57             <level value="DEBUG"/>
 58         </logger>
 59         <logger name="IBatisNet.DataAccess.DaoSession">
 60             <level value="DEBUG"/>
 61         </logger>
 62         <logger name="IBatisNet.DataMapper.SqlMapSession">
 63             <level value="DEBUG"/>
 64         </logger>
 65         <logger name="IBatisNet.Common.Transaction.TransactionScope">
 66             <level value="DEBUG"/>
 67         </logger>
 68         <logger name="IBatisNet.DataAccess.Configuration.DaoProxy">
 69             <level value="DEBUG"/>
 70         </logger>
 71     </log4net>
 72 </configuration>

View Code

4、添加Providers.config

把从官方下载的压缩包解开,就能找到providers.config文件,里面定义了MyBatis.Net支持的各种数据库驱动,本例以oracle为例,把其它不用的db provider全删掉,只保留下oracleClient1.0,同时把enabled属性设置成true,参考下面这样:

 1 <?xml version="1.0"?> 
 2 <providers xmlns="http://ibatis.apache.org/providers" 
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
 4  
 5     <clear/>     
 6      
 7     <!--Oracle Support--> 
 8     <provider 
 9       name="oracleClient1.0"
 10       description="Oracle, Microsoft provider V1.0.5000.0"
 11       enabled="true"
 12       assemblyName="System.Data.OracleClient, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" connectionClass="System.Data.OracleClient.OracleConnection"
 13       commandClass="System.Data.OracleClient.OracleCommand"
 14       parameterClass="System.Data.OracleClient.OracleParameter"
 15       parameterDbTypeClass="System.Data.OracleClient.OracleType"
 16       parameterDbTypeProperty="OracleType"
 17       dataAdapterClass="System.Data.OracleClient.OracleDataAdapter"
 18       commandBuilderClass="System.Data.OracleClient.OracleCommandBuilder"
 19       usePositionalParameters="false"
 20       useParameterPrefixInSql="true"
 21       useParameterPrefixInParameter="false"
 22       parameterPrefix=":"
 23       allowMARS="false"
 24   />
 25     
 26 </providers>

View Code

把这个文件复制到Web项目根目录下

5、添加SqlMap.config,内容如下:

 1 <?xml version="1.0" encoding="utf-8"?> 
 2 <sqlMapConfig xmlns="http://ibatis.apache.org/dataMapper" 
 3               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
 4  
 5     <settings> 
 6         <setting useStatementNamespaces="false"/> 
 7         <setting cacheModelsEnabled="true"/> 
 8     </settings> 
 9 
 10     <!--db provider配置文件路径-->
 11     <providers resource="providers.config"/>
 12 
 13     <!--db provider类型及连接串-->
 14     <database>
 15         <provider name="oracleClient1.0" />
 16         <dataSource name="oracle" connectionString="Data Source=ORCL;Persist Security Info=True;User ID=scott;Password=tiger;Unicode=True" />
 17     </database>
 18 
 19     <!--db与Entity的映射文件-->
 20     <sqlMaps>
 21         <sqlMap resource="Maps/ProductMap.xml"/>
 22     </sqlMaps>
 23 
 24 </sqlMapConfig>

View Code

这个文件也复制到Web项目根目录下,它的作用主要是指定db连接串,告诉系统providers.config在哪? 以及db与entity的映射文件在哪?(映射文件后面会讲到,这里先不管)

6、在Oraccle中先建表Product以及Sequence,方便接下来测试

 1 -- CREATE TABLE 
 2 CREATE TABLE PRODUCT 
 3 ( 
 4   PRODUCTID      NUMBER NOT NULL, 
 5   PRODUCTNAME    VARCHAR2(100), 
 6   PRODUCTCOMPANY VARCHAR2(100), 
 7   SIGNDATE       DATE, 
 8   UPDATEDATE     DATE 
 9 );
 10 -- CREATE/RECREATE PRIMARY, UNIQUE AND FOREIGN KEY CONSTRAINTS 
 11 ALTER TABLE PRODUCT
 12   ADD CONSTRAINT PK_PRODUCT_ID PRIMARY KEY (PRODUCTID);
 13 
 14 -- CREATE SEQUENCE 
 15 CREATE SEQUENCE SQ_PRODUCT
 16 MINVALUE 1
 17 MAXVALUE 9999999999999999999999999
 18 START WITH 1
 19 INCREMENT BY 1
 20 CACHE 20;

View Code

7、创建Maps目录,并在该目录下,添加映射文件ProductMap.xml,内容如下:

 1 <?xml version="1.0" encoding="utf-8" ?> 
 2 <sqlMap namespace="EntityModel" xmlns="http://ibatis.apache.org/mapping" 
 3         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
 4  
 5     <alias> 
 6         <!--类的别名--> 
 7         <typeAlias alias="Product" type="Web.Product,Web"/> 
 8     </alias> 
 9 
 10     <resultMaps>
 11         <!--Product类与db表的映射-->
 12         <resultMap id="SelectAllResult" class="Product">
 13             <result property="ProductId" column="ProductId"/>
 14             <result property="ProductName" column="ProductName"/>
 15             <result property="ProductCompany" column="ProductCompany" />
 16             <result property="SignDate" column="SignDate"  />
 17             <result property="UpdateDate" column="UpdateDate" />
 18         </resultMap>
 19     </resultMaps>
 20 
 21     <statements>
 22 
 23         <!--查询所有记录-->
 24         <select id="SelectAllProduct" resultMap="SelectAllResult">
 25             <![CDATA[SELECT ProductId,ProductName,ProductCompany,SignDate,UpdateDate FROM Product]]>
 26         </select>
 27 
 28         <!--查询单条记录-->
 29         <select id="SelectByProductId" parameterClass="int" resultMap="SelectAllResult" extends="SelectAllProduct">
 30             <![CDATA[ where ProductId = #value#  ]]>
 31         </select>
 32 
 33         <!--插入新记录-->
 34         <insert id="InsertProduct" parameterClass="Product">    
 35             <!--oracle sequence的示例用法-->
 36             <selectKey property="ProductId" type="pre" resultClass="int">
 37                 select SQ_Product.nextval as ProductId from dual
 38             </selectKey>
 39             <![CDATA[INSERT into Product(ProductId,ProductCompany,ProductName,SignDate,UpdateDate)
 40             VALUES(#ProductId#,#ProductCompany#, #ProductName# , #SignDate# , #UpdateDate#)]]>
 41         </insert>
 42 
 43         <!--更新单条记录-->
 44         <update id="UpdateProduct" parameterClass="Product">
 45             <![CDATA[Update Product SET ProductName=#ProductName#,
 46             ProductCompany=#ProductCompany#,            
 47             SignDate=#SignDate#,
 48             UpdateDate=#UpdateDate#
 49             Where ProductId=#ProductId#]]>
 50         </update>
 51 
 52         <!--根据主键删除单条记录-->
 53         <delete id="DeleteProductById" parameterClass="int">
 54             <![CDATA[Delete From Product Where ProductId=#value#]]>
 55         </delete>
 56
 57
 58     </statements>
 59 
 60 </sqlMap>

View Code

它的作用就是指定各种sql,以及db表与entity的映射规则,注意下insert中Sequence的用法!

8、创建实体类Product 

 1 using System; 
 2  
 3 namespace Web 
 4 { 
 5    public class Product 
 6     { 
 7        public int ProductId { get; set; } 
 8        public string ProductName { get; set; } 
 9        public string ProductCompany { get; set; }
 10        public DateTime SignDate { get; set; }
 11        public DateTime UpdateDate { get; set; }
 12 
 13        public Product() { }
 14     }
 15 }

View Code

9、写一个通用的BaseDA类,对MyBatis.Net做些基本的封装 

 1 using IBatisNet.DataMapper; 
 2 using System.Collections.Generic; 
 3  
 4 namespace Web 
 5 { 
 6     public static class BaseDA 
 7     { 
 8         public static int Insert<T>(string statementName, T t) 
 9         {
 10             ISqlMapper iSqlMapper = Mapper.Instance();
 11             if (iSqlMapper != null)
 12             {
 13                 return (int)iSqlMapper.Insert(statementName, t);
 14             }
 15             return 0;
 16         }
 17 
 18         public static int Update<T>(string statementName, T t)
 19         {
 20             ISqlMapper iSqlMapper = Mapper.Instance();
 21             if (iSqlMapper != null)
 22             {
 23                 return iSqlMapper.Update(statementName, t);
 24             }
 25             return 0;
 26         }
 27 
 28         public static int Delete(string statementName, int primaryKeyId)
 29         {
 30             ISqlMapper iSqlMapper = Mapper.Instance();
 31             if (iSqlMapper != null)
 32             {
 33                 return iSqlMapper.Delete(statementName, primaryKeyId);
 34             }
 35             return 0;
 36         }
 37 
 38         public static T Get<T>(string statementName, int primaryKeyId) where T : class
 39         {
 40             ISqlMapper iSqlMapper = Mapper.Instance();
 41             if (iSqlMapper != null)
 42             {
 43                 return iSqlMapper.QueryForObject<T>(statementName, primaryKeyId);
 44             }
 45             return null;
 46         }
 47 
 48         public static IList<T> QueryForList<T>(string statementName, object parameterObject = null)
 49         {
 50             ISqlMapper iSqlMapper = Mapper.Instance();
 51             if (iSqlMapper != null)
 52             {
 53                 return iSqlMapper.QueryForList<T>(statementName, parameterObject);
 54             }
 55             return null;
 56         }
 57     }
 58 }

View Code

10、然后就可以在Default.aspx.cs上测试了,参考下面的代码: 

using System;

using System.Web.UI;



namespace Web

{

    public partial class Default : Page

    {

        protected void Page_Load(object sender, EventArgs e)

        {

            //插入

            var insertProductId = BaseDA.Insert<Product>("InsertProduct", new Product()

            {

                ProductCompany = "INFOSKY",

                ProductName = "iGSA2",

                SignDate = DateTime.Now,

                UpdateDate = DateTime.Now

            });


            //查单条记录

            var model = BaseDA.Get<Product>("SelectByProductId", insertProductId);

            ShowProduct(model);


            Response.Write("<hr/>");


            //修改记录

            if (model != null)

            {

                model.ProductName = (new Random().Next(0, 99999999)).ToString().PadLeft(10, '0');

                int updateResult = BaseDA.Update<Product>("UpdateProduct", model);

                Response.Write("update影响行数:" + updateResult + "<br/><hr/>");

            }


            //查列表

            var products = BaseDA.QueryForList<Product>("SelectAllProduct");


            foreach (var pro in products)

            {

                ShowProduct(pro);

            }


            Response.Write("<hr/>");


            //删除记录

            int deleteResult = BaseDA.Delete("DeleteProductById", insertProductId);

            Response.Write("delete影响行数:" + deleteResult + "<br/><hr/>");


        }


        void ShowProduct(Product pro)

        {

            if (pro == null) return;

            Response.Write(string.Format("{0}&nbsp;,&nbsp;{1}&nbsp;,&nbsp;{2}&nbsp;,&nbsp;{3}&nbsp;,&nbsp;{4}<br/>",

                pro.ProductId, pro.ProductName, pro.ProductCompany, pro.SignDate, pro.UpdateDate));

        }

    }

}

 整个项目的目录结构如下:


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消