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>