zoukankan      html  css  js  c++  java
  • MyBatis.Net 学习手记

    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]
    "/>
    34                 <param name="Footer" value="[Footer]
    "/>
    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));
            }
        }
    }
    View Code

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

    示例源代码下载:http://files.cnblogs.com/yjmyzz/MyBatisSample.zip

  • 相关阅读:
    字符串反转,
    留意 这两个 name,
    fileurlwithpath,
    原来是 临时的那张图片没有删除,code 516
    下载图片,
    Codevs 5564 陶陶摘苹果2
    黑科技--用处自己探索
    Codevs 1299 切水果 水一发
    COdevs 天梯 水题系列
    COdevs 2823 锁妖塔
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/3362343.html
Copyright © 2011-2022 走看看