随笔分类 -  框架学习-IBatis.net

摘要:大概一年左右的时间里Club数据库的CPU一直处于很高的负荷中,从40%一直攀升到如今的80%,随着数据量的增加,负担越来越重,已经频繁超时,且濒临无法服务的边缘。经长期的调查发现这是Ibatis.net的一个性能问题(同样适用于Ibatis)。问题是这样的:Club的主要业务表是Comment表,其中的主键是一个varchar(36)类型的Guid,当每次搜索一条记录时我们会使用这样的一个statement:<select id="GetComment" parameterClass="string" resultMap="Commen 阅读全文
posted @ 2011-04-10 18:24 永不放弃-Jack wu 阅读(1073) 评论(2) 推荐(0)
摘要:iBatis解决sql注入(1) ibatis xml配置:下面的写法只是简单的转义 name like '%$name$%' (2) 这时会导致sql注入问题,比如参数name传进一个单引号“'”,生成的sql语句会是:name like '%'%' (3) 解决方法是利用字符串连接的方式来构成sql语句 name like '%'||'#name#'||'%' (4) 这样参数都会经过预编译,就不会发生sql注入问题了。(5) #与$区别: #xxx# 代表xxx是属性值,map里面的key或者 阅读全文
posted @ 2011-04-10 18:18 永不放弃-Jack wu 阅读(944) 评论(0) 推荐(0)
摘要:1.insert,update,delete返回值(1).insert返回的为插入的主键值,但必须在配置文件中加入<selectKey/>如果主键值为String<selectKeyresultClass="string"keyProperty="id">SELECT@@IDENTITYASID</selectKey>如果主键值为Int型<selectKeyresultClass="java.lang.Integer"keyProperty="id">SELECT@@ 阅读全文
posted @ 2011-04-08 19:05 永不放弃-Jack wu 阅读(1931) 评论(0) 推荐(0)
摘要:下面这个配置基本上包含了最复杂的功能:分页\搜索\排序\缓存\传值Hash表\返回hash表\动态sql<statement id="XinxiTable_SelectAll" listClass="ArrayList" resultMap="SimpleXinxi" parameterClass="Hashtable" cacheModel="xinxi-cache" > SELECT <dynamic prepend="top"> <isNo 阅读全文
posted @ 2011-04-08 18:52 永不放弃-Jack wu 阅读(1380) 评论(0) 推荐(0)
摘要:在 IBatisNet 没有 IBatis4Java 的 startBatch() 函数,这让我们批量插入大量数据时很受困扰。本文介绍了如何在 IBatisNet 和 ADO.Net 中批量插入数据。 说到批量插入,我们有以下解决方案:1) 直接执行用 SqlCommand执行 INSERT语句,一条一条的插入。无疑,这样效率最低。 2) 把拼接INSERT 语句,一次插入多条;这样性能不好说,最大的问题就是 SqlCommand 有参数限制(2100个)。 3)利用 SqlBulkCopy 或SqlDataAdapter 的 Update 方法,可以实现批量的更新/插入,但是数据是基于 Da 阅读全文
posted @ 2011-04-08 18:44 永不放弃-Jack wu 阅读(850) 评论(0) 推荐(0)
摘要:除了前面两章中我们接触到的简单的数据库操作,iBATIS也可以完成更为复杂的任务。在本章中,我们会了解新的技术,减少我们的编码量;以及改善性能、降低资源消耗(footprint)的几种方法。6.1 使用iBATIS操作XML 译者注:iBATIS的Java版本可以操作基于XML的数据。但意义并不是很大,在以后的版本中该特性可能会被移除。iBATIS.NET则未提供该功能。6.2 使用映射语句关联对象iBATIS框架也提供了多种方法用以关联复杂的对象,比如订单(order)和它的订单项(order item)(还有它们的相关产品、顾客等等)。每种方法都有其优点和缺点,正所谓“尺有所短,寸有所长” 阅读全文
posted @ 2011-04-08 18:38 永不放弃-Jack wu 阅读(702) 评论(1) 推荐(0)
摘要:5.3 更新和删除数据 至此,我们已经学习了如何向数据库插入数据以及获取相应记录的键值,再来看看如何更新和删除数据。Insert方法返回的是object类型的值,而Update和Delete方法则返回int类型的值,该值指示了更新或删除语句所影响的记录数。iBATIS框架允许使用单条语句操作一条或多条记录。这是它与大多数ORM工具不同的地方之一,后者一般只能修改单条记录。5.3.1 并发更新处理 iBATIS目前尚未实现的一个功能是锁定记录以管理对相同数据的并发修改。有几种技术可用来处理并发更新,如在数据行上使用时间戳或者版本号。比如,有如下一个account表,定义为:Code highli 阅读全文
posted @ 2011-04-08 18:28 永不放弃-Jack wu 阅读(599) 评论(0) 推荐(0)
摘要:对数据库执行查询无疑很重要,但多数程序同时也需要将数据写入数据库。在本章中,我们将探究使用iBATIS操作数据库的几种方式。本章的内容以第4章介绍的概念为基础,因此,如果您刚开始接触iBATiS,还没读过第4章,可以先去浏览一下,因为这一章中的关于参数映射的绝大部分内容同样适用于本章的非查询语句。 5.1 更新数据的基石 在第4章中,您已经学习了所有的语句类型和基本查询相关的部分API。这里我们再来看一下执行非查询语句常用的API,然后回顾一下更新数据库相关的语句类型。5.1.1 非查询SQL语句相关的API 我们把更新数据库的一些“高级”的技术保留在下章中,这里就仅仅看一下insert,up 阅读全文
posted @ 2011-04-08 18:17 永不放弃-Jack wu 阅读(458) 评论(0) 推荐(0)
摘要:4.3 映射参数(Mapping Parameters) 对于大多数SQL语句来说,它们有用是因为我们可以在运行时向其传入参数。 有两种方式可以将参数(parameter)映射到语句中:内联(inline)参数和外部(external)参数。使用内联参数,配置一般较为简单,iBATIS会根据您的配置进行“揣测”,以获取其它细节信息。而使用外部参数时,配置一般更为显式的(具体)——因为您告诉iBATIS它该如何去做。 4.3.1 外部参数映射 参数映射(Parameter Map)定义了一个参数的有序列表,它与查询语句的占位符相匹配。注意,参数对象的属性定义可以按任意顺序,参数映射会确保每个值得 阅读全文
posted @ 2011-04-08 18:08 永不放弃-Jack wu 阅读(504) 评论(0) 推荐(0)
摘要:在前面的章节中,我们了解了iBATIS的sqlMap.config文件的配置,还给出了一个映射语句文件的示例。现在您应该具备了一定基础,可以进一步完善我们的数据访问层了。 本章和下一章(执行非查询语句)将详细讨论在Data Map文件中创建和使用映射语句的相关内容。在本章中,我们将首先浏览映射语句的大体内容以及它们的前提知识。然后我们将解释如何使用映射语句从数据库中获取类型化的对象(typed object),以及如何传入参数来限制返回的数据(比如添加查询条件)。在第五章中,您将学习到如何使用映射语句来更新数据库。4.1 使用基础 4.1.1 创建JavaBeans 译注:原书中本节的内容主要 阅读全文
posted @ 2011-04-08 17:43 永不放弃-Jack wu 阅读(499) 评论(0) 推荐(0)
摘要:译注:本章讲解的是iBATIS的安装和配置,原书使用的是Java版本,与.NET版本的安装、配置过程不尽相同,因此这里直接就.NET版本进行说明。主要参考的是iBATIS官方的DataMapper Guide文档,本章的配置主要针对DataMapper,DataAccess的配置将出现在第10章。 iBATIS的安装过程快速而简单。它是一个类库,而不是应用程序,所以实际上并不需要安装,但要在应用程序中使用它还是要经过几个步骤。 如果您熟悉C#和ADO.NET,那么可能需要好好阅读本章为下面的一两章做好准备。首先,我们提供了安装和配置过程的概览,然后是该过程的详细说明。 要获取iBATIS,您有 阅读全文
posted @ 2011-04-08 17:25 永不放弃-Jack wu 阅读(978) 评论(0) 推荐(1)
摘要:2.5 iBATIS快速上手 iBATIS框架非常简单,它上手起来同样简单。有多简单呢?使用iBATIS只要五分钟我们就可以创建一个完整的应用程序了——当然这不是大型的ERP(Enterprise Resource Planning)解决方案,也不是大规模的电子商务网站,只是一个简单的命令行工具,它可以执行iBATIS SQL Map中的SQL语句并返回结果到控制台。下面这个例子将配置一个简单的静态SQL语句,查询一个简单的数据表,将结果输出到控制台,效果如下:<!--[endif]--> 输出的数据实在不算漂亮,但足够我们了解iBATIS基本的工作原理了。在下面几个小节中,我们会 阅读全文
posted @ 2011-04-08 16:28 永不放弃-Jack wu 阅读(409) 评论(0) 推荐(0)
摘要:iBATIS是一个混合式的解决方案(hybrid solution),借鉴了多种操作关系数据库的方法的理念。那么iBATIS到底是什么呢?这一章就来回答这个问题。iBATIS是一种data mapper。Martin Fowler在他的《Patterns of Enterprise Application Architecture》一书中是这样描述Data Mapper的:一个映射层,在对象和数据库间传递数据,并保持两者与映射层本身相独立。.注:Mapper是在两个独立对象间建立通信关系的一种对象。Martin很好地区分了数据映射(Data Mapping)和元数据映射(Metadata Ma 阅读全文
posted @ 2011-04-08 16:23 永不放弃-Jack wu 阅读(582) 评论(0) 推荐(0)
摘要:在一个邮件列表的讨论中,了解了如何在IBatis.Net中返回DataSet以及一些相关的内容。Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->publicstaticDataSetQueryForDataSet(stringstatementName,objectparamObject){DataSetds=newDataSet();ISqlMappermapper=GetMapper();IMappedStatementstatement 阅读全文
posted @ 2011-04-08 15:44 永不放弃-Jack wu 阅读(540) 评论(1) 推荐(0)
摘要:最近有人问我怎么获取存储过程的output的参数值,由于我最近没有用Ibatis.net,所以就从文档中找到的param的xml,也就没有在意,但后来有人说调不通,今天早上又收到一份留言,所以我早上作了测试!也出现获取不到数据的问题,但最后还是解决了!我的测试环境是sqlserver2005/vs2005/ibatis.net2.0如下:procedure:createprocsp_output(@testParamintoutput)asbeginset@testParam=10endgoxml:<parameterMaps><parameterMapid="se 阅读全文
posted @ 2011-04-06 19:49 永不放弃-Jack wu 阅读(1297) 评论(0) 推荐(0)
摘要:其实调用方式比较简单,主要也就是两种类型的存储过程:1、更新类型的存储过程2、查询类型的存储过程下面就来看看具体的调用方式:1、更新类型的存储过程sp_InsertAccount:CREATEPROCEDURE[dbo].[sp_InsertAccount]--Addtheparametersforthestoredprocedurehere@Account_IDint,@Account_FirstNamevarchar(32),@Account_LastNamevarchar(32)ASBEGINinsertintoaccounts(account_id,account_firstname, 阅读全文
posted @ 2011-04-06 19:42 永不放弃-Jack wu 阅读(785) 评论(0) 推荐(0)
摘要:Castle是另外一个框架,包含了AOP、IOC、ORM等多个方面,其中的Castle.DynamicProxy可以实现动态代理的功能,这个也是很多框架的基础。在IBatis.Net中就是使用了Castle.DynamicProxy来实现数据库连接等动态操作的。同时在NHibernet等其他框架中也使用到了这个技术。下面我通过一个简单例子来看一下如何在我们的代码中调用Castle.DynamicProxy:一般情况下要有三个类:1、接口类:usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceGSpring. 阅读全文
posted @ 2011-04-06 19:40 永不放弃-Jack wu 阅读(681) 评论(0) 推荐(0)
摘要:在IBatis.Net中可以通过配置文件动态选择数据库、动态选择Dao对象。Dao对象也就是操作数据库的类,通过配置文件我们可以选择DataMapper的方式、Ado的方式、NHibernet的方式以前其他第三方的方式来操作数据库。有利于系统的灵活性和可扩展性。通过分析动态选择Dao的设计可以加深对IBatis.Net的理解,更好的使用它,同时也可以借鉴它的好的设计模式,应用到我们的程序开发中去。源代码是最好的分析方式,下面是一些重点代码和说明:前提:需要在dao.config中配置:<daoFactory><daointerface="GSpring.Dao.In 阅读全文
posted @ 2011-04-06 19:36 永不放弃-Jack wu 阅读(593) 评论(0) 推荐(0)
摘要:在上一篇文章中我提到了三种方式,都是各有利弊:第一种方式当数据关联很多的情况下,实体类会很复杂;第二种方式比较灵活,但是不太符合OO的思想(不过,可以适当使用);第三种方式最主要的问题就是性能不太理想,配置比较麻烦。下面是第四种多表查询的方式,相对第二种多了一点配置,但是其他方面都很好(当然可能还有其他更好地解决方法,希望能多提宝贵意见-_-)例子还是一样:两张表Account和Degree,使用Account_ID关联,需要查出两张表的所有纪录首先:修改实体类,增加以下属性:privateDegree_degree;publicDegreeDegree{get{return_degree;} 阅读全文
posted @ 2011-04-06 19:34 永不放弃-Jack wu 阅读(563) 评论(1) 推荐(0)
摘要:在项目开发过程中,查询占了很大的一个比重,一个框架的好坏也很多程度上取决于查询的灵活性和效率。在IBatis.Net中提供了方便的数据库查询方式。在Dao代码部分主要有两种方式:1、查询结果为一个对象:ISqlMappersqlMap=sqlMapDaoSession.SqlMap;return(Account)sqlMap.QueryForObject("GetAccountViaColumnName",accountID);2、查询结果为一个列表:ISqlMappersqlMap=sqlMapDaoSession.SqlMap;return(ArrayList)sqlM 阅读全文
posted @ 2011-04-06 19:33 永不放弃-Jack wu 阅读(666) 评论(0) 推荐(0)