最近加班比较忙,时间也比较琐碎,蛮久没有写东西了。这次就总结一下自己使用IBatis.net的一些总结吧。
IBatis简介
IBatis.net是一款开源的Orm框架,应该算是从java的IBatis项目演化而来的基于C#的Orm框架。
项目下载地址: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编写的实现感觉上还是不错的。
附上部分帮助文件,例子代码就不上传了,因为是在实现的部分很简单也没有明确的测过。