IBatisNet使用教程
1、是数据持久层,对应.NET方向的有Ibatis.NET,只要用来处理数据库表结构和程序实体之间映射,ado.net是用来处理和数据库直接通信的,取出数据(object,int,string,dataset,datatable等常规类型),通常程序中如果用到MOEDL实体,都需要手动写代码去做类型转换(把datatable的字段赋值到model对应字段),用了数据持久层(直接和数据库打交道并保持同步的一个应用层次),这一部就可以省略了,Ibatis.NET可以直接把数据库表字段映射为实体模型,操作简便了。
2、IBatis.net 是2001年发起的开源项目,它是一个轻量级的ORM框架,现在IBatisNET已经是属于Apache下的一个子项目了。
3、DataMapper:通过配置映射关系的xml业务对象与SQL语句和存储过程进行映射.
4、DataAcces:简单的说就是IBatis的数据访问层.
5、 平常做企业级应用,需求变化是经常的事,而很多基础代码重复也是很让人头疼的问题。所以很多人会使用一些ORM框架来增强项目的可维护性、可扩展性。IBatis.Net就是一个比较易用的ORM框架,使用起来较为方便、灵活。IBatis.Net是从Ibatis的Java版本移植过来的.NET版本。iBATIS作为一种独特的Data Mapper,使用SQL映射的方式将对象持久化至关系型数据库。简单的理解就是它将我们在数据访问层实现的C#逻辑代码,变为通过关系数据库与对象的映射,将SQL逻辑放到外部的XML配置文件中,以方便以后的维护。
这个框架有两个主要的组成部分,一个是SQL Maps,另一个是Data Access Objects。Sql Maps是这个框架的核心部分,通过使用Sql Maps你可以显著的节约数据库操作的代码量。SQL Maps使用一个简单的XML文件来实现从实体到SQL statements的映射。使用DAO,封装了对数据的访问,你可以动态配置你的应用程序来访问不同的实体存储机制。隐藏持久性层实现的细节,Data Access Objects允许你通过一个简单接口的来操作数据。
1、新建项目
<?xml version="1.0" encoding="utf-8"?>
<sqlMapConfig
xmlns="http://ibatis.apache.org/dataMapper"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <!-- 常量属性,resource 通过单独文件properties.config加载-->
<!--<properties resource="properties.config"/>--> <!--这个东西是变量用的,这里以最简单的实现说明,因此注释-->
<!-- 常量属性,embedded 通过程序集资源中 加载
<properties embedded="database.config, IBatisNetDemo"/>--> <settings>
<setting useStatementNamespaces="true"/> <!--是否启用命名空间-->
</settings> <providers resource="providers.config"/> <!--引入数据库驱动文件--> <!-- Database connection information -->
<!--数据库连接字符串-->
<!--<database>
--><!--<provider name="sqlServer2.0"/>
<dataSource name="IBatisNet" connectionString="Data Source=DESKTOP-1ORC3PV;Initial Catalog=test;Integrated Security=True"/>--><!--
<provider name="oracleClient1.0"/>
<dataSource name="IBatisNet" connectionString="Data Source=LHORCL;Persist Security Info=True;User ID=linsiontest;Password=123456;Unicode=True" providerName="System.Data.OracleClient"/>
</database>-->
<database>
<provider name="OracleClient2.0"/>
<dataSource name="orcl" connectionString="Data Source=HDORCL;Persist Security Info=True;User ID=oa;Password=oa;Unicode=True"/>
</database> <sqlMaps> <!--节点就是配置一些sql语句以及实体映射的xml文件-->
<sqlMap resource="DataMap/SQLMap/ParameterClass.xml" /> <!--ParameterClass.xml-->
<sqlMap resource="Maps/Account.xml" /> <!--这个是指定映射文件的位置-->
</sqlMaps> </sqlMapConfig>
参数 |
描述 |
resource |
指定the properties文件从application的根目录进行加载 resource="properties.config" |
url |
指定the properties文件从文件的绝对路径进行加载 url="c:\Web\MyApp\Resources\properties.config" 或者 url="file://c:\Web\MyApp\Resources\properties.config" |
embedded |
指定文件可以作为程序集的资源文件进行加载' embedded=" database.config, IBatisNetDemo” |
参数 |
描述 |
cacheModelsEnabled |
是否启用sqlMap上的缓存机制 Example: cacheModelsEnabled=”true” Default: true (enabled) |
useStatementNamespaces |
是否使用Satement命名空间,这里的命名空间指的是映射文件中sqlMap节点的namespace属性 Example: useStatementNamespaces=”false” Default: false (disabled) |
validateSqlMap |
是配置要不要启示SqlMapConfig.xsd schema验证映射文件. Example: validateSqlMap=”false” Default: false (disabled) |
<?xml version="1.0" encoding="utf-8" ?>
<sqlMap namespace="User" xmlns="http://ibatis.apache.org/mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > <resultMaps>
<resultMap id="UserResult" class="User">
<result property="UserId" column="UserId" />
<result property="UserName" column="UserName" />
<result property="UserAge" column="UserAge" />
<result property="UserSex" column="UserSex" />
</resultMap>
</resultMaps> <!--statement配置-->
<statements>
<select id="Exists" resultClass="int" parameterclass="User">
select count(1) from tbuser
where UserId = #UserId#
</select>
<select id="SelectAllUser" resultMap="UserResult" parameterclass="User">
select * from tbuser where 1 = 1
</select>
</statements>
</sqlMap>
模块配置:在ParameterClass.xml中配置
<?xml version="1.0" encoding="utf-8" ?>
<sqlMap namespace="ParameterClass" xmlns="http://ibatis.apache.org/mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > <alias>
<typeAlias alias="User" type="IBatisNetTest.Models.User" />
</alias> </sqlMap>
6、S_IBatisBase 类
using System;
using System.Collections.Generic; using System.IO;
using System.Reflection;
using IBatisNet.DataMapper;
using IBatisNet.DataMapper.Configuration;
using IBatisNet.DataMapper.SessionStore;
using IBatisNet.DataMapper.MappedStatements;
using IBatisNet.DataMapper.Scope; namespace SystemFramework
{
public class S_IBatisBase
{
private static readonly IDictionary<string, ISqlMapper> dictMappers = null; private static volatile ISqlMapper mapper = null; public static ISqlMapper SqlMap
{
//get { return GetMapper("IBatisNetTest.Config.SqlMap.config", "IBatisNetTest"); } //程序集中加载
get { return GetMapper("DataMap/Config/SqlMap.config", ""); }
} private static readonly object syncObj = new object(); /// <summary>
/// 单例模式
/// </summary>
static S_IBatisBase()
{
dictMappers = new Dictionary<string, ISqlMapper>();
} /// <summary>
/// 实例化Oracle SqlMap对象
/// </summary>
/// <param name="mapperName"></param>
/// <param name="assemblyName"></param>
/// <returns></returns>
public static ISqlMapper GetMapper(string mapperName, string assemblyName)
{
if (string.IsNullOrEmpty(mapperName))
{
throw new Exception("MapperName为空!");
} if (dictMappers.ContainsKey(mapperName))
{
mapper = dictMappers[mapperName];
}
else
{
if (mapper == null)
{
lock (syncObj)
{
if (mapper == null)
{
if (string.IsNullOrEmpty(assemblyName))
{
#region 从本地配置文件中生成SqlMapper
mapper = new DomSqlMapBuilder().Configure(mapperName);
mapper.SessionStore = new HybridWebThreadSessionStore(mapper.Id);
dictMappers.Add(mapperName, mapper);
#endregion
}
else
{
#region 从资源中生成SqlMapper
Assembly assembly = Assembly.Load(assemblyName);
Stream stream = assembly.GetManifestResourceStream(mapperName);
DomSqlMapBuilder builder = new DomSqlMapBuilder();
mapper = builder.Configure(stream);
dictMappers.Add(mapperName, mapper);
#endregion
}
}
}
}
}
return mapper;
} /// <summary>
/// 获取运行时SQL
/// </summary>
/// <param name="sqlMapper"></param>
/// <param name="statementName"></param>
/// <param name="paramObject"></param>
/// <returns></returns>
public static string GetRuntimeSql(ISqlMapper sqlMapper, string statementName, object paramObject)
{
string result = string.Empty;
try
{
IMappedStatement statement = sqlMapper.GetMappedStatement(statementName);
if (!sqlMapper.IsSessionStarted)
{
sqlMapper.OpenConnection();
}
RequestScope scope = statement.Statement.Sql.GetRequestScope(statement, paramObject, sqlMapper.LocalSession);
result = scope.PreparedStatement.PreparedSql;
}
catch (Exception ex)
{
result = "获取SQL语句出现异常:" + ex.Message;
}
return result;
}
}
}
简单调用
public ActionResult test()
{
User user = new User();
user.UserId = 1;
//string sql = S_IBatisBase.GetRuntimeSql(S_IBatisBase.SqlMap, "Exists", user);
object objRtn = S_IBatisBase.SqlMap.QueryForObject("Exists", user);
int i = Convert.ToInt32(objRtn); //string sql = S_IBatisBase.GetRuntimeSql(S_IBatisBase.SqlMap, "SelectAllUser", "");
IList<User> user1 = S_IBatisBase.SqlMap.QueryForList<User>("SelectAllUser", "");
return Json(user1);
}
IBatisNet使用教程的更多相关文章
- Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求
上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...
- Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数
上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...
- Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数
上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...
- Angular2入门系列教程4-服务
上一篇文章 Angular2入门系列教程-多个组件,主从关系 在编程中,我们通常会将数据提供单独分离出来,以免在编写程序的过程中反复复制粘贴数据请求的代码 Angular2中提供了依赖注入的概念,使得 ...
- Angular2入门系列教程1-使用Angular-cli搭建Angular2开发环境
一直在学Angular2,百忙之中抽点时间来写个简单的教程. 2016年是前端飞速发展的一年,前端越来越形成了(web component)组件化的编程模式:以前Jquery通吃一切的田园时代一去不复 ...
- wepack+sass+vue 入门教程(三)
十一.安装sass文件转换为css需要的相关依赖包 npm install --save-dev sass-loader style-loader css-loader loader的作用是辅助web ...
- wepack+sass+vue 入门教程(二)
六.新建webpack配置文件 webpack.config.js 文件整体框架内容如下,后续会详细说明每个配置项的配置 webpack.config.js直接放在项目demo目录下 module.e ...
- wepack+sass+vue 入门教程(一)
一.安装node.js node.js是基础,必须先安装.而且最新版的node.js,已经集成了npm. 下载地址 node安装,一路按默认即可. 二.全局安装webpack npm install ...
- Virtual Box配置CentOS7网络(图文教程)
之前很多次安装CentOS7虚拟机,每次配置网络在网上找教程,今天总结一下,全图文配置,方便以后查看. Virtual Box可选的网络接入方式包括: NAT 网络地址转换模式(NAT,Network ...
随机推荐
- Redhat Linux安装JDK 1.7
本篇主要介绍在Redhat Linux(Red Hat Enterprise Linux Server release 5.7 (Tikanga))系统上安装JDK 1.7,其它Linux平台安装也大 ...
- Shell: test
基本格式:test expression expression为test命令构造的表达式.这里expression是test命令可以理解的任何有效表达式,该简化格式将是读者可能会踫见的最常用格式返回值 ...
- CocoaPods报错:The dependency `AFNetworking ` is not used in any concrete target
最近更新了下cocoapods,今天再pod update 就遇到这个错误: 大体意思就是说,库没有用到指定的target. 找了下资料,发现是新版CocoaPods在 Podfile里使用时,必须 ...
- linux yum 工具
vim /etc/yum.repos.d/CentOS-Base.repo 编辑yum 源网址 yum list |grep vim查看vim 情况 yum remove 卸载rpm包 # yum u ...
- macOS安装Solr并索引MySQL
安装 Java 语言的软件开发工具包 brew cask install java 或者在 Oracle官网 中选择 Mac 版本 jdk-8u111-macosx-x64.dmg 下载并安装. 安装 ...
- /var/log/messages文件监控
近来项目中遇到一个问题,情况是这样的,我们使用ELK中的LOGSTASH来监控LINUX的系统日志文件:/var/log/messages文件,但这个文件默认的权限是600,这样很为难, 我们使用特定 ...
- maven私服搭建
一.软件安装 地址:http://www.sonatype.org/nexus/thank-you-for-downloading/?dl=tgz 解压: 启动: >> nexus sta ...
- JS 阶段小练习~ 无缝滚动
结合下学了的知识,做个模拟的综合性扩展练习~~ 大致功能如下: 1.点开html后,图片自动移动展示 2.点击左右方向,可以改变 图片移动的方向(改变left的值,正负) 3.鼠标移入移出图片后,图 ...
- 洛谷P1108 低价购买[DP | LIS方案数]
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
- UVA - 11134 Fabled Rooks[贪心 问题分解]
UVA - 11134 Fabled Rooks We would like to place n rooks, 1 ≤ n ≤ 5000, on a n × n board subject to t ...