IBatis.Net 老技术新研究
我们现在用的数据访问组件封装了IBatis.Net框架,提供了标准的数据访问接口和服务。正好总结一下老技术IBatis.Net
在进行实际的数据访问开发之前,我们先了解一下:IBatis.Net中几个重要的配置文件和一些关键的技术原理:
4个重要的配置文件:
- Providers.config:数据库连接驱动配置文件,我们主要用SQLServer数据库连接驱动
- Mapper.xml,例如: DataPermissions.xml,定义SQL语句和结果集映射关系。
- SqlMap.config:统一管理数据库连接驱动、连接信息、Mapper文件列表
- Database_***.Config文件:存储数据库的连接信息
关键的技术特性
- IBatis是一个半自动化的ORM框架,支持多种业界主流的数据库,支持开发人员写SQL,这样开发人员就可以写出尽可能优化的SQL
- SqlMapper文件中主要包含alias类别名,ResultMaps结果集映射,Statements各类SQL语句
- SqlMapper文件中,实体类的属性对应ResultMap中的Property,实体类的属性同时对应数据库表中的Column
- IBatis中的SqlMapper文件中,#代表SQL绑定;$代表SQL拼接,有SQL注入风险,不建议使用
- 基于Castle的代理类技术,支持Dao接口,Dao接口中的方法必须和SqlMapper文件中的SqlID保持一致。这样DaoService在构造Dao接口的代理实现类时才可以定位到指定的SQL,然后执行。
- 支持批量SQL操作,例如Insert、Update和Delete
- 支持返回一对多,多对多关联结果集
- 支持数据库事务
- 支持数据缓存:全局缓存和会话缓存
开发一个数据访问的业务功能,主要有以下4个步骤:
- 梳理好业务需求,定义接口;
- 定义IBatis Mapper文件,根据接口的方法一一实现SQL语句;
- 设置好数据库连接,将IBatis Mapper文件的路径添加到SqlMap配置文件中;
- 调用DaoService,获取接口的实现,访问数据库。
示例几个关键的写法
1. 一对多关系,批量Insert
<insert id="SaveDomainModel" parameterClass="DomainModel">
begin
INSERT INTO Meta_DomainModel(ID,Name,RootDomainObjectID, IsCache, CacheStrategy, IsLogicallyDeleted, DataLoaderConfig, Version,Creator,LastModifier)VALUES(
#ID#,#Name#,#RootDomainObjectID#,#IsCache:VarChar#,#CacheStrategy#,#IsLogicDelete:VarChar#,#DataLoaderConfig#,#Version#,#Creator#,#LastModifier#)
<iterate conjunction=" " open="" close="" property="DomainObjects">
INSERT INTO Meta_DomainObject(ID,Name,DomainModelID,IsRootObject,ParentObjectID,ClazzReflectType,PropertyName,IsLazyLoad,DataObjectID,Creator,LastModifier)
VALUES(#DomainObjects[].ID#,#DomainObjects[].Name#,#DomainObjects[].DomainModelID#,#DomainObjects[].IsRootObject:VarChar#,#DomainObjects[].ParentObjectID#,#DomainObjects[].ClazzReflectType#,
#DomainObjects[].PropertyName#,#DomainObjects[].IsLazyLoad:VarChar#,#DomainObjects[].DataObjectID#,#DomainObjects[].Creator#,#DomainObjects[].LastModifier#)
</iterate>
end;
</insert>
2. 简单批量Insert插入
<insert id="SaveDomainObjectElements" parameterClass="ArrayList">
begin
<iterate conjunction=" " open="" close="" >
INSERT INTO Meta_DomainObjectElement(ID,Name,Alias,DisplayName,DomainObjectID,DataType,Length,Precision,DefaultValue,IsAllowNull,ElementType,DataColumnID,
PropertyType,PropertyName,IsForQuery,Creator,LastModifier)
VALUES(#[].ID#,#[].Name#,#[].Alias#,#[].DisplayName#,#[].DomainObjectID#,#[].DataType#,#[].Length#,#[].Precision#,#[].DefaultValue#,#[].IsAllowNull:VarChar#,#[].ElementType#,#[].DataColumnID#,
#[].PropertyType#,#[].PropertyName#,#[].IsForQuery:VarChar#,#[].Creator#,#[].LastModifier#)
</iterate>
end;
</insert>
3. 查询一对多结果集
<resultMap id="DataObjectResultMap" class="DataObject" groupby="ID">
<result property="ID" column="ID" />
<result property="Name" column="Name" />
<result property="Descriptions" column="Descriptions" />
<result property="DataSourceName" column="DataSourceName" />
<result property="LogicTableName" column="LogicTableName" />
<result property="IsTableSharding" column="IsTableSharding" />
<result property="IsDatabaseSharding" column="IsDatabaseSharding" />
<result property="TableShardingStrategyID" column="TableShardingStrategy" />
<result property="DatabaseShardingStrategyID" column="DatabaseShardingStrategy" />
<result property="IsView" column="IsView" />
<result property="IsLogicallyDeleted" column="IsLogicallyDeleted" />
<result property="Version" column="Version" />
<result property="Columns" resultMapping="MetadataMapper.DataColumnResultMap"></result>
<result property="Creator" column="Creator" />
<result property="CreateTime" column="CreateTime" />
<result property="LastModifier" column="LastModifier" />
<result property="LastModifyTime" column="LastModifyTime" />
</resultMap>
<resultMap id="DataColumnResultMap" class="DataColumn">
<result property="ID" column="C_ID" />
<result property="ColumnName" column="ColumnName" />
<result property="DisplayName" column="DisplayName" />
<result property="DataObjectID" column="DataObjectID" />
<result property="DataTypeID" column="DataType" />
<result property="Length" column="Length" />
<result property="Precision" column="Precision" />
<result property="DefaultValue" column="DefaultValue" />
<result property="IsNullable" column="IsNullable" />
<result property="IsPkColumn" column="IsPkColumn" />
<result property="IsSystem" column="IsSystem" />
<result property="IsShardingColumn" column="IsShardingColumn" />
<result property="ColumnOrder" column="ColumnOrder" />
<result property="Creator" column="C_Creator" />
<result property="CreateTime" column="C_CreateTime" />
<result property="LastModifier" column="C_LastModifier" />
<result property="LastModifyTime" column="C_LastModifyTime" />
</resultMap>
对应的Select 语句
<select id="GetDataObject" resultMap="DataObjectResultMap" parameterClass="string">
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,
Meta_DataObjectColumn.ID as C_ID,ColumnName,DisplayName,DataObjectID,DataType,Length,Precision,DefaultValue,IsNullable,IsPkColumn,IsShardingColumn,IsSystem,ColumnOrder,
Meta_DataObjectColumn.Creator as C_Creator,Meta_DataObjectColumn.LastModifier as C_LastModifier,Meta_DataObjectColumn.CreateTime as C_CreateTime,Meta_DataObjectColumn.LastModifyTime as C_LastModifyTime
FROM Meta_DataObject
LEFT JOIN Meta_DataObjectColumn on Meta_DataObjectColumn.DataObjectID = Meta_DataObject.ID
WHERE Meta_DataObject.ID=#id#
</select>
4. 批量删除多张表
<delete id="DeleteShardingStrategy" parameterClass="string">
begin
DELETE FROM Meta_ShardingColumn WHERE ShardingStrategyID=#id#
DELETE FROM Meta_ShardingStrategy WHERE ID=#id#
end;
</delete>
5. 删除指定数据
<delete id="DeleteShardingColumns" parameterClass="string">
DELETE FROM Meta_ShardingColumn WHERE DataObjectID=#id#
</delete>
6. 查询数据行数
<select id="IsTaskExist" resultClass="int" parameterClass="string">
SELECT COUNT(1) FROM TableTask WHERE name=#Name#
</select>
以上就是一些简单的IBatis.Net总结。
周国庆
2017/10/14
IBatis.Net 老技术新研究的更多相关文章
- 老技术新谈,Java应用监控利器JMX(2)
各位坐稳扶好,我们要开车了.不过在开车之前,我们还是例行回顾一下上期分享的要点. 上期由于架不住来自于程序员内心的灵魂的拷问,于是我们潜心修炼,与 Java 应用监控利器 JMX 正式打了个照面. J ...
- 老技术新谈,Java应用监控利器JMX(3)
各位坐稳扶好,我们要开车了.不过在开车之前,我们还是例行回顾一下上期分享的要点. 上期我们深入的聊了聊 JMX,把 JMX 的架构了解了七七八八,最后通过代码实战,解决系列疑问,实现远程动态修改应用参 ...
- 老技术新谈,Java应用监控利器JMX(1)
先聊聊最近比较流行的梗,来一次灵魂八问. 配钥匙师傅: 你配吗? 食堂阿姨: 你要饭吗? 算命先生: 你算什么东西? 快递小哥: 你是什么东西? 上海垃圾分拣阿姨: 你是什么垃圾? 滴滴司机: 你搞清 ...
- .Net2.0 --Winform结合WebBrowser控件和Socket老技术来实现另类Push~
原文:.Net2.0 --Winform结合WebBrowser控件和Socket老技术来实现另类Push~ 目前的企业级开发比较流行的是Web2.0技术,但是由于Web技术基于请求--响应的交互模式 ...
- [转载]《民航科技》2012年4月专家论坛:罗喜伶《SWIM技术国际研究动态及对中国民航的借鉴意义》
专家介绍:罗喜伶,北京航空航天大学电子信息工程学院副教授,工学博士,硕士生导师,国家空管新航行系统技术重点实验室和协同式网络化空中交通管理系统研究教育部创新团队核心成员,民航空管广域信息系统专家组成员 ...
- 基于802.11Fuzz技术的研究
转自安全客 关于无线的Fuzz最开始接触了解时,国内基本毛线都搜不到.经过几个月的资料搜集和学习,将大约全网的fuzz资料整理翻译分析并读懂写下,就为填补国内空白,也希望无线爱好者能多多交流. 在各个 ...
- 老梗新玩「GitHub 热点速览 v.22.34」
作者:HelloGitHub-小鱼干 不知道你是否和我有一样的烦恼,最近的流行梗当自己要用拿来造词时,就陷入了不知道咋"换壳"的尴尬地步.sao-gen-gen 大大减少了你老梗新 ...
- 基于SURF特征的图像与视频拼接技术的研究和实现(一)
基于SURF特征的图像与视频拼接技术的研究和实现(一) 一直有计划研究实时图像拼接,但是直到最近拜读西电2013年张亚娟的<基于SURF特征的图像与视频拼接技术的研究和实现>,条 ...
- Hinton等人新研究:如何更好地测量神经网络表示相似性
Hinton等人新研究:如何更好地测量神经网络表示相似性 2019年05月22日 08:39:15 喜欢打酱油的老鸟 阅读数 177更多 分类专栏: 人工智能 https://www.toutia ...
随机推荐
- .net asp mvc 如何从后端返回数据对象
今天在做项目时,有一个需求:获取从控制器返回的数组对象,方法如下 public ActionResult GetAllFiles() { string dir = Server.MapPath(&qu ...
- AppiumDesktop用法介绍
转自:http://www.jianshu.com/p/bf1ca3d4ac76 写这篇文章的心情 真的很开心,我看着官网介绍竟然对AppiumDesktop略懂皮毛了.今天特意写出来,希望可以帮助一 ...
- H5-html基础
什么是 HTML? HTML 是用来描述网页的一种语言. HTML 指的是超文本标记语言 (Hyper Text Markup Language) HTML 不是一种编程语言,而是一种标记语言 (ma ...
- 团队作业8----第二次项目冲刺(Beta阶段) 第四天
BETA阶段冲刺第四天 1.小会议ing 2.每个人的工作 (1)昨天已完成的工作 1.修改了学生上传的方式: 2.完善了学生和老师修改的代码: (2) 今天计划完成的工作 (3) 工作中遇到的困难: ...
- 【Beta阶段】第四次scrum meeting
Coding/OSChina 地址 1. 会议内容 学号 主要负责的方向 昨日任务 昨日任务完成进度 接下去要做 99 PM 查找适合的素材模块,和105一起把手势功能连接到APP上 100% 查阅换 ...
- 201521123026 《Java程序设计》第5周学习总结
1. 本章学习总结 尝试使用思维导图总结有关多态与接口的知识点 使用常规方法总结其他上课内容 1.接口的出现时为了实现多态,多态的实现不一定依赖于接口. 2.接口的常见成员有:全局常量和抽象方法. 3 ...
- 多线程面试题系列(2): CreateThread与_beginthreadex本质区别
本文将带领你与多线程作第一次亲密接触,并深入分析CreateThread与_beginthreadex的本质区别,相信阅读本文后你能轻松的使用多线程并能流畅准确的回答CreateThread与_beg ...
- 如何延长IntelliJ IDEA的试用期?
想打开idea写个代码...提示idea快过期...不开森...然鹅. 根据网上各种说明,总结大体分为以下4种方法: 方法1.直接输入激活码Activation Code(亲自验证有效而且非常简单 ...
- Android 消息机制 (Handler、Message、Looper)
综合:http://blog.csdn.net/dadoneo/article/details/7667726 与 http://android.tgbus.com/Android/androidne ...
- 记一次【模拟点击】,WinForm小软件开发过程
前言 年初四月份的时候,有朋友找到我,说想开发一个模拟点击的软件.最终软件做完后,发现效果不理想.唯一开发的我是认为最好是放弃了,做运营的他,坚持说这个没问题,说是改变合作方式.最终也是不了了之了. ...