• IBatis.Net 老技术新研究


    我们现在用的数据访问组件封装了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

  • 相关阅读:
    使用yarn来替代npm
    React及Nextjs相关知识点小结
    appstore-react v2.0—redux-actions和redux-saga的应用
    开机SystemServer到ActivityManagerService启动过程分析
    java 读取气象专业格式NetCDF文件
    maven项目对于maven远程仓库没有资源的解决办法
    leaflet 使用kriging.js实现前端自定义插值
    leaflet 使用高德地图实例
    uni-app上使用leaflet地图的解决方案
    MySQL创建新用户并且赋予权限
  • 原文地址:https://www.cnblogs.com/tianqing/p/7668850.html
Copyright © 2020-2023  润新知