文档章节

IBatis.net使用说明

JungleKing
 JungleKing
发布于 2016/11/23 19:51
字数 923
阅读 28
收藏 0

IBatis.net是移植于java版本,所以在.net平台上的操作和java平台上的操作基本没有什么太大的差别。严格来说,ibatis.net并不算的上是一种orm,因为它的sql语句均写到了配置文件中,没有自己专门的sql映射语句。但是相比Nhibernate来说,不仅简易,而且方便易学。学习成本还是很低的。

         回到正规话题上来,实例IBatis.net需要两个类库:IBatisNet.DataMapper.dll和IBatisNet.Common.dll,新建项目,我的项目结构如下:

 

然后在使用ibatis.net框架的时候,需要配置三个config文件,第一个为database.config文件,里面则是配置数据库连接等信息的记录节点,如下图所示:

 

第二个配置文件为providers.config,则记录了数据驱动的详细信息,可以通过在database.config中的provider节点来设置使用哪一个数据驱动。

第三个配置文件为sqlmap.config,这个文件则是用来进行一些数据集方面的配置。

需要注意的是,在项目中,所有的xml文件和.config文件,都需要设置为嵌入的资源才行。

下面开始参看代码:

首先是SQLHelper.cs的代码:

 

复制代码

using IBatisNet.DataMapper;

using System.Reflection;

using System.IO;

using IBatisNet.DataMapper.Configuration;

using IBatisNet.DataMapper.Configuration.Statements;

using IBatisNet.DataMapper.MappedStatements;

using IBatisNet.DataMapper.Scope;

using System.Data;

using IBatisNet.Common;

using System;



namespace SQLMaps

{


publicclass SQLHelper

{


publicstatic ISqlMapper SqlMap;



privatestaticreadonlyobject syncObj =newobject();



///<summary>

/// ISqlMapper对象生成

///</summary>

static SQLHelper()

{


if (SqlMap ==null)

{


lock (syncObj)

{


if (SqlMap ==null)

{

Assembly asembly
= Assembly.Load("SQLMaps");

Stream stream
= asembly.GetManifestResourceStream("SQLMaps.sqlmap.config"); //得到xml数据流



DomSqlMapBuilder builder =new DomSqlMapBuilder();

SqlMap
= builder.Configure(stream);

}

}

}

}




///<summary>

/// 返回DataSet数据集

///</summary>

publicstatic DataSet QueryForDataSet(string tag, object paramObject)

{

DataSet ds
=new DataSet();

IDbCommand command
= GetDbCommand(tag,paramObject);

SqlMap.LocalSession.CreateDataAdapter(command).Fill(ds);


return ds;

}




///<summary>

/// 返回DataTable数据集

///</summary>

publicstatic DataTable QueryForDataTable(string tag, object paramObject)

{


return QueryForDataSet(tag, paramObject).Tables[0];

}




///<summary>

/// 用于分页的DataTable数据集

///</summary>

publicstatic DataTable QueryForDataTable(string tag, object paramObject, int PageSize, int curPage, outint recCount)

{

IDataReader dr
=null;

bool isSessionLocal =false;

string sql = QueryForSql(tag,paramObject);

string strCount ="select count(*) "+ sql.Substring(sql.ToLower().IndexOf("from"));



IDalSession session
= SqlMap.LocalSession;

DataTable dt
=new DataTable();

if (session ==null)

{

session
=new SqlMapSession(SqlMap);

session.OpenConnection();

isSessionLocal
=true;

}




try

{

IDbCommand cmdCount
= GetDbCommand(tag, paramObject);

cmdCount.Connection
= session.Connection;

cmdCount.CommandText
= strCount;

object count = cmdCount.ExecuteScalar();

recCount
= Convert.ToInt32(count);



IDbCommand cmd
= GetDbCommand(tag, paramObject);

cmd.Connection
= session.Connection;

dr
= cmd.ExecuteReader();



dt
= QueryForPaging(dr, PageSize, curPage);

}


finally

{

if (isSessionLocal)

{

session.CloseConnection();

}

}


return dt;

}




///<summary>

/// 获取数据

///</summary>

protectedstatic DataTable QueryForPaging(IDataReader dataReader, int PageSize, int curPage)

{

DataTable dt
=new DataTable();

int colCount = dataReader.FieldCount;

for (int i =0; i < colCount; i++)

{

dt.Columns.Add(
new DataColumn(dataReader.GetName(i),dataReader.GetFieldType(i)));

}




//读取数据,将DataReader中的数据读取到DataTable中去

object[] vald =newobject[colCount];

int iCount =0; //临时记录变量

while (dataReader.Read())

{


//当前记录在当前页记录范围内

if (iCount >= PageSize * (curPage -1) && iCount < PageSize * curPage)

{


for (int i =0; i < colCount; i++)

{

vald[i]
= dataReader.GetValue(i);

}

dt.Rows.Add(vald);

}


elseif (iCount > PageSize * curPage)

{


break;

}

iCount
++;

}




if (!dataReader.IsClosed)

{

dataReader.Close();

dataReader.Dispose();

}


return dt;

}

}

}

复制代码

具体的model类我就不说了,至于BLL类,则是根据配置文件来进行操作的,具体的如下:

 

View Code

而这些操作是根据Person.xml的sql语句来的,具体内容如下:

 

复制代码

<?xml version="1.0" encoding="utf-8" ?>



<sqlMap namespace="Person" xmlns="http://ibatis.apache.org/mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">



<alias>

<typeAlias alias="Person" type="Model.Person,Model"/>

</alias>



<resultMaps>

<resultMap id="SelectAllResult" class="Person">

<result property="Id" column="PER_ID"/>

<result property="FirstName" column="PER_FIRST_NAME"/>

<result property="LastName" column="PER_LAST_NAME"/>

<result property="BirthDate" column="PER_BIRTH_DATE"/>

<result property="WeightInKilograms" column="PER_WEIGHT_KG"/>

<result property="HeightInMeters" column="PER_HEIGHT_M"/>

</resultMap>

</resultMaps>



<statements>

<select id="SelectAllPerson" resultMap="SelectAllResult">

select

PER_ID,

PER_FIRST_NAME,

PER_LAST_NAME,

PER_BIRTH_DATE,

PER_WEIGHT_KG,

PER_HEIGHT_M

from PERSON


</select>



<select id="SelectAllPerson2" resultMap="SelectAllResult">

select

PER_ID AS Id,

PER_FIRST_NAME AS FirstName,

PER_LAST_NAME AS LastName,

PER_BIRTH_DATE AS BirthDate,

PER_WEIGHT_KG AS WeightInKilograms,

PER_HEIGHT_M AS HeightInMeters

from PERSON


<dynamic prepend="WHERE">

<isParameterPresent>

PER_FIRST_NAME LIKE #FirstName#+'%'

</isParameterPresent>

</dynamic>

</select>



<select id="SelectByPersonId" resultClass="Person" parameterClass="int">

select

PER_ID,

PER_FIRST_NAME,

PER_LAST_NAME,

PER_BIRTH_DATE,

PER_WEIGHT_KG,

PER_HEIGHT_M

from PERSON

where PER_ID = #value#


</select>



<insert id="InsertPerson" parameterclass="Person">

<selectKey property="Id" type="post" resultClass="int">

${selectKey}

</selectKey>

insert into Person

( PER_FIRST_NAME,

PER_LAST_NAME,

PER_BIRTH_DATE,

PER_WEIGHT_KG,

PER_HEIGHT_M)

values

(#FirstName#,#LastName#,#BirthDate#, #WeightInKilograms#, #HeightInMeters#)


</insert>



<update id="UpdatePerson"

parameterclass="Person">

<![CDATA[ update Person set

PER_FIRST_NAME =#FirstName#,

PER_LAST_NAME =#LastName#,

PER_BIRTH_DATE =#BirthDate#,

PER_WEIGHT_KG=#WeightInKilograms#,

PER_HEIGHT_M=#HeightInMeters#

where

PER_ID = #Id# 
]]>

</update>



<delete id="DeletePerson" parameterclass="Person">

delete from Person

where

PER_ID = #Id#


</delete>



</statements>

</sqlMap>

复制代码

 

下面的文章将会整合log4net开发,并且更加详细。谢谢

本文转载自:http://www.cnblogs.com/scy251147/archive/2011/06/19/2084671.html

JungleKing
粉丝 4
博文 102
码字总数 9821
作品 0
天津
程序员
私信 提问
IBatis.net ORM初体验

IBatis.net介绍 IBatis.net 是2001年发起的开源项目,它是一个轻量级的ORM框架,现在IBatisNET已经是属于Apache下的一个子项目了,最新版本是1.6.2. 官方网站:http://www.mybatis.org/ .net项目...

Yamazaki
2014/04/20
75
0
net开源项目

1 以色列 特思开源软件 http://cn.tersus.com/#Id=3924 2 开源社区 http://www.ctochina.net/ .NET开源项目链接 http://www.cnblogs.com/dustinyang/articles/361479.html...

冰点沐雪
2012/07/22
0
0
ibatis 的 "This SQL map does not contain a MappedStatement"的错误

错误是:This SQL map does not contain a MappedStatement named GetAppealByMul 异常详细信息: IBatisNet.DataMapper.Exceptions.DataMapperException: This SQL map does not contain a ......

喔喔娜
2012/03/13
6.3K
4
ibatis.net查询float类型返回实体类或者ResultMap时无效的问题

ibatis.net下出现的问题 数据库里有一个float类型的Amount字段,实体类中Amount的对应类型为Decimal,一直不能正确返回带有value的实体类。排除发现是该Amount字段导致(去掉Amount字段查询则...

刘昌鑫
2016/12/07
36
0
ado.net快速上手实践篇(二)

我们接着上文继续完成我们的ado.net简单实践。 五、dal层数据访问实现 在这里我们使用前一篇文章里实现的数据持久化层和伪SqlMapper对象,实现数据操作。下面我们来看看Dal下核心的Dao如何实...

嗯哼9925
2017/11/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Phpstorm2018 永久激活

1、安装phpstorm,安装包请自行官网下载 http://www.jetbrains.com/phpstorm/download/ 2、下载JetbrainsCrack.jar文件,存放至你的phpstorm执行文件同级目录下 下载JetbrainsCrack.jar 提取...

happyfish319
3分钟前
0
0
谈一谈Android进程间通信的几种方式

###来看一下Android中除了AIDL还有哪些进程间通信的方式: 1、Bundle Bundle实现了Parcelable,所以在Android中我们可以通过Intent在不同进程间传递Bundle数据。 但是在Intent 传输数据的过程...

二营长的意大利炮手
4分钟前
1
0
互联网薪资“高开低走”,你的能力是否真的可以匹配高薪?

对于国内外主流互联网大厂,技术出身似乎已经成为各大掌门人的必备标签。谷歌 CEO 桑达尔·皮查伊、马克·扎克伯格、李彦宏、马化腾、雷军等等皆为技术人出身,都曾参与了公司内部重要产品的...

Java技术剑
5分钟前
1
0
java 多线程

线程声明周期 线程的五个状态:新建,就绪,运行,阻塞,死亡。 其中就绪和运行两个状态客户互相转换,但运行到阻塞,阻塞到就绪,只能单向转换。 刚new出的线程就是【新建】状态,调用start...

雷开你的门
7分钟前
2
0
构造器Constructor是否可被overrid

构造器不能被重写,不能用static修饰构造器,只能用public private protected这三个权限修饰符,且不能有返回语句。

无名氏的程序员
11分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部