1. 程式人生 > >C#-iBatis.NET使用小結

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 > 時,無成員名稱

在這裡插入圖片描述