最近加班比较忙,时间也比较琐碎,蛮久没有写东西了。这次就总结一下自己使用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 = @"ConfigFile\SqlMap.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提示文件

IBatis.net初步使用的更多相关文章

  1. 【转】ibatis的简介与初步搭建应用

    [转]ibatis的简介与初步搭建应用 一.ibatis的简介 ibatis是什么东西就不介绍了,自己去找谷老师. 这里讲下自己的使用体会.之前自己学过Hibernate,是看尚学堂的视频教学的,看完 ...

  2. [入门级] 基于 visual studio 2010 mvc4 的图书管理系统开发初步 (二)

    [入门级] 基于 visual studio 2010 mvc4 的图书管理系统开发初步 (二) Date  周六 10 一月 2015 By 钟谢伟 Category website develop ...

  3. iBatis.net技术实践

    随着大数据技术的兴起和快速发展,人们更多的开始关注HDFS.HBase.Hive等技术.但是谈到强一致性,我们又不得不回归现实,只能继续沿用RDBMS存储强一致性的数据.我们日常接触到的绝大多数的应用 ...

  4. ibatis源码学习4_参数和结果的映射原理

    问题在详细介绍ibatis参数和结果映射原理之前,让我们先来思考几个问题.1. 为什么需要参数和结果的映射?相对于全自动的orm,ibatis一个重要目标是,通过维护POJO与SQL之间的映射关系,让 ...

  5. 移动端之Android开发的几种方式的初步体验

    目前越来越多的移动端混合开发方式,下面列举的大多数我都略微的尝试过,就初步的认识写个简单的心得: 开发方式 开发环境 是否需要AndroidSDK 支持跨平台 开发语言&技能 MUI Win+ ...

  6. 值得注意的ibatis动态sql语法格式

    一.Ibatis常用动态sql语法,简单粗暴用一例子 <select id="iBatisSelectList" parameterClass="java.util ...

  7. org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):

    org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): da.huying.usermanag ...

  8. CSharpGL(29)初步封装Texture和Framebuffer

    +BIT祝威+悄悄在此留下版了个权的信息说: CSharpGL(29)初步封装Texture和Framebuffer +BIT祝威+悄悄在此留下版了个权的信息说: Texture和Framebuffe ...

  9. Android自定义View初步

    经过上一篇的介绍,大家对于自定义View一定有了一定的认识,接下来我们就以实现一个图片下显示文字的自定义View来练习一下.废话不多说,下面进入我们的正题,首先看一下我们的思路,1.我们需要通过在va ...

随机推荐

  1. C#的百度地图开发(一)发起HTTP请求

    原文:C#的百度地图开发(一)发起HTTP请求 百度地图的开发文档中给出了很多的事例,而当用到具体的语言来开发时,又会有些差异.我是使用C#来开发的.在获取相应的数据时,需要通过URL传值,然后获取相 ...

  2. Python的Tkinter去除边框

    from Tkinter import * class Application(Frame): def __init__(self,master=None, *args, **kwargs): Fra ...

  3. 利用python 提取log 文件里的关键句子,并进行统计分析

    利用python开发了一个提取sim.log 中的各个关键步骤中的时间并进行统计的程序: #!/usr/bin/python2.6 import re,datetime file_name='/hom ...

  4. TSL230选型

    tsl230是一种可以直接将光强转化成频率值的器件.详细原理就不介绍了,数据手冊里写的都非常清楚,230系列包括非常多种,主要为下面四类:TSL230,TSL230A,TSL230B系列:TSL230 ...

  5. spring 普通类获取四大作用域request、applicationContext、session、page

    几乎所有web应用容器都提供了四种类似Map的结构:application session request page,Jsp或者Servlet通过向着这四个对象放入数据,从而实现Jsp和Servlet ...

  6. 关于SVN配置文件的一个小例子

    1   背景假设 厦门央瞬公司是一家电子元器件设备供应商,其中有个ARM部门,专门负责ARM芯片的方案设计.销售,并在北京.上海各设立了一个办事处.对于工作日志,原先采用邮件方式发给经理,但是这种方式 ...

  7. 多线程之join方法

    join方法的功能就是使异步执行的线程变成同步执行.也就是说,当调用线程实例的start方法后,这个方法会立即返回,如果在调用start方法后后需要使用一个由这个线程计算得到的值,就必须使用join方 ...

  8. hdu 2082 生成函数

    主题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2082 找单词 Time Limit: 1000/1000 MS (Java/Others)    Me ...

  9. ACM/ICPM2014鞍山现场赛D Galaxy (HDU 5073)

    题目链接:pid=5073">http://acm.hdu.edu.cn/showproblem.php?pid=5073 题意:给定一条线上的点,然后能够去掉当中的m个,使剩下的到重 ...

  10. lightoj1038(期望dp)

    给定一个数字d,随机选择一个d的约数,然后让d除以这个约数,形成新的d,不断继续这个步骤,知道d=1为止, 要我们求将d变为1的期望次数 设d1,d2...dj是除以约数后,形成的行的d,且dj==d ...