只有注册用户登录后才能阅读该文。 阅读全文
posted @ 2011-05-21 19:21 awp110 阅读(290) 评论(0) 推荐(0) 编辑
摘要: 关键词:IBatis.NET Access mdb cast typeHandler 类型转换这两天被一个问题折磨得死去活来,终于解决了,写下来以备参考:问题是这样的:我在项目中使用了IBatis.Net,数据库使用的是 MS Access。因为Access数据库没有float或double类型,只有Currency类型可以用作浮点数。所以我定义了类似如下的对象,表,以及SQL语句:1.对象 public class Mark { public string Subject{...} public int Year{...} public double Point{...} }2.数据库Mar 阅读全文
posted @ 2011-05-21 18:55 awp110 阅读(952) 评论(0) 推荐(0) 编辑
摘要: 大概一年左右的时间里Club数据库的CPU一直处于很高的负荷中,从40%一直攀升到如今的80%,随着数据量的增加,负担越来越重,已经频繁超时,且濒临无法服务的边缘。经长期的调查发现这是Ibatis.net的一个性能问题(同样适用于Ibatis)。问题是这样的:Club的主要业务表是Comment表,其中的主键是一个varchar(36)类型的Guid,当每次搜索一条记录时我们会使用这样的一个statement:<select id="GetComment" parameterClass="string" resultMap="Commen 阅读全文
posted @ 2011-05-21 15:43 awp110 阅读(265) 评论(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-05-21 15:39 awp110 阅读(367) 评论(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-05-21 15:39 awp110 阅读(221) 评论(0) 推荐(0) 编辑
摘要: 在IBatis.Net中可以通过配置文件动态选择数据库、动态选择Dao对象。Dao对象也就是操作数据库的类,通过配置文件我们可以选择DataMapper的方式、Ado的方式、NHibernet的方式以前其他第三方的方式来操作数据库。有利于系统的灵活性和可扩展性。通过分析动态选择Dao的设计可以加深对IBatis.Net的理解,更好的使用它,同时也可以借鉴它的好的设计模式,应用到我们的程序开发中去。源代码是最好的分析方式,下面是一些重点代码和说明:前提:需要在dao.config中配置:<daoFactory><daointerface="GSpring.Dao.In 阅读全文
posted @ 2011-05-21 15:38 awp110 阅读(293) 评论(0) 推荐(0) 编辑
摘要: 在项目开发过程中,查询占了很大的一个比重,一个框架的好坏也很多程度上取决于查询的灵活性和效率。在IBatis.Net中提供了方便的数据库查询方式。在Dao代码部分主要有两种方式:1、查询结果为一个对象:ISqlMappersqlMap=sqlMapDaoSession.SqlMap;return(Account)sqlMap.QueryForObject("GetAccountViaColumnName",accountID);2、查询结果为一个列表:ISqlMappersqlMap=sqlMapDaoSession.SqlMap;return(ArrayList)sqlM 阅读全文
posted @ 2011-05-21 15:37 awp110 阅读(238) 评论(0) 推荐(0) 编辑
摘要: 在上一篇文章中我提到了三种方式,都是各有利弊:第一种方式当数据关联很多的情况下,实体类会很复杂;第二种方式比较灵活,但是不太符合OO的思想(不过,可以适当使用);第三种方式最主要的问题就是性能不太理想,配置比较麻烦。下面是第四种多表查询的方式,相对第二种多了一点配置,但是其他方面都很好(当然可能还有其他更好地解决方法,希望能多提宝贵意见-_-)例子还是一样:两张表Account和Degree,使用Account_ID关联,需要查出两张表的所有纪录首先:修改实体类,增加以下属性:privateDegree_degree;publicDegreeDegree{get{return_degree;} 阅读全文
posted @ 2011-05-21 15:37 awp110 阅读(180) 评论(0) 推荐(0) 编辑
摘要: 在IBatis中提供了数据库缓存的模式,可以提高访问效率。对于一些不常更新的表可以直接利用IBatis的缓存方式。要使用IBatis的数据库缓存,只要利用配置文件就可以了,实现起来比较简单:<selectid="GetCachedAccountsViaResultMap"resultMap="account-result"cacheModel="account-cache">select*fromAccountsorderbyAccount_ID</select>最主要的就是cacheModel="a 阅读全文
posted @ 2011-05-21 15:36 awp110 阅读(235) 评论(1) 推荐(0) 编辑
摘要: 在IBatis中我们可以灵活的选择DAO类型,也就是可以在底层选用不同的数据库操作方式。有常规方式、配置文件的方式、Hibernet的方式等:1、常规方式和我们之前的ADO.NET开发较为类似,都是将sql语句写在cs代码中进行调用:首先通过配置文件初始化:DomDaoManagerBuilderbuilder=newDomDaoManagerBuilder();builder.Configure("dao"+"_"+ConfigurationManager.AppSettings["database"]+"_"+ 阅读全文
posted @ 2011-05-21 15:35 awp110 阅读(330) 评论(0) 推荐(0) 编辑
摘要: 最近这段时间一直在用IBatis来进行开发。现在把这段时间的一些开发心得写出来,跟大家一起分享。首先,IBatis可以说转变了我以前的一些思想。我们以前开发项目的时候,总是先建立好数据库,分析清楚表与表之间的关系,才开始根据这些表进行实际的开发。实际上并没有完全把面向对象的优势展现出来。现在的使用IBatis。顺序可以是这样,首先项目经理会分析整个项目,可以分成为几个对象,每个对象具有什么属性,什么方法。同时会用visio画出UML图来。这样可以说把面向对象的优势完全体现出来了。 然后程序员会根据UML图来操作对象,实现每个对象的属性和方法。这样就可以完全脱离数据库,去考虑程序的问题。这种开发 阅读全文
posted @ 2011-05-21 15:33 awp110 阅读(192) 评论(0) 推荐(0) 编辑
摘要: iBatis中的动态查询还是比较好用的如果想深入学习,可以参考 Manning.iBATIS.in.Action.Jan.2007下面给出几个例子和dtd定义:<select id="selectDispatchedKey" parameterClass="KeyAndKeyFlowInfo" resultMap="KeyAndKeyFlowResult"> select distinct KEY_ID, USER_ID, INITIATOR, INIT_DATE, INITIATOR_EMAIL, SGS_KEY.BRA 阅读全文
posted @ 2011-05-21 15:22 awp110 阅读(649) 评论(0) 推荐(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-05-21 14:59 awp110 阅读(912) 评论(0) 推荐(0) 编辑