1. 程式人生 > >IBatis.Net 老技術新研究

IBatis.Net 老技術新研究

了解 可能 拼接 begin arraylist *** isa har column

我們現在用的數據訪問組件封裝了IBatis.Net框架,提供了標準的數據訪問接口和服務。正好總結一下老技術IBatis.Net
在進行實際的數據訪問開發之前,我們先了解一下:IBatis.Net中幾個重要的配置文件和一些關鍵的技術原理:
4個重要的配置文件:

  1. Providers.config:數據庫連接驅動配置文件,我們主要用SQLServer數據庫連接驅動
  2. Mapper.xml,例如: DataPermissions.xml,定義SQL語句和結果集映射關系。
  3. SqlMap.config:統一管理數據庫連接驅動、連接信息、Mapper文件列表
  4. Database_***.Config文件:存儲數據庫的連接信息

關鍵的技術特性

  1. IBatis是一個半自動化的ORM框架,支持多種業界主流的數據庫,支持開發人員寫SQL,這樣開發人員就可以寫出盡可能優化的SQL
  2. SqlMapper文件中主要包含alias類別名,ResultMaps結果集映射,Statements各類SQL語句
  3. SqlMapper文件中,實體類的屬性對應ResultMap中的Property,實體類的屬性同時對應數據庫表中的Column
  4. IBatis中的SqlMapper文件中,#代表SQL綁定;$代表SQL拼接,有SQL註入風險,不建議使用
  5. 基於Castle的代理類技術,支持Dao接口,Dao接口中的方法必須和SqlMapper文件中的SqlID保持一致。這樣DaoService在構造Dao接口的代理實現類時才可以定位到指定的SQL,然後執行。
  6. 支持批量SQL操作,例如Insert、Update和Delete
  7. 支持返回一對多,多對多關聯結果集
  8. 支持數據庫事務
  9. 支持數據緩存:全局緩存和會話緩存

開發一個數據訪問的業務功能,主要有以下4個步驟:

  1. 梳理好業務需求,定義接口;
  2. 定義IBatis Mapper文件,根據接口的方法一一實現SQL語句;
  3. 設置好數據庫連接,將IBatis Mapper文件的路徑添加到SqlMap配置文件中;
  4. 調用DaoService,獲取接口的實現,訪問數據庫。

示例幾個關鍵的寫法
1. 一對多關系,批量Insert

 1   <insert id="SaveDomainModel"
parameterClass="DomainModel"> 2 begin 3 INSERT INTO Meta_DomainModel(ID,Name,RootDomainObjectID, IsCache, CacheStrategy, IsLogicallyDeleted, DataLoaderConfig, Version,Creator,LastModifier)VALUES( 4 #ID#,#Name#,#RootDomainObjectID#,#IsCache:VarChar#,#CacheStrategy#,#IsLogicDelete:VarChar#,#DataLoaderConfig#,#Version#,#Creator#,#LastModifier#) 5 <iterate conjunction=" " open="" close="" property="DomainObjects"> 6 INSERT INTO Meta_DomainObject(ID,Name,DomainModelID,IsRootObject,ParentObjectID,ClazzReflectType,PropertyName,IsLazyLoad,DataObjectID,Creator,LastModifier) 7 VALUES(#DomainObjects[].ID#,#DomainObjects[].Name#,#DomainObjects[].DomainModelID#,#DomainObjects[].IsRootObject:VarChar#,#DomainObjects[].ParentObjectID#,#DomainObjects[].ClazzReflectType#, 8 #DomainObjects[].PropertyName#,#DomainObjects[].IsLazyLoad:VarChar#,#DomainObjects[].DataObjectID#,#DomainObjects[].Creator#,#DomainObjects[].LastModifier#) 9 </iterate> 10 end; 11 </insert>

2. 簡單批量Insert插入

 1     <insert id="SaveDomainObjectElements" parameterClass="ArrayList">
 2       begin
 3       <iterate conjunction=" " open="" close="" >
 4         INSERT INTO Meta_DomainObjectElement(ID,Name,Alias,DisplayName,DomainObjectID,DataType,Length,Precision,DefaultValue,IsAllowNull,ElementType,DataColumnID,
 5         PropertyType,PropertyName,IsForQuery,Creator,LastModifier)
 6         VALUES(#[].ID#,#[].Name#,#[].Alias#,#[].DisplayName#,#[].DomainObjectID#,#[].DataType#,#[].Length#,#[].Precision#,#[].DefaultValue#,#[].IsAllowNull:VarChar#,#[].ElementType#,#[].DataColumnID#,
 7         #[].PropertyType#,#[].PropertyName#,#[].IsForQuery:VarChar#,#[].Creator#,#[].LastModifier#)
 8       </iterate>
 9       end;
10     </insert>

3. 查詢一對多結果集

 1   <resultMap id="DataObjectResultMap" class="DataObject" groupby="ID">
 2       <result property="ID" column="ID" />
 3       <result property="Name" column="Name" />
 4       <result property="Descriptions" column="Descriptions" />
 5       <result property="DataSourceName" column="DataSourceName" />
 6       <result property="LogicTableName" column="LogicTableName" />
 7       <result property="IsTableSharding" column="IsTableSharding" />
 8       <result property="IsDatabaseSharding" column="IsDatabaseSharding" />
 9       <result property="TableShardingStrategyID" column="TableShardingStrategy" />
10       <result property="DatabaseShardingStrategyID" column="DatabaseShardingStrategy" />
11       <result property="IsView" column="IsView" />
12       <result property="IsLogicallyDeleted" column="IsLogicallyDeleted" />
13       <result property="Version" column="Version" />
14       <result property="Columns" resultMapping="MetadataMapper.DataColumnResultMap"></result>
15       <result property="Creator" column="Creator" />
16       <result property="CreateTime" column="CreateTime" />
17       <result property="LastModifier" column="LastModifier" />
18       <result property="LastModifyTime" column="LastModifyTime" />
19     </resultMap>
20     <resultMap id="DataColumnResultMap" class="DataColumn">
21       <result property="ID" column="C_ID" />
22       <result property="ColumnName" column="ColumnName" />
23       <result property="DisplayName" column="DisplayName" />
24       <result property="DataObjectID" column="DataObjectID" />
25       <result property="DataTypeID" column="DataType" />
26       <result property="Length" column="Length" />
27       <result property="Precision" column="Precision" />
28       <result property="DefaultValue" column="DefaultValue" />
29       <result property="IsNullable" column="IsNullable" />
30       <result property="IsPkColumn" column="IsPkColumn" />
31       <result property="IsSystem" column="IsSystem" />
32       <result property="IsShardingColumn" column="IsShardingColumn" />      
33       <result property="ColumnOrder" column="ColumnOrder" />
34       <result property="Creator" column="C_Creator" />
35       <result property="CreateTime" column="C_CreateTime" />
36       <result property="LastModifier" column="C_LastModifier" />
37       <result property="LastModifyTime" column="C_LastModifyTime" />
38     </resultMap>
39   

對應的Select 語句

1     <select id="GetDataObject" resultMap="DataObjectResultMap" parameterClass="string">
2       SELECT Meta_DataObject.ID,Meta_DataObject.Name,Descriptions, DataSourceName, LogicTableName, IsTableSharding, IsDatabaseSharding, TableShardingStrategy,DatabaseShardingStrategy,IsView,IsLogicallyDeleted,Version,Meta_DataObjectColumn.Creator,Meta_DataObjectColumn.LastModifier,Meta_DataObjectColumn.CreateTime,Meta_DataObjectColumn.LastModifyTime,
3       Meta_DataObjectColumn.ID as C_ID,ColumnName,DisplayName,DataObjectID,DataType,Length,Precision,DefaultValue,IsNullable,IsPkColumn,IsShardingColumn,IsSystem,ColumnOrder,
4       Meta_DataObjectColumn.Creator as C_Creator,Meta_DataObjectColumn.LastModifier as C_LastModifier,Meta_DataObjectColumn.CreateTime as C_CreateTime,Meta_DataObjectColumn.LastModifyTime as C_LastModifyTime
5       FROM Meta_DataObject
6       LEFT JOIN Meta_DataObjectColumn on Meta_DataObjectColumn.DataObjectID = Meta_DataObject.ID
7       WHERE Meta_DataObject.ID=#id#
8     </select>

4. 批量刪除多張表

1    <delete id="DeleteShardingStrategy" parameterClass="string">
2       begin
3       DELETE FROM Meta_ShardingColumn WHERE ShardingStrategyID=#id#
4       DELETE FROM Meta_ShardingStrategy WHERE ID=#id#
5       end;
6     </delete>

5. 刪除指定數據

1  <delete id="DeleteShardingColumns" parameterClass="string">
2       DELETE FROM Meta_ShardingColumn WHERE DataObjectID=#id#
3     </delete>

6. 查詢數據行數

1 <select id="IsTaskExist" resultClass="int" parameterClass="string">
2       SELECT COUNT(1) FROM TableTask WHERE name=#Name#
3     </select>

以上就是一些簡單的IBatis.Net總結。

周國慶

2017/10/14

IBatis.Net 老技術新研究