在Asp.net中应用IbatisNet框架,第一个需要解决的就是配置问题。实际上,这个过程非常简单。
在开发包里我们可以找到providers.config文件。这是一个数据库连接参数的配置文件。这里,已经包括了各种我们常用的数据库,每一个<provider />就是一种连接方式。我们要做的就是根据项目实际使用的数据库类型,选中一种合适的连接方式,将对应的<provider>中的"enabled"属性值改为"true",其他的全改为false.这是第一步。然后我们就要配置sqlmap.config。如下:
<?xml version="1.0" encoding="UTF-8" ?>
<sqlMapConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="SqlMapConfig.xsd">
<settings>
<setting useStatementNamespaces="false"/>
<setting cacheModelsEnabled="true"/>
</settings>
<database>
<provider name="sqlServer1.1"/>
<dataSource name="test" connectionString="server=hpserver;database=testDB;user id=test;password=123;Connection Reset=FALSE;Min Pool Size=1;Max Pool Size=100"/>
</database>
<sqlMaps>
<sqlMap resource="maps/HotelFacility.xml"/>
</sqlMaps>
</sqlMapConfig>
这里<database>中,<provider>的name属性填上刚才proviers.config文件中对应的数据库连接名称。值得注意的是,在连接字符串中可以直接设置连接池。<sqlMaps>中,设置sql语句的配置文件相对路径。
下面是sql语句的配置文件内容:
<?xml version="1.0" encoding="UTF-8" ?>
<sqlMap namespace="HotelFacility" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="SqlMap.xsd">
<alias>
<typeAlias alias="HotelFacility" assembly="Ehotel.dll" type="Etmc.App.Ehotel.Hotel.HotelFacilityInfoVo" />
</alias>
<resultMaps>
<resultMap id="HotelFacilityResult" class="HotelFacility">
<result property="Introduce" column="Introduce"/>
<result property="Meal" column="Meal"/>
<result property="Meeting" column="Meeting"/>
<result property="Fallow" column="Fallow"/>
<result property="Service" column="Service"/>
<result property="Subject" column="Subject"/>
<result property="SubjectContent" column="SubjectContent"/>
<result property="RoomNum" column="RoomNum"/>
</resultMap>
</resultMaps>
<!-- =============================================
MAPPED STATEMENTS
=============================================
-->
<statements>
<select id="GetHotelFacility" resultMap="HotelFacilityResult" parameterClass="string">
select
Introduce,
Meal,
Meeting,
Fallow,
Service,
Subject,
SubjectContent,
RoomNum
from Hotel
where HotelId = #value#
</select>
<update id="SaveHotelFacility" parameterClass="HotelFacility" resultClass="int">
update Hotel set
Introduce = #Introduce#,
Meal = #Meal#,
Meeting = #Meeting#,
Fallow = #Fallow#,
Service = #Service#,
Subject = #Subject#,
SubjectContent = #SubjectContent#,
RoomNum = #RoomNum#
where HotelId = #HotelId#
</update>
</statements>
</sqlMap>
<alias>中定义值对象所在dll包及包名。
<resultMaps>定义值对象中各值与数据库字段的映射关系
<statements>定义数据库操作语句。 如果需要传入多个参数,可以以值对象的形式传参,语句中以对象中的属性名引用,首尾加上#。
下面是刚才提到的值对象的代码:
public class HotelFacilityInfoVo
... {
Private Fields#region Private Fields
/**//// <summary>
/// 酒店ID
/// </summary>
private int _HotelId;
/**//// <summary>
/// 餐饮
/// </summary>
private string _Meal;
/**//// <summary>
/// 介绍
/// </summary>
private string _Introduce;
/**//// <summary>
/// 会议设施
/// </summary>
private string _Meeting;
/**//// <summary>
/// 休闲设施
/// </summary>
private string _Fallow;
/**//// <summary>
/// 服务设施
/// </summary>
private string _Service;
/**//// <summary>
/// 主题
/// </summary>
private string _Subject;
/**//// <summary>
/// 主题介绍
/// </summary>
private string _SubjectContent;
/**//// <summary>
/// 客房总数
/// </summary>
private int _RoomNum;
#endregion
Properties#region Properties
public int HotelId
...{
get ...{ return _HotelId; }
set ...{ _HotelId = value; }
}
public string Introduce
...{
get ...{ return _Introduce; }
set ...{ _Introduce = value; }
}
public string Meal
...{
get ...{ return _Meal; }
set ...{ _Meal = value; }
}
public string Meeting
...{
get ...{ return _Meeting; }
set ...{ _Meeting = value; }
}
public string Fallow
...{
get ...{ return _Fallow; }
set ...{ _Fallow = value; }
}
public string Service
...{
get ...{ return _Service; }
set ...{ _Service = value; }
}
public string Subject
...{
get ...{ return _Subject; }
set ...{ _Subject = value; }
}
public string SubjectContent
...{
get ...{ return _SubjectContent; }
set ...{ _SubjectContent = value; }
}
public int RoomNum
...{
get ...{ return _RoomNum; }
set ...{ _RoomNum = value; }
}
#endregion
}
下面最后一步,在Dao中调用。在这里提一下,对于获取sqlmapper实例,大致有两种方式:
一、ISqlMapper mapper = IBatisNet.DataMapper.Mapper.Instance();
二、DomSqlMapBuilder builder = new DomSqlMapBuilder();
mapper = builder.Configure();
第一种方法是线程安全的,获得的是唯一实例,在并发访问的时候会出错。因此,为了支持并发访问,所以我选择了第二种方法。至于第一种相比第二种方法的优点,我也不是很清楚。下面执行的语句就非常容易了。
HotelFacilityInfoVo hotelFacility = (HotelFacilityInfoVo)mapper.QueryForObject("GetHotelFacility", innHotelID);
这里返回的是个值对象,QueryForObject方法的第一参数是配置文件定义的查询语句的名称,第二个参数是执行查询语句的输入参数(当多个参数时,可传入值对象)。另外,框架还提供其他多种查询方式,可以参考使用手册。
这样,一个简单的实战应用就完成了,此文只是简单描述一下IbatisNet框架的配置及应用方式,具体更深入的东东还得研究官方提供的参考手册了