zoukankan      html  css  js  c++  java
  • IBatis.net初步使用

    最近加班比较忙,时间也比较琐碎,蛮久没有写东西了。这次就总结一下自己使用IBatis.net的一些总结吧。

    IBatis简介

    IBatis.net是一款开源的Orm框架,应该算是从java的IBatis项目演化而来的基于C#的Orm框架。

    官方网站:http://www.mybatis.org/

    项目下载地址:http://code.google.com/p/mybatisnet/

    IBatis使用

    1)、配置文件:providers.config---数据库提供者的配置文件,主要用于配置使用的数据库类型;SqlMap.config:配置入口文件,用于配置指向的数据提供者文件和各类sql映射文件。配置文件名称可自行设定(SqlMap.Config为默认的配置文件名).

    2)、配置文件的初始化:

    public class MyMapper
        {
            public static string DbMapperFile = @"ConfigFileSqlMap.config"; ///配置文件名
            private static object mLock = new object();
    
            private static volatile ISqlMapper _mapper = null;
            /// <summary>    
            ///     
            /// </summary>    
            /// <param name="obj"></param>    
            public static void Configure(object obj)
            {
                _mapper = null;
            }
    
            public static ISqlMapper SqlMapper
            {
                get
                {
                    if (_mapper == null)
                    {
                        lock (mLock)
                        {
                            if (_mapper == null)
                            {
                                ConfigureHandler handler = new ConfigureHandler(Configure);
                                DomSqlMapBuilder builder = new DomSqlMapBuilder();
                                _mapper = builder.ConfigureAndWatch(DbMapperFile, handler);    //监视配置文件,不监视:builder.Configure();
                            }
                        }
                    }
                    return _mapper;
                }
            }
        }    
    

     初始化一个Dal'操作基类:

    /// <summary>
        /// Dal抽象基类
        /// </summary>
        /// <typeparam name="T"></typeparam>
        public abstract class BaseDal<T> where T : class
        {
            protected ISqlMapper sqlMapper = null;
            public BaseDal()
            {
                sqlMapper = HisMapper.SqlMapper;
    
            }
            public BaseDal(string configFile)
            {
                MyMapper.DbMapperFile = configFile;
                sqlMapper = MyMapper.SqlMapper;
            }
            /// <summary>
            /// 新增,底层默认返回Object
            /// </summary>
            /// <param name="statement"></param>
            /// <param name="parameters"></param>
            /// <returns></returns>
            public object Add(string statement, object parameters)
            {
                return sqlMapper.Insert(statement, parameters);
            }
            /// <summary>
            /// 删除
            /// </summary>
            /// <param name="statement"></param>
            /// <param name="parameters"></param>
            /// <returns></returns>
            public int Delete(string statement, object parameters)
            {
                return sqlMapper.Delete(statement, parameters);
            }
            /// <summary>
            /// 更新
            /// </summary>
            /// <param name="statement"></param>
            /// <param name="parameters"></param>
            /// <returns></returns>
            public int Update(string statement, object parameters)
            {
                return sqlMapper.Update(statement, parameters);
            }
            /// <summary>
            /// 查询返回集合
            /// </summary>
            /// <param name="statement"></param>
            /// <param name="parameters"></param>
            /// <returns></returns>
            public IList<T> QueryForList(string statement, object parameters)
            {
                return sqlMapper.QueryForList<T>(statement, parameters);
            }
            /// <summary>
            /// 查询返回对象
            /// </summary>
            /// <param name="statement"></param>
            /// <param name="parameters"></param>
            /// <returns></returns>
            public object QueryForObj(string statement, object parameters)
            {
                return sqlMapper.QueryForObject(statement, parameters);
            }
        }
    

      3)、实体Orm操作实现:

    一、创建实体类,包含实体对应字段的定义(略)

    二、创建对应的Xml映射文件,例子如下

    <?xml version="1.0" encoding="utf-8" ?>
    <sqlMap namespace="MyBatis3Sample.Model" xmlns="http://ibatis.apache.org/mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <alias>
        <typeAlias alias="Customer" type="MySample.Model.Customer, MySample.Model" />
      </alias>
    
      <!--Mapping Class To Sql Realation Teable-->
      <resultMaps>
        <resultMap id="CustomerResult" class="Customer">
          <result property="CustomerId" column="CustomerId"/>
          <result property="FirstName" column="FirstName"/>
          <result property="LastName" column="LastName"/>
        </resultMap>
      </resultMaps>
    
      <!--Mapping The SQl StateMent about CRUD chenkai-->
      <statements>
        <insert id="New_Customer"  parameterClass="Customer">
        <![CDATA[INSERT INTO  tbCustomer
          ( FirstName ,
          LastName 
          )
          VALUES  ( #FirstName# , #LastName# )]]>
        </insert>
        <update id="Update_CustomerById">
          <![CDATA[
        update tbCustomer  set FirstName=#FirstName#,SecondName=#SecondName#
        where CustomerId=#CustomerId#
        ]]>
        </update>
      <select id ="Select_All_Customer" resultMap="CustomerResult">
        <![CDATA[
        select CustomerId,FirstName,LastName from tbCustomer
        ]]>
      </select>
      <select id="Select_CustomerById" extends="Select_All_Customer" resultMap="CustomerResult">
        <![CDATA[
        where CustomerId=#CustomerId#
        ]]>
      </select>
        <select id="Select_CustomerByNamePrefix" extends="Select_All_Customer" resultMap="CustomerResult">
        <dynamic prepend=" where ">
          <isNotEmpty prepend =" and ">
            FirstName like '$FirstNamePrefix$%'
          </isNotEmpty>
        <isNotEmpty prepend =" and ">
            LastName like '$LastNamePrefix$%'
          </isNotEmpty>
        </dynamic>
      </select>
        
      <select id="Select_CustomerTotalCount"  resultClass="int">
        <![CDATA[
       select count(CustomerId) from tbCustomer
        ]]>
      </select>
      </statements>
    </sqlMap>
    

      分解:

    a、<resultMaps>可包含多个resultmap---字段配置映射关系,将查出的字段映射到对应的类的对应字段

    b、<statements>可包含多个statement---配置Sql语句,大致为select、insert 、update、delete,其他的没有太过深究。

    c、“#FirstName#”其中FirstName为传递的参数,IBatis会自动解析其类型,“'$FirstNamePrefix$%'” 为模糊查询时参数的编写方式,也可以通过参数拼接的方式实现。参数在传递时大小写敏感,这点要注意

    d、注意<dymanic>的动态sql实现,主要是写法。

    e、每个statement的Id必须为一,不可存在重复,即使是在同一项目的其他的xml配置中也不可存在和当前statement的Id一致的statement,否则会报错。因为在ibatis进行配置读取时,会将各个statement加载,要求statement的id必须为一

    f、statement中配置resultMap和resultClass的区别,如果不配置resultMap和resultClass会默认返回object类型,resultMap一般是用于配置到对应的映射配置;resultClass一般用于指向指定的类型,例如string/object等。

    g、 <![CDATA[]]>类似于@“”,将语句标识为不转义。

    总结

    用Ibatis有一段时间了,基于sql编写的实现感觉上还是不错的。

    附上部分帮助文件,例子代码就不上传了,因为是在实现的部分很简单也没有明确的测过。

    Mapper提示文件

    Top
    收藏
    关注
    评论
  • 相关阅读:
    DTOJ #3328. 开箱子(unboxing)
    dtoi4649 光明
    dtoi4539「TJOI / HEOI2016」序列
    dtoi3031 交错和查询 (sum)
    dtoi4375「BJOI2019」删数
    dtoi4266 exchange
    dtoi4680 红黑兔
    dtoi1363 楼房重建 (rebuild)
    dtoi1927 [ONTAK2010]Peaks加强版
    dtoi4538 「TJOI / HEOI2016」排序
  • 原文地址:https://www.cnblogs.com/Joy-et/p/4658350.html
Copyright © 2011-2022 走看看