C#-iBatis.NET使用小结

iBatis

  • iBATIS一词来源于“internet”和“abatis”的组合。
  • 是一个基于SQL映射支持Java和·NET的持久层框架。
  • 是一种轻量级的对象关系映射(ORM)框架。
  • 是一种“半自动化”的ORM实现。

iBatis.NET

重要配置文件
  • Providers.config:数据库连接驱动配置文件,我们主要用 SQLServer 数据库连接驱动
  • Mapper.xml:例如: DataPermissions.xml,定义 SQL 语句和结果集映射关系
  • SqlMap.config:统一管理数据库连接驱动、连接信息、Mapper 文件列表
  • Database_***.Config 文件:存储数据库的连接信息

各文件示例:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

‘ # ’和‘ $ ’什么区别?为什么‘ $ ’有 SQL 注入风险?

$不会进行类型匹配,仅仅是替换,#号会进行类型匹配,会转化成相应的数据类型。这
样的话,直接替换就会存在被注入的风险 。

Dao 接口中的方法为什么必须和 SqlMapper 文件中的 SqlID 保持一致?

组件采用了代理模式动态生成的代码实现,内部根据方法名获取的 id。

  • 需要注意,大小写敏感,而且对类型也敏感。若 SQL 没有返回值(如 insert), dao层定义了非 void 类型,会报错。
如何将泛型循环遍历至SQL中

使用iterate
例如:

<iterate conjunction=";" open="" close="" property="ListForInsert">
   INSERT INTO [table] ( [ID] ) VALUES ( #ListForInsert.ID#)
</iterate>
实现一个分页查询功能拼接语句

子句:

<!--分页前缀-->
<sql id="PagePrefix">
  FROM (
  SELECT ROW_NUMBER() OVER(ORDER BY
</sql>
<!--分页中缀-->
<sql id="PageInfix">
  ) AS ROW_NUM,
</sql>
<!--分页后缀-->
<sql id="PageSuffix">
  ) AS TABLEDATA
  <dynamic>
    <isNotNull property="Page">
      <isNotNull property="Rows">
        WHERE ROW_NUM BETWEEN ($Page$-1)*$Rows$+1 AND ($Page$-1)*$Rows$+$Rows$
      </isNotNull>
    </isNotNull>
  </dynamic>
</sql>

使用:

<select id="Get" resultMap="InfoMap" parameterClass="Dto">
      SELECT
      [Table_ID],[Table_State] ,[Table_ShopID]
    <include refid="PagePrefix"></include>
      [Table_State] ASC
    <include refid="PageInfix"></include>
      [Table_ID] ,[Table_State] ,[Table_ShopID]
      FROM [Table] WITH(NOLOCK)
      WHERE DelFlag ='0'
      <isNotEmpty prepend="AND" property="ID">[Table_ID] = #ID#</isNotEmpty>
      <isNotEmpty prepend="AND" property="State">[Table_State] = #State#</isNotEmpty>
      <isNotEmpty prepend="AND" property="ShopID">[Table_ShopID] = #ShopID#</isNotEmpty>
    <include refid="PageSuffix"></include>
</select>
如何处理对xml和代码特殊字符的混淆

使用CDATA
示例:

<!-- 避免XML注释中的‘<’与SQL中做比较的‘<’ 混淆 -->
<![CDATA[
CASE
WHEN [RPSE_StartTime] < GETDATE() AND [RPSE_EndTime] > GETDATE() THEN 2
WHEN [RPSE_EndTime] < GETDATE() THEN 3
WHEN [RPSE_StartTime] > GETDATE() THEN 1
ELSE 0
END
]]> AS ActivityState
如何多层嵌套子查询

resultMap 中嵌套子查询语句

<resultMaps>
  <resultMap id="MemberExclusivePriceActivityAllInfoMap" class="MembersPriceActivityAllInfoVM">
    <result property="ID" column="SABI_ID"/>
    <result property="CityList" column="RPSE_ID=SABI_ID" select="GetRedPacketActivityCitysSubquery"/>
    <result property="GoodsTypeList" column="RPSE_ID=SABI_ID" select="GetRedPacketActivityGoodsTypesSubquery"/>
    <result property="GoodsList" column="SABI_ID=SABI_ID" select="GetMembersPriceAcitivityGoodsSubquery"/>
    <result property="MemberList" column="SABI_ID=SABI_ID,SABI_ShopID=SABI_ShopID" select="GetMemberExclusivePriceActivityMembersSubquery"/>
  </resultMap>
</resultMaps>

子查询语句用HashMap接受参数值

<select id="GetMemberExclusivePriceActivityMembersSubquery" resultMap="MemberListMap" parameterClass="HashMap">
</select>
填写参数类型

入参为string类型:

<select id="GetRedPacketActivityCitys" resultMap="CityListMap" parameterClass="string">
</select>
<select id="GetRedPacketActivityCitys" resultMap="CityListMap" parameterClass="String">
</select>

入参为自定义实体类:

<alias>
    <typeAlias alias="GetRedPacketSharingActivityDto" type="Teld.EC.Mall.Promotion.SPI.GetRedPacketSharingActivityDto,Teld.EC.Mall.Promotion.SPI"/>   
</alias>
<statements>
  <select id="GetRedPacketSharingActivityAllInfo" resultMap="RedPacketSharingActivityAllInfoMap" parameterClass="GetRedPacketSharingActivityDto">
  </select>
</statements>

入参为泛型:

<select id="UpdateRedPacketActivityGoodsTypes" parameterClass="list">
</select>

入参为键值对类型:

<select id=""  resultMap="" parameterClass="System.Collections.IDictionary">
</select>

map中嵌套select传参:

<select id="GetRedPacketListByActivitySubquery" resultMap="PersonRedPackeListMap" parameterClass="HashMap">
</select>
常用的判断类的SQL拼接标签
<dynamic prepend="where">

  <isNotEmpty prepend="AND" property="Type">[AS_Type]=#Type#</isNotEmpty>
  
  <isNotNull prepend="AND" property="Type">[AS_Type]=#Type#</isNotNull >
  
  <isEqual property="UserType" compareValue="1" prepend="AND"></isEqual>
  
  <isEqual property="UserTypeA" compareProperty="UserTypeB" prepend="AND"></isEqual>
  
  <isNotEmpty  property="CityID">
    <isNotEqual prepend="and"  property="CityID" compareValue="*">
      BGO_CityID = #CityID# 
    </isNotEqual>
  </isNotEmpty>

</dynamic>
入参为单纯的 list< string > 时,无成员名称

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值