C#-iBatis.NET使用小結
阿新 • • 發佈:2018-12-26
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>