??xml version="1.0" encoding="utf-8" standalone="yes"?>国产无遮挡在线视频免费观看,九一国产在线,校园春色综合 http://www.aygfsteel.com/tommyjian/category/23424.html生活是一个目标,接着一个目标?/description>zh-cn Fri, 29 Jun 2007 16:45:55 GMT Fri, 29 Jun 2007 16:45:55 GMT 60 译QiBATIS 3.0 草案——用标注进行配|?/title> http://www.aygfsteel.com/tommyjian/archive/2007/06/29/127054.htmlTommy Jian Tommy Jian Fri, 29 Jun 2007 05:35:00 GMT http://www.aygfsteel.com/tommyjian/archive/2007/06/29/127054.html http://www.aygfsteel.com/tommyjian/comments/127054.html http://www.aygfsteel.com/tommyjian/archive/2007/06/29/127054.html#Feedback 0 http://www.aygfsteel.com/tommyjian/comments/commentRss/127054.html http://www.aygfsteel.com/tommyjian/services/trackbacks/127054.html 使用标注q行配置
标注现在已经很流行了(jin)Q许多h选择它作为XML的替代来q行元数据编E。标注中不应该包含配|信息,而iBATIS通过XML来进行的工作也不光是配置?/p>
那么什么是配置Q什么又不是呢?目前QiBATIS的XML文g包含?jin)三斚wQ?/p>
当?zhn)把环境设|改变后Q?zhn)同时也需要更攚w|,例如数据库连接配|、事务管理配|等{。当(zhn)将应用分发C同的数据库,而且也用了(jin)一些专有的SQL语句后,配置中可能还要包含SQL方言的一些配|信息。在iBATIS 3.0中我们可以将q些信息包含q去Q因此,(zhn)需要针对多U方aq行~码Q当然这是手工的Q,为它们命名,q将它们配置到适当的位|。配|信息不应该被包含在Java源文件中?/p>
元数据信息包括诸如结果映、参数映和~存模型之类的信息。这些信息控制iBATIS如何映射(zhn)的数据以及(qing)q些映射的具体表现?/p>
~码包括SQL以及(qing)动态的SQL语句?/p>
那么标注应该承担什么样的职责呢Q?/p>
一般情况下Q只有元数据信息比较适合使用标注来描q。配|应该通过属性文件或者XML文g来实现。编码也只能通过Java文g或者XML文g来实现。更q一步看Q标注只能用来描q相对较单的元数据信息。有Ӟ标注Q特别是在Java中)(j)也会(x)使事情变得更加复杂,使代码更加晦涩难懂?/p>
因ؓ(f)上面的原因,所以我推荐只将标注作ؓ(f)U定配置的替代配|。这是_(d)使用q种配置方式可以辑ֈ一定的效果Q但是也仅仅限于此?/p>
再一ơ强调,C#的Attribute在某些方面要ZJava的标注:(x)
支持多行字符Ԍq得内嵌SQL~码令h感到愉快
支持使用同一标注多次Q而在Java中则需要通过集合标注来实?/li>
支持序和命名参敎ͼq得代码变得更加简明扼?/li>
下面q个例子展示?jin)如何用Java中的标注来完成配|:(x)
// // Simple select, string concatenation, inline results(!) and inline parameters // @Select("SELECT #id(EMP_ID:NUMERIC), #firstName(FIRST_NAME:VARCHAR), #lastName(LAST_NAME:VARCHAR) " + "FROM EMPLOYEE") List selectAllEmployees(); // // Alternative syntax using an array of strings instead of string concatenation...can be "smarter" than concatenation // @Select({"SELECT #id(EMP_ID:NUMERIC), #firstName(FIRST_NAME:VARCHAR), #lastName(LAST_NAME:VARCHAR) ", "FROM EMPLOYEE", "WHERE EMP_ID = @id"}) Employee selectEmployee(int id); // // Inserts look as you might expect. We can use getGeneratedKeys to get autogen key values, selectkey still supported // @Insert({"INSERT INTO EMPLOYEE (EMP_ID, FIRST_NAME, LAST_NAME)", "VALUES (@id, @firstName, @lastName)"}) void insertEmployee(Employee emp); // // Nothing special about update // @Update({"UPDATE EMPLOYEE SET", "EMP_ID=@id(NUMERIC:IN), FIRST_NAME=@firstName(VARCHAR:IN), LAST_NAME=@lastName(VARCHAR:IN)"}) void updateEmployee(Employee emp); // // Delete is obvious. // @Delete("DELETE EMPLOYEE WHERE EMP_ID = @id") void deleteEmployee(int id);
下面q个例子要更加复杂一些,像这U用了(jin)如此多的标注的情况就应该考虑使用XML文g来进行配|。这U情况下Q我惌标注能够提供一切功能,即XML中实现的功能通过标注也能完成。然而,我们q是(zhn)在面对复杂的情冉|使用XML来进行配|。或许某些h不是特别在意使用XML配置Q所以我们ؓ(f)他们提供?jin)标注配|方式?/p>
// // complex stuff // @ResultClass (Company.class) @ConstructorResults({ @Result(property="id", column="C.COMP_ID"), @Result(property="name", column="C.NAME") }) @PropertyResults({ @Result(property="departments.id", column="D.DEPT_ID"), @Result(property="departments.name", column="D.NAME"), @Result(property="departments.employee.id", column="E.EMP_ID"), @Result(property="departments.employee.firstName", column="E.FIRST_NAME"), @Result(property="departments.employee.lastName", column="E.LAST_NAME") }) @Collections ({ @Collection(type=Department.class, property="departments", groupBy="id"), @Collection(type=Employee.class, property="departments.employees", groupBy="departments.id") }) @Select("SELECT #id, #name, " + "#departments.id, #departments.name, " + "#departments.employees.id, #departments.employees.firstName, " + "#departments.employees.lastName " + "FROM COMPANY C, DEPARTMENT D, EMPLOYEE E " + "WHERE D.DEPT_ID = E.DEPT_ID " + "AND C.COMP_ID = D.COMP_ID") List selectAllCompaniesWithJoin(); /* * NESTED QUERIES */ @ResultClass (Company.class) @FieldResults({ @Result(property="id", column="COMP_ID"), @Result(property="name", column="NAME") }) @PropertyResults({ @Result(property="departments", nestedQuery=@QueryMethod(type=CompanyMapper.class, methodName="getDepartmentsForCompany", parameters="id")) }) @Select("SELECT #id, #name FROM COMPANY C ") List selectAllCompaniesWithNestedQueries(); @ResultClass (Department.class) @PropertyResults({ @Result(property="id", column="DEPT_ID"), @Result(property="name", column="NAME"), @Result(property="employees", nestedQuery=@QueryMethod(type=CompanyMapper.class, methodName="getEmployeesForDeparment", parameters="id")) }) @Select("SELECT #id, #name FROM DEPARTMENT WHERE COMP_ID = @id ") List getDepartmentsForCompany(int id); @ResultClass (Employee.class) @PropertyResults({ @Result(property="id", column="EMP_ID"), @Result(property="firstName", column="FIRST_NAME"), @Result(property="lastName", column="LAST_NAME") }) @Select("SELECT #id, #firstName, #lastName FROM EMPLOYEE WHERE EMP_ID = @id ") List getEmployeesForDepartment(int id);
]]>译QiBATIS 3.0 草案——约定俗成的配置方式 http://www.aygfsteel.com/tommyjian/archive/2007/06/26/126256.htmlTommy Jian Tommy Jian Tue, 26 Jun 2007 01:47:00 GMT http://www.aygfsteel.com/tommyjian/archive/2007/06/26/126256.html http://www.aygfsteel.com/tommyjian/comments/126256.html http://www.aygfsteel.com/tommyjian/archive/2007/06/26/126256.html#Feedback 0 http://www.aygfsteel.com/tommyjian/comments/commentRss/126256.html http://www.aygfsteel.com/tommyjian/services/trackbacks/126256.html U定俗成
Clinton_(d)(x) q一Ҏ(gu)与我们以前所坚持的原则不相符合的。认识我的h都知道我基本上算是一个完的人。但是如果我们从最?jng)_늚角度去考虑Q我们必d解决复杂问题的时候也使用量单的解决Ҏ(gu)。当?dng)那些不太喜欢U定俗成式配|的人可以忽略这U配|方式。但是我怿q是非常有用的,特别是对插入、删除和更新操作来说。用这U配|方式,一些简单的查询也将从中受益?/p>
默认情况下,iBATIS 3.0用约定俗成式的配|方式。Java 5的方法语义中已经包含?jin)生成SQL、进行参数和l果映射_的信息。例如:(x)
Employee getEmployee (int id);
q些信息对于生成以下SQL已经_?jin)?x)
SELECT id, firstName, lastName FROM Employee WHERE id = ?
l果cd与方法的q回值类型是一致的。因为方法的q回值类型不是集合类型,所以我们知道正在处?#8220;Select One”语义。表的名U被假定Zl果cd的名UC致。而查询参数就被假定ؓ(f)Ҏ(gu)对应的参数。在使用其他的配|方式的时候,我们可以更改默认ID参数的配|。SQL语句中的各数据列假定与方法返回类型的同名属性一一对应Q当然这些配|都是可以更改的?/p>
集合cd也是以同L(fng)方式工作Q?/p>
List listAllEmployees ();
q个例子生以下SQL语句Q?/p>
SELECT id, firstName, lastName FROM Employee
我们可以这个例子叫?#8220;Select Many”Q因个方法返回了(jin)一个集合类型。我们知道Where子句为空Q因个方法没有Q何参数?/p>
如果我们想用参数式查询Q我们可以这h做:(x)
List findEmployeesLike(Employee employee);
假设只有参数的lastNameQ而其他引用类型都为null|原始cd都被讄为非法无意义的|比如-1Q,我们得C下的SQL语句Q?/p>
SELECT id, firstName, lastName FROM Employee WHERE lastName = 'Begin'
或者可以直接按参数来进行:(x)
List findEmployeeByLastNameAndFirstName (String last, String first);
q将生成以下的SQL语句Q?/p>
SELECT id, firstName, lastName FROM Employee WHERE lastName = 'Begin' AND firstName = 'Clinton'
因ؓ(f)C#支持参数名称的反,所以C#对这U方法提供了(jin)更好的支持。Ş式上也变得相Ҏ(gu)晎ͼ当然实质是一L(fng)Q?/p>
// C# IList FindEmployeesLike(string lastName, string firstName); // And in C# 3.0, we can use anonymous types: IList FindEmployeesLike(object obj); //... IList employees = mapper.FindEmployeesLike(new {LastName="Begin", FirstName="Clinton"});
更新操作也以相同的方式操作:(x)
void insertEmployee (Employee emp); void updateEmployee (Employee emp); void deleteEmployee (Employee emp);
也可以自动接受集合参敎ͼ(x)
int insertEmployee (List emps); // returns rows inserted int updateEmployee (List emps); // returns rows updated int deleteEmployee (List emps); // returns rows deleted
生成器相当的灉|Q而且可以为大多数删除甚至更新操作生成一条SQL语句?/p>
]]>译QiBATIS 3.0 草案——多U配|方?/title> http://www.aygfsteel.com/tommyjian/archive/2007/06/22/125784.htmlTommy Jian Tommy Jian Fri, 22 Jun 2007 03:23:00 GMT http://www.aygfsteel.com/tommyjian/archive/2007/06/22/125784.html http://www.aygfsteel.com/tommyjian/comments/125784.html http://www.aygfsteel.com/tommyjian/archive/2007/06/22/125784.html#Feedback 0 http://www.aygfsteel.com/tommyjian/comments/commentRss/125784.html http://www.aygfsteel.com/tommyjian/services/trackbacks/125784.html 多种配置方式
iBATIS中最古老的是光|方式。在目开始的时候,XML被认为最好的配置方式。事实上QXML现在q是比较好的配置Ҏ(gu)Q因为它是进行复杂的多行SQL配置的最x式。因此,XML的配|方式将予以保留。但是它不再是默认的配置方式Q而且也不见得是大多数应用的首选?/p>
iBATIS 3.0用多U配|方式。这是说iBATIS可以用多U方式进行配|,而且q些方式可以协同工作。按照实用性排序,有以下四U方法:(x)
U定俗成
Java的标识(可以覆盖前一U配|的配置信息Q?/li>
XMLQ可以覆盖前两种配置的配|信息)(j)
Java APIQ可以覆盖以上配|的配置信息Q?/li>
]]> 译QiBATIS 3.0 草案——事务、会(x)话和工厂cZ—MapperFactory http://www.aygfsteel.com/tommyjian/archive/2007/06/20/125358.htmlTommy Jian Tommy Jian Wed, 20 Jun 2007 08:00:00 GMT http://www.aygfsteel.com/tommyjian/archive/2007/06/20/125358.html http://www.aygfsteel.com/tommyjian/comments/125358.html http://www.aygfsteel.com/tommyjian/archive/2007/06/20/125358.html#Feedback 0 http://www.aygfsteel.com/tommyjian/comments/commentRss/125358.html http://www.aygfsteel.com/tommyjian/services/trackbacks/125358.html 事务、会(x)话和工厂cZ—MapperFactory
我们应该在何处获?#8220;Mapper”的实例呢Q我们仍焉要一个核?j)类来完成iBATIS的配|和控制。这个核?j)类的名U尚在争Z中,但是我们不妨先叫它MapperFactory?/p>
通常情况下,MapperFactory负责构徏事务和映类的实例。而MapperFactory本n由某个配置cL构徏?/p>
MapperFactory factory = someConfiguration.buildMapperFactory(); EmployeeMapper employeeMapper = factory.getMapper (EmployeeMapper.class);
对于q种方式是不是会(x)使事情变得简?..或许?x)吧Q至于事务,Clinton是这栯的:(x)“?x)话的概念应该和事务的进行合q。在iBATIS中,?x)话和事务很多时候是一致甚x一L(fng)。但是它们因Z些h为的架构斚w的原因而被分开?jin)。会(x)话或许能够完成不Q务,但是其中?0%q不适合用会(x)话来解决。同L(fng)Q批处理操作也从事务中分d来,因ؓ(f)事务在提供批处理功能是往往?x)导致o(h)人生厌的try/finally的多重嵌套。因此在我们发现真实的需求之前应该尽量避免这些?#8221;?/p>
iBATIS或者其他第三方库及(qing)容器都可以进行事务处理。目前,事务的处理是由SqlMapClient实例中的ThreadLocal实例来处理的。因U处理方法,我们配到?jin)不问题。不是出于技术的原因而是因ؓ(f)代码更加清晰Q我们可以用以下的Ҏ(gu)Q?/p>
Transaction tx = factory.startTransaction(); try { // do work tx.commit(); } finally { tx.end(); }
批处理操作可以简单地通过启动支持批处理操作的事务来进行:(x)
Transaction tx = factory.startBatch(); try { // do work // balk executes current batch immediately, returns total rows updated // (balks on non-batched transactions) int totalRowCount = tx.flush(); // commit executes batch too, returns total rows updated and commits totalRowCount = tx.commit(); } finally { tx.end(); }
与现在的事务的APIcMQ我们对事务的隔ȝ别以?qing)其他选项提供支持?/p>
Transaction tx = factory.startTransaction(isolationLevel); try { // do work tx.commit(); } finally { tx.end(); }
如果W三方的库提供了(jin)事务处理的支持,那么受托理的连接对象可以作为参C入:(x)
// Can be handled by encapsulating framework (e.g. Spring) Transaction tx = factory.useConnection(conn); try { //...do work... tx.flush(); // executes batched updates immediately // commit simply calls commit on the connection // if local commits are allowed, otherwise it is ignored. tx.commit(); } finally { tx.end(); // Can also be handled by encapsulating framework (e.g. Spring) }
MQ这L(fng)API十分的简z,而且易于与诸如Springq样的第三方框架集成。MapperFactory可以被注入到需要事务管理、批处理和隔ȝ别的Spring的DAO对象中。ؓ(f)?jin)进一步进行必要的分离Q我们可以将事务理功能从MapperFactory中分d来,甚至于允许开发者定义自q事务理接口Q同时将事务理的功能绑定到cMQ这h供了(jin)更加松耦合的架构)(j)?/p>
]]>译QiBATIS 3.0 草案——接口绑?/title> http://www.aygfsteel.com/tommyjian/archive/2007/06/19/125161.htmlTommy Jian Tommy Jian Tue, 19 Jun 2007 09:40:00 GMT http://www.aygfsteel.com/tommyjian/archive/2007/06/19/125161.html http://www.aygfsteel.com/tommyjian/comments/125161.html http://www.aygfsteel.com/tommyjian/archive/2007/06/19/125161.html#Feedback 4 http://www.aygfsteel.com/tommyjian/comments/commentRss/125161.html http://www.aygfsteel.com/tommyjian/services/trackbacks/125161.html 接口l定
随着Java 5的推q,我们有机?x)来改善用户体验。其中最重要的是借助Java 5可以消除令h生惑的类型{换,可以消除SQL映射Z字符的调用方式。D例来_(d)现在在调用SQL映射的时候是q样的:(x)
Employee employee = (Employee)sqlMapper.queryForList("getEmployee", 5); //...and... List employees = sqlMapper.queryForList("listAllEmployees");
问题是很明显的。第一Q上面的两个例子中被映射的语句的名称都是Z字符串的Q而这很容易导致错误。这U方式也不会(x)得到IDE工具、编译器的支持和理?/p>
W二个问题是存在参数和返回值类型安全问题。在W一个例子中Q谁能保证参数的cd一定是IntegerQ而谁又能保证(zhn)得到的q回g定是Employeecd呢?q里Q编译器也不?x)给ZQ何偿错误报告和提C。而只有运行时异常?x)被抛出?/p>
最后,在集合的例子中问题也是相同的。在q行前,(zhn)可能会(x)获得Dogs的集合,而不是Employees?/p>
MQ这U方式虽然比JDBC强,但是也让人倍感隑֏Q还是存在改善的I间?/p>
在Java 5中我们可以充分用范型来规范集合cd。这P我们不需要进行特D的配置可以ؓ(f)集合cd建立一致的API。我们不需要在XML文g中声明类型,不需要通过字符名称来调用被映射的语句,相反Q我们可以充分利用表辑֥且类型安全的接口cd。没有什么新东西需要学?fn),只是普通的接口可以了(jin)?/p>
public interface EmployeeMapper { Employee getEmployee (int employeeId); List listAllEmployees(); }
q就够了(jin)QiBATIS来帮我们实现q个接口?/p>
现在我们可以以一U更加简z和安全的方式来调用被映的语句?jin)?/p>
Employee emp = empMapper.getEmployee(5); //...and... List employees = empMapper.listAllEmployees();
在上面的调用中没有类型{换、没有字W串Q而且参数和返回值的cd是、安全的。额外的代码是针对接口使用XML或者Java的标识进行配|。最多我们只需要配|SQL语句、需要进行重载的参数或者返回值类型?/p>
接口描述?jin)所需要的一切?/p>
语句的名Uͼ默认情况下与Ҏ(gu)的名字一_(d)(j)
参数cdQ如果存在的话)(j)
q回值类型(包括范型集合的元素的cdQ?/li>
而其中最有趣的就是我们可以基于方法名U这L(fng)U定来生成SQL映射。以后关于配|的章节中将详细讨论q些l节?/p>
接口l定的方法得诸如Springq样的框架将映射cL入其他类变得Ҏ(gu)Q同时也不需要将事务理的过多细节公开?/p>
]]>
վ֩ģ壺
|
|
ˮ |
¡ |
Ϫ |
|
鶴 |
ɽ |
|
봨 |
|
ɽ |
ʶ |
¡ |
̨ |
|
Ҧ |
ƽ |
ʯ |
Ԫ |
|
|
ɽ |
|
|
ᶼ |
|
ζ |
|
֯ |
Ʊ |
ƶ |
|
ͺ |
˶ |
|
ԭ |
ƽ |
|
ͤ |
|