新闻正文
示例5-3. Customer.xml
<?xml version="1.0" encoding="UTF-8" ?>
<sql-map name="Customer" >
<result-map name="result" class="com.springbook.Customer" >
<property name="custId" column="custId" columnIndex="1" />
<property name="firstName" column="firstName" columnIndex="2" />
<property name="lastName" column="lastName" columnIndex="3" />
</result-map>
<mapped-statement name="getCustomers" result-map="result">
select custId,
firstName,
lastName
from customers
</mapped-statement>
<mapped-statement name="getCustomer" result-map="result">
select custId,
firstName,
lastName
from customers
where custId = #value#
</mapped-statement>
</sql-map>
示例 5-4. Reservation.xml
<?xml version="1.0" encoding="UTF-8" ?>
<sql-map name="Reservation" >
<result-map name="result" class="com.springbook.Customer" >
<property name="reservationId" column="resId" columnIndex="1" />
<property name="bike" column="bikeId" columnIndex="2" />
<property name="customer" column="custId" columnIndex="3" />
<property name="reservationDate" column="resDate" columnIndex="4" />
</result-map>
<mapped-statement name="getReservations" result-map="result">
select resId,
bikeId,
custId,
resDate
from reservations
</mapped-statement>
<mapped-statement name="getReservationsForCustomer" result-map="result">
select resId,
bikeId,
custId,
resDate
from reservations
where custId = #value#
</mapped-statement>
<mapped-statement name="getReservationsForBike" result-map="result">
select resId,
bikeId,
custId,
resDate
from reservations
where bikeId = #value#
</mapped-statement>
<mapped-statement name="getReservationsForDate" result-map="result">
select resId,
bikeId,
custId,
resDate
from reservations
where resDate = #value#
</mapped-statement>
<mapped-statement name="getReservation" result-map="result">
select resId,
bikeId,
custId,
resDate
from reservations
where resId = #value#
</mapped-statement>
</sql-map>
The <result-map> portion provides an explicit map between columns in the database and properties of a persistent class. The <mapped-statement> can then simply define the SQL queries necessary to execute the needed functionality, and the map handles creation of the resultant Java object. In addition to the Bike version above, your application currently also requires a map for Customer and Reservation.
<result-map>部分提供了数据库字段与持久化类属性之间的一显式映射。<mapped- statement>接着可以简单定义运行所需功能的必要的SQL查询,而映射负责创建合成的Java 对象。除了上述的Bike 版本之外,你的应用程序目前也需要一个关于Customer 和Reservation的映射。
你将不得不做一些OR框架通常为我们所做 的活,如创建标识符。在此例中,你将使用MySQL生成的序列(就是数据库表中的那些AUTO_INCREMENT字段)。你只需在数据库表定义时简单地 把bikeId标为AUTO_INCREMENT,这样当增加一条新记录时,你就可以在SQL语句中略过bikeId字段。我们映射中SaveBike语 句就成了示例5-5。
示例5-5. Bike.xml
<mapped-statement name="saveBike" >
insert into bikes
(manufacturer, model, frame, serialNo, weight, status)
values(#manufacturer#, #model#, #frame#, #serialNo#, #weight#,
#status#)
</mapped-statement>
若你是在使用Oracle, Spring和iBATIS也支持Oracle生成的序列。
下 一步,你可以更新应用上下文,且需要列出我们的新façade,而façade要有SQL映射。把SQL 引入PROPERTIES 文件,就象我们对待JDBC 的参数一样。 此外,你还需要配置事务策略。( 示例5-6)
示例5-6. .RentABikeApp-servlet.xml
<beans>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost/bikestore</value>
</property>
<property name="username">
<value>bikestore</value>
</property>
</bean>
<bean id="rentaBike" class="com.springbook.IBatisRentABike">
<property name="storeName"><value>Bruce's Bikes</value></property>
<property name="dataSource"><ref local="dataSource"/></property>
<property name="sqlMap"><ref local="sqlMap"/></property>
</bean>
<bean id="sqlMap"
class="org.springframework.orm.ibatis.SqlMapFactoryBean">
<property name="configLocation">
<value>/WEB-INF/ibatis.config</value>
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource"><ref local="dataSource"/></property>
</bean>
这个事务策略就在应用上下文中,你不必来管理提交适宜,因为Spring 会为你完成。你将在第六章中更完整地探讨事务策略。
示例5-7. . ibatis.config
<?xml version="1.0" encoding="UTF-8"?>
<sql-map-config>
<sql-map resource="Bike.xml" />
<sql-map resource="Customer.xml" />
<sql-map resource="Reservation.xml" />
</sql-map-config>
稍后我们会谈到事务策略。
发生了什么事?你没看到OR映射。OR框架会有意地将一个数据库表与一个类或多个类关连起来。在此例中,iBATIS会将查询结果赋予一个类。这意味着iBATIS并未试图对你隐藏SQL细节。实际上,它是在拥抱SQL。
Spring打算通过模板来简化iBATIS的使用。iBATIS模板会给出类似JDBC模板的使用模型,你只需指定数据源和iBATIS映射的SQL语句。
当 执行SQL语句时,Spring与iBATIS一起为你管理资源,并按要求来创建和关闭连接。Spring会把映射的SQL语句传给iBATIS, 由iBATIS来运行映射的语句,且若需要,iBATIS会把结果集传给给你映射SQL语句时所指定的Bean。如果你已有了任何参数,那就可将那些结果 集放入hash map中并把结果集传给带有映射的SQL语句的模板。
然而,从内部所表现的来看,iBATIS或许并不象是一个OR框 架,但使用模型的确有OR的趋向。 构建带有操作数据存储的数据访问对象(data access object),你不会在代码中看到SQL语句,因为它已被保存在配置文件中了,且iBATIS使用对象集合而不是结果集。简而言之,这是在全部OR与 JDBC之间的一个幽雅的折衷。
关于… 一切都适合iBATIS吗? 由于这种使用模型与OR模型是那么的相似,且许多应用对他们可能生成的SQL需要有更多的控制,或许你倾向于普遍地使用iBATIS。尽管如此,象JDO 和Hibernate的OR框架仍拥有着属于自己的舞台。OR框架给了你更多的灵活性和更强大的功能:
·一些高级的对象模型导致了非常复杂的SQL,把这些复杂的SQL交由ORM来完成是最好的处理方式。 例如,继承通常使得原始的JDBC API操作变得更为复杂。
·一些高级的性能特征,象延迟加载和数据抓取群组,要求对有效地的自动控制需要一个更正式的模型。然而,完美地优化后的JDBC至少要和ORM一样快速。相对于使用原始的JDBC而言,由ORM提供的性能优化选项对某些类型的问题更获得较佳性能。
·ORM使某些问题变得更加有趣。操作对象比创建一套的SQL查询更加简易。ORM很适合带有简单的查找,创建,更新,根据主键读取数据库中的数据以及删除记录的应用。
如 若你的应用有快速的数据模型和对象模型的变更,iBATIS就会很适合。如果你有了CRUD类型的应用,那么,使用iBATIS可能就会有点乏味。相反 地,如果你正寻找一种好的SQL访问方式及在ORM和原始的JDBC间有效的折衷,那么,iBATIS可能就会给了你所需的一切。
收藏到ViVi 收藏此页到365Key
上一篇:
iBatis和Spring的协同工作. 下一篇:
请问一个关于applet的运行问题