经过使用IBatisNet,个人感觉作为ORM来mapping的话,是非常不错的。
但如果进行动态sql操作的话,就相当麻烦了,不如采用存储过程,在存储过程中操作即可。
在xml中配置简单的增,删,改,查功能,如一句sql就可以解决的问题再在xml中配置能让使用更加方便,快捷。
这个系列结束了,如有什么问题,共同探讨下。
PS:
最近遇到一个问题,如果所有xml中的id重合的话不行,注意这个问题。起名字的话加个V1啥的。
动态sql就可以解决相关的多表链接查询以及模糊查询的问题
<select id="SelectEemployee" parameterClass="string" resultMap = "MemberMap">
select CardNo,Name from Member
<dynamic prepend="WHERE">
<isParameterPresent>
User_ID = #value#
</isParameterPresent>
</dynamic>
</select>
动态sql写法
<dynamic prepend ="WHERE"> 表示动态sql开始,如果关联表 prepend ="AND",可以为""
<关键字
<!—关键字可以为以下 相关含义
<isEqual> 参数等于值
<isNotEqual> 参数不等于值
<isGreaterThan> 参数大于值
<isGreaterEqual> 参数大于等于值
<isLessEqual> 参数小于等于值
<isPropertyAvailable> 参数被使用
<isNotPropertyAvailable> 参数没有使用
<isNull> 参数 is null
<isNotNull> 参数 is not null
<isEmpty> 参数为空
<isNotEmpty> 参数不为空
<isParameterPresent> 参数类不为NULL
<isNotParameterPresent> 参数类为NULL
-- >
prepend="AND" 连接关键字
property="UserID" 参数
compareValue="20"> 值,也可以为属性名来比较
1.相关sql ,就是动态sql要添加的条件,比如:
Name =#value#
2.重复元素,这个属性适合一个集合,比如SQL中的in 后的集合等
<iterate prepend="AND" 连接关键字
property="NameList" 参数
open="(" open后的串为开始括号作用“(”
close=")" close后的串为结束括号作用“)”
conjunction="OR"> 连接方式 AND 或OR,每个元素之间的符号
Name=#NameList[]#
</iterate>
--以上相当与SQL
And Name = (/open #NameList[0] or/conjunction #NameList[1] or ….)/close
</关键字>
</dynamic>
基本操作讲解完毕,相信简单的应用已经够大家使用了。如有深入的了解再继续探讨
先写个简单的存储过程
create proc InsertMember
(
@UserID int,
@Cardno nvarchar(50),
@Name nvarchar(10)
)
as
begin
insert memeber select @Cardno,@Name
select @UserID=@@identity
end
以下文件配置在Member.xml中进行操作存储过程
<procedure id="InsertMember" 存储过程名称
parameterMap="Member_Par" 对应的parameterMap,接来下马上登场
resultClass="int"> 返回值,同正常返回值
InsertMember
</procedure>
在procedure 中必须设置parameterMap属性,即使存储不带任何参数也需要设置一下。
对应的parameterMap:
<parameterMaps>
<parameterMap id=" Member_Par" 对应 procedure中的parameterMap
class="Member"> 对应的类Member
<parameter property="CardNo" 对应类中属性
column="CardNo" 对应参数的属性
dbType="NVARCHAR" 数据库字段类型
type="string" 自动类型
direction="INPUT" /> 参数类型
<parameter property="Name" 对应类中属性
column="Name" 对应参数的属性
dbType="NVARCHAR" 数据库字段类型
type="string" 自动类型
direction="INPUT" /> 参数类型
<parameter property="User_ID" 对应类中属性
column="User_ID" 对应参数的属性
dbType="INT" 数据库字段类型
type="int" 自动类型
direction="INPUTOUTPUT" /> 返回值参数
</parameterMap>
</parameterMaps>
把表结构填上,避免理解困难
Create table Member
( User_ID int identity(1,1), --自增
CardNo nvarchar(50) not null,
[Name] nvarchar(50) not null)
相关类
namespace ETest.test {
[Serializable]
public class Member { Member类,包括属性存取
private int _user_ID;
private string _name;
private string _cardNO;
public string CardNO {
get { return _cardNO; }
set { _cardNO = value; }}
public string Name {
get { return _name; }
set { _UserName = value; }}
public int User_ID {
get { return _user_ID; }
set { _user_ID = value; }}
}
public class MemberLogic 相关逻辑类,包含所有逻辑
{ private SqlMapper mapper = null;
public MemberLogic () { 构造函数
DomSqlMapBuilder builder = new DomSqlMapBuilder();
mapper = builder.Configure(); mapping
}
public Member Select(int User_ID)
{
return (Member)mapper.QueryForObject("SelectMember", User_ID);
map的自有方法,返还Member.xml中id为“SelectMember”的执行结果,返还结果为对象
}
public void Update(Member member)
{
mapper.Update("SaveMember", member);
map的自有方法,直接对应 Member.xml中id为“SaveMember”的执行.
}
public void Delete(int User_ID)
{
mapper.Update("DeleteMember ", member);
map的自有方法,直接对应 Member.xml中id为“DeleteMember”的执行.
}
}

