﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-闲人野居-随笔分类-orm</title><link>http://www.blogjava.net/zyl/category/19104.html</link><description>好好学习，天天向上</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 19:46:53 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 19:46:53 GMT</pubDate><ttl>60</ttl><item><title>感受jpa</title><link>http://www.blogjava.net/zyl/archive/2007/01/23/95606.html</link><dc:creator>布衣郎</dc:creator><author>布衣郎</author><pubDate>Tue, 23 Jan 2007 13:20:00 GMT</pubDate><guid>http://www.blogjava.net/zyl/archive/2007/01/23/95606.html</guid><wfw:comment>http://www.blogjava.net/zyl/comments/95606.html</wfw:comment><comments>http://www.blogjava.net/zyl/archive/2007/01/23/95606.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/zyl/comments/commentRss/95606.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zyl/services/trackbacks/95606.html</trackback:ping><description><![CDATA[    这几天，看了jpa（java 持久性 api)的规范，作为ejb3的重要组成部分，jpa 还是值得关注的。看完规范，感觉jpa还是比较的单一的，<br /><br />其目标就是实现java 持久性的通用。jpa采用纯pojo的方式实现，更多的是采用java 5注释。jpa 的优势是多供应商的支持，可以运行在容器<br /><br />之中，也可以运行于容器之外，这就是其优点。<br /><br />    hibernate 从3.2开始，就开始兼容jpa。同样，jdo，也开始兼容jpa。在orm的领域中，看来jpa已经是王道，规范就是规范。在各大厂商<br /><br />的支持下，jpa的使用开始变得广泛。<br /><br />    在spring 2.0.1中，正式提供对jpa的支持，目前支持的实现包括toplink,hibernate entitymanager以及openjpa。这也促成了jpa的发<br /><br />展，要知道jpa的好处在于可以分离于容器运行，变得更加的简洁。<br /><br />    对于ejb来说，实体bean一直是被批评的对象，由于其太复杂和庞大。jpa的出现，很大程度的分离了复杂性。这让ejb的推广也变得容易。<br /><br />    但愿不久的将来，jpa能成为真正的标准。<img src ="http://www.blogjava.net/zyl/aggbug/95606.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zyl/" target="_blank">布衣郎</a> 2007-01-23 21:20 <a href="http://www.blogjava.net/zyl/archive/2007/01/23/95606.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ibatis 对象关系实现</title><link>http://www.blogjava.net/zyl/archive/2007/01/16/94229.html</link><dc:creator>布衣郎</dc:creator><author>布衣郎</author><pubDate>Tue, 16 Jan 2007 08:22:00 GMT</pubDate><guid>http://www.blogjava.net/zyl/archive/2007/01/16/94229.html</guid><wfw:comment>http://www.blogjava.net/zyl/comments/94229.html</wfw:comment><comments>http://www.blogjava.net/zyl/archive/2007/01/16/94229.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/zyl/comments/commentRss/94229.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zyl/services/trackbacks/94229.html</trackback:ping><description><![CDATA[    hibernate 的强大在于完全的对象化，对于对象之间的关系解决的比较好，如1对1，1对多，多对1，以及多对多。当然也包括继承关系。<br />    而ibatis这方面就比较逊色了，不过对于也支持简单的关连查询，如1对1，和1对多。对于一般的情况来说，这两种已经足够了，当然不能层叠更新是一个缺陷，看了半天文档，也没有找到对象之间的层叠更新，估计是不支持。<br />    以前的版本ibatis处理关连是通过执行两次sql来实现的，如下的实例：<br />    一对多关联：<br /> 
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><br />&lt;sqlMap namespace="User"&gt;<br />&lt;typeAlias alias="user" type="com.ibatis.sample.User"/&gt;<br />&lt;typeAlias alias="address" type="com.ibatis.sample.Address"/&gt;<br />&lt;resultMap id="get-user-result" class="user"&gt;<br />&lt;result property="id" column="id"/&gt;<br />&lt;result property="name" column="name"/&gt;<br />&lt;result property="sex" column="sex"/&gt;<br />&lt;result property="addresses" column="id" select="User.getAddressByUserId"/&gt;<br />&lt;/resultMap&gt;<br />&lt;select id="getUsers" parameterClass="java.lang.String" resultMap="get-user-result"&gt;<br />&lt;![CDATA[<br />select id,name,sex <br />from t_user<br />where id = #id#<br />]]&gt;<br />&lt;/select&gt;<br />&lt;select id="getAddressByUserId" parameterClass="int" resultClass="address"&gt;<br />&lt;![CDATA[<br />select address,zipcode<br />from t_address<br />where user_id = #userid#<br />]]&gt;<br />&lt;/select&gt;<br />&lt;/sqlMap&gt;     </div><br /><br />这里通过在resultMap 中定义嵌套查询getAddressByUserId，我们实现了关联数据的读取。<br />需要注意的是，这里有一个潜在的性能问题，也就是所谓“n+1”Select问题。<br />一对一关联：<br />对于这种情况，我们可以采用一次Select两张表的方式，避免这样的性能开销（假设上面示例中，每个User 只有一个对应的Address记录）：<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><br /> <br />&lt;resultMap id="get-user-result" class="user"&gt;<br />&lt;result property="id" column="id"/&gt;<br />&lt;result property="name" column="name"/&gt;<br />&lt;result property="sex" column="sex"/&gt;<br />&lt;result property="address" column="t_address.address"/&gt;<br />&lt;result property="zipCode" column="t_address.zipcode"/&gt;<br />&lt;/resultMap&gt;<br />&lt;select id="getUsers" parameterClass="java.lang.String" resultMap="get-user-result"&gt;<br />&lt;![CDATA[<br />select *<br />from t_user,t_address<br />where t_user.id=t_address.user_id<br />]]&gt;<br />&lt;/select&gt;<br />      </div><br /><br />在现在的版本中，对于n+1问题，ibatis已经很好的解决了。如下的配置：<br />一对一<br /> 
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><br />&lt;resultMap id=”get-product-result” class=”com.ibatis.example.Product”&gt;<br />&lt;result property=”id” column=”PRD_ID”/&gt;<br />&lt;result property=”description” column=”PRD_DESCRIPTION”/&gt;<br />&lt;result property=”category” resultMap=“get-category-result” /&gt;<br />&lt;/resultMap&gt;<br />&lt;resultMap id=”get-category-result” class=”com.ibatis.example.Category”&gt;<br />&lt;result property=”id” column=”CAT_ID” /&gt;<br />&lt;result property=”description” column=”CAT_DESCRIPTION” /&gt;<br />&lt;/resultMap&gt;<br />&lt;select id=”getProduct” parameterClass=”int” resultMap=”get-product-result”&gt;<br />select *<br />from PRODUCT, CATEGORY<br />where PRD_CAT_ID=CAT_ID<br />and PRD_ID = #value#<br />&lt;/select&gt;     </div><br />可以使用内在的resultMap来解决此问题。<br />同样一对多如下：
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><br /> <br />&lt;sqlMap namespace="ProductCategory"&gt;<br />&lt;resultMap id=”categoryResult” class=”com.ibatis.example.Category” groupBy=”id”&gt;<br />&lt;result property=”id” column=”CAT_ID”/&gt;<br />&lt;result property=”description” column=”CAT_DESCRIPTION”/&gt;<br />&lt;result property=”productList” resultMap=”ProductCategory.productResult”/&gt;<br />&lt;/resultMap&gt;<br />&lt;resultMap id=”productResult” class=”com.ibatis.example.Product”&gt;<br />&lt;result property=”id” column=”PRD_ID”/&gt;<br />&lt;result property=”description” column=”PRD_DESCRIPTION”/&gt;<br />&lt;/resultMap&gt;<br />&lt;select id=”getCategory” parameterClass=”int” resultMap=”categoryResult”&gt;<br />select C.CAT_ID, C.CAT_DESCRIPTION, P.PRD_ID, P.PRD_DESCRIPTION<br />from CATEGORY C<br />left outer join PRODUCT P<br />on C.CAT_ID = P.PRD_CAT_ID<br />where CAT_ID = #value#<br />&lt;/select&gt;<br />&lt;/sqlMap&gt;     </div><br /><br />注意，需要使用增加groupBy属性来分类<br /><br /><img src ="http://www.blogjava.net/zyl/aggbug/94229.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zyl/" target="_blank">布衣郎</a> 2007-01-16 16:22 <a href="http://www.blogjava.net/zyl/archive/2007/01/16/94229.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ibatis如何支持clob 和blob</title><link>http://www.blogjava.net/zyl/archive/2007/01/13/93667.html</link><dc:creator>布衣郎</dc:creator><author>布衣郎</author><pubDate>Sat, 13 Jan 2007 13:53:00 GMT</pubDate><guid>http://www.blogjava.net/zyl/archive/2007/01/13/93667.html</guid><wfw:comment>http://www.blogjava.net/zyl/comments/93667.html</wfw:comment><comments>http://www.blogjava.net/zyl/archive/2007/01/13/93667.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zyl/comments/commentRss/93667.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zyl/services/trackbacks/93667.html</trackback:ping><description><![CDATA[    这几天仔细看了一下ibatis的文档，发现2.2后，ibatis的改变还是挺大的。对于自定义类型支持的也不错，这样对于blob和clob数据的处理也就简单多了。<br />    不过在spring 中已经提供了很好的实现，所以这又省去了很多的功夫，接下来看看ibatis是如何支持clob和blob的。<br /><br />    ibatis提供了TypeHandler接口，用于处理数据类型，基本的实现类为BaseTypeHandler<br />    在spring 中，提供了AbstractLobTypeHandler作为基础类，并且提供了相应的模版方法，所有的工作由LobHandler处理。<br />    BlobByteArrayTypeHandler 主要用于处理blob类型数据，使用byte[]来映射相应的blob<br />    ClobStringTypeHandler 用于处理clob类型数据，使用字符串来映射Clob<br />    有一点需要注意的是，AbstractLobTypeHandler中实现了事务支持，需要用来释放相应的资源，所以一定需要在事务环境中进行。<br /><br />下面是一个简单的例子：<br /><br />public class Food {<br />    private String content;<br /><br />    private String id;<br /><br />    private byte[] image;<br /><br />    private String name;    <br />        ...<br />}<br /><br />xml如下：说明一下，在resultMap中可以通过typeHandler来指定具体的handler.在inline变量中，可以通过handler来定义相应的typeHandler<br /><br />&lt;sqlMap namespace="Food"&gt;<br />    <br />    &lt;typeAlias alias="Food" type="org.esoft.hdb.bo.Food"/&gt;<br />    &lt;resultMap id="foodResult" class="Food"&gt;<br />        &lt;result property="id" column="C_ID"/&gt;<br />        &lt;result property="name" column="C_NAME"/&gt;<br />        &lt;result property="content" column="C_content"<br />            typeHandler="org.springframework.orm.ibatis.support.ClobStringTypeHandler"/&gt;<br />        &lt;result property="image" column="C_image"<br />            typeHandler="org.springframework.orm.ibatis.support.BlobByteArrayTypeHandler"/&gt;<br />    &lt;/resultMap&gt;<br />    &lt;sql id="foodFragment"&gt;select C_ID,C_NAME,C_CONTENT,C_IMAGE from T_FOOD&lt;/sql&gt;<br />        &lt;select id="getAll" resultMap="foodResult"&gt;<br />        &lt;include refid="foodFragment"/&gt;<br />    &lt;/select&gt;<br />    &lt;select id="selectById" parameterClass="string" resultMap="foodResult"&gt;<br />        &lt;include refid="foodFragment"/&gt; where C_ID=#id#&lt;/select&gt;<br />    <br />    &lt;insert id="insert" parameterClass="Food"&gt; insert into T_FOOD ( C_ID,<br />        C_NAME,C_CONTENT, C_IMAGE) values ( #id#,<br />        #name#,#content,handler=org.springframework.orm.ibatis.support.ClobStringTypeHandler#,<br />        #image,handler=org.springframework.orm.ibatis.support.BlobByteArrayTypeHandler#)<br />        &lt;/insert&gt;<br />    <br />    &lt;update id="update" parameterClass="Food"&gt; update T_FOOD set C_NAME = #name#,<br />        C_CONTENT =<br />        #content,handler=org.springframework.orm.ibatis.support.ClobStringTypeHandler#,<br />        C_IMAGE =<br />        #image,handler=org.springframework.orm.ibatis.support.BlobByteArrayTypeHandler#<br />        where C_ID = #id# &lt;/update&gt;<br />    <br />    &lt;delete id="deleteById" parameterClass="string"&gt; delete from T_FOOD where C_ID = #id#<br />        &lt;/delete&gt;<br />    <br />&lt;/sqlMap&gt;<br /><br /><br />public interface FoodService {<br /><br />    <br />    void save(Food food);<br />    Food get(String id);<br />    /**<br />     * @param food<br />     */<br />    void update(Food food);<br />}<br /><br />public class FoodServiceImpl implements FoodService {<br />     private FoodDAO foodDAO;<br /><br />    private DaoCreator creator;<br /><br />    public void setCreator(DaoCreator creator) {<br />        this.creator = creator;<br />    }<br /><br />    protected FoodDAO getFoodDAO() {<br />        if (foodDAO == null) {<br />            foodDAO = (FoodDAO) creator.createDao(FoodDAO.class, Food.class);<br />        }<br />        return foodDAO;<br />    }<br /><br />    public Food get(String id) {<br />        return getFoodDAO().get(id);<br />    }<br />    public void save(Food food) {<br />        getFoodDAO().save(food);<br />    }<br />    public void update(Food food) {<br />        getFoodDAO().update(food);<br />    }<br /><br />}<br /><br />spring xml 配置：<br />。。。<br />          &lt;bean id="lobHandler"<br />        class="org.springframework.jdbc.support.lob.DefaultLobHandler"/&gt;<br />    <br />    &lt;bean id="transactionManager"<br />        class="org.springframework.jdbc.datasource.DataSourceTransactionManager"&gt;<br />        &lt;property name="dataSource" ref="dataSource"/&gt;<br />    &lt;/bean&gt;<br />    <br />    &lt;bean id="sqlMapClient"<br />        class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"&gt;<br />        &lt;property name="dataSource" ref="dataSource"/&gt;<br />        &lt;property name="configLocation"&gt;<br />            &lt;value&gt;SqlMapConfig.xml&lt;/value&gt;<br />        &lt;/property&gt;<br />        &lt;property name="lobHandler" ref="lobHandler"/&gt;<br />    &lt;/bean&gt;<br />    <br />    &lt;bean id="daoCreate" class="org.esoft.hdb.ibatis.IbatisDaoCreator"&gt;<br />        &lt;property name="sqlMapClient" ref="sqlMapClient"/&gt;<br />    &lt;/bean&gt;<br />    <br />    &lt;bean id="foodService" class="org.esoft.hdb.service.FoodServiceImpl"&gt;<br />        &lt;property name="creator" ref="daoCreate"/&gt;<br />    &lt;/bean&gt;<br />    <br />    <br />    &lt;aop:config&gt;<br />        &lt;aop:pointcut id="foodServiceMethods"<br />            expression="execution(* org.esoft.hdb.service.FoodService.*(..))"/&gt;<br />        &lt;aop:advisor advice-ref="txAdvice" pointcut-ref="foodServiceMethods"/&gt;<br />    &lt;/aop:config&gt;<br />    &lt;tx:advice id="txAdvice" transaction-manager="transactionManager"&gt;<br />        &lt;tx:attributes&gt;<br />            &lt;tx:method name="*" propagation="REQUIRED"/&gt;<br />        &lt;/tx:attributes&gt;<br />    &lt;/tx:advice&gt;<br /><br />简单的测试：<br />save :<br />        Food food = new Food();<br />        food.setPk("1");<br />        food.setName("food1");<br />        BufferedInputStream in = new BufferedInputStream(getClass()<br />                .getResourceAsStream("/1.gif"));<br />        byte[] b = FileCopyUtils.copyToByteArray(in);<br />        food.setImage(b);<br />                in = new BufferedInputStream(getClass().getResourceAsStream(<br />                "/hibernate.cfg.xml"));<br />        b = FileCopyUtils.copyToByteArray(in);<br />        food.setContent(new String(b));<br />        foodService.save(food);<br />update:<br />              Food food = foodService.get("1");<br />        BufferedInputStream in = new BufferedInputStream(getClass()<br />                .getResourceAsStream("/jdbc.properties"));<br />        byte[] b = FileCopyUtils.copyToByteArray(in);<br />        food.setContent(new String(b));<br />        foodService.update(food);<br />        food = foodService.get("1");<br />        assertNotNull(food.getImage());<img src ="http://www.blogjava.net/zyl/aggbug/93667.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zyl/" target="_blank">布衣郎</a> 2007-01-13 21:53 <a href="http://www.blogjava.net/zyl/archive/2007/01/13/93667.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ibatis 开始之旅</title><link>http://www.blogjava.net/zyl/archive/2007/01/10/93001.html</link><dc:creator>布衣郎</dc:creator><author>布衣郎</author><pubDate>Wed, 10 Jan 2007 12:27:00 GMT</pubDate><guid>http://www.blogjava.net/zyl/archive/2007/01/10/93001.html</guid><wfw:comment>http://www.blogjava.net/zyl/comments/93001.html</wfw:comment><comments>http://www.blogjava.net/zyl/archive/2007/01/10/93001.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zyl/comments/commentRss/93001.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zyl/services/trackbacks/93001.html</trackback:ping><description><![CDATA[    用了很久hibernate ，突然想换个别的orm 工具，当然在orm领域中，hibernate是老大。看了一下ibatis，发现如果对于crud操作不是很多的系统来说，是个不错的选择，尤其是适合那些对sql和性能热衷的开发者。综合来说ibatis不能算orm工具，只能算个半成品。不过比起直接用jdbc写，那还是方便多了。主要的好处是分离了sql和代码，如果你想追求性能，那么sql是你很好的利器，当然ibatis的缓存也不错。比起hibernate，ibatis就简单多了，估计也就3天能够基本掌握了，这大大减少了学习成本。<br />    说了那么多废话，下面开始正题，通过一个简单的实例开始ibatis之旅，文章大部分参考网上的ibatis 开发指南一文。<br />    主要的jar：ibatis 2.3.0,spring 2.0.1,log4j 1.2.9,commons-logging 1.0.4,hsqldb 1.8.0<br />    <b>ibatis实例配置：</b><br /> <br />&lt;sqlMapConfig&gt;<br />&lt;!-- 事务采用spring 管理 --&gt;<br />  &lt;!--<br />  &lt;transactionManager type="JDBC" commitRequired="false"&gt;<br />    &lt;dataSource type="SIMPLE"&gt;<br />      &lt;property name="JDBC.Driver" value="org.hsqldb.jdbcDriver"/&gt;<br />      &lt;property name="JDBC.ConnectionURL" value="jdbc:hsqldb:hsql://localhost/xdb"/&gt;<br />      &lt;property name="JDBC.Username" value="sa"/&gt;<br />      &lt;property name="JDBC.Password" value=""/&gt;<br />    &lt;/dataSource&gt;<br />  &lt;/transactionManager&gt;<br />--&gt;<br />  &lt;sqlMap resource="org/esoft/bo/xml/Account.xml"/&gt;<br />&lt;/sqlMapConfig&gt;     <br /><br /><b>创建POJO对象：</b><br /><br /> <br />package com.esoft.bo;<br /><br />public class Account {<br /><br />    private String emailAddress;<br /><br />    private String firstName;<br /><br />    private int id;<br /><br />    private String lastName;<br /><br />    public String getEmailAddress() {<br />        return emailAddress;<br />    }<br /><br />    public String getFirstName() {<br />        return firstName;<br />    }<br /><br />    public int getId() {<br />        return id;<br />    }<br /><br />    public String getLastName() {<br />        return lastName;<br />    }<br /><br />    public void setEmailAddress(String emailAddress) {<br />        this.emailAddress = emailAddress;<br />    }<br /><br />    public void setFirstName(String firstName) {<br />        this.firstName = firstName;<br />    }<br /><br />    public void setId(int id) {<br />        this.id = id;<br />    }<br /><br />    public void setLastName(String lastName) {<br />        this.lastName = lastName;<br />    }<br /><br />}     <br /><br /><b>映射文件</b>，感觉比较的麻烦。以后有机会的话一定自动生成此文件，尤其现在jpa当道。<br /> <br />&lt;?xml version="1.0" encoding="UTF-8" ?&gt;<br /><br />&lt;!DOCTYPE sqlMap      <br />    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"      <br />    "http://ibatis.apache.org/dtd/sql-map-2.dtd"&gt;<br /><br />&lt;sqlMap namespace="Account"&gt;<br />    <br />    &lt;!-- Use type aliases to avoid typing the full classname every time. --&gt;<br />    &lt;typeAlias alias="Account" type="com.esoft.bo.Account"/&gt;<br />    <br />    &lt;!-- Result maps describe the mapping between the columns returned<br />    from a query, and the class properties.  A result map isn't<br />    necessary if the columns (or aliases) match to the properties <br />    exactly. --&gt;<br />    &lt;resultMap id="AccountResult" class="Account"&gt;<br />        &lt;result property="id" column="ACC_ID"/&gt;<br />        &lt;result property="firstName" column="ACC_FIRST_NAME"/&gt;<br />        &lt;result property="lastName" column="ACC_LAST_NAME"/&gt;<br />        &lt;result property="emailAddress" column="ACC_EMAIL"/&gt;<br />    &lt;/resultMap&gt;<br />    <br />    &lt;!-- Select with no parameters using the result map for Account class. --&gt;<br />    &lt;select id="selectAllAccounts" resultMap="AccountResult"&gt; <br />        select * from ACCOUNT<br />        &lt;/select&gt;<br />    <br />    &lt;select id="selectByName" resultMap="AccountResult" parameterClass="String"&gt;<br />        select * from Account where ACC_FIRST_NAME like #name#<br />    &lt;/select&gt;<br />    <br />    &lt;!-- A simpler select example without the result map.  Note the <br />    aliases to match the properties of the target result class. --&gt;<br />    &lt;select id="selectAccountById" parameterClass="int" resultClass="Account"&gt;<br />        select ACC_ID as id, ACC_FIRST_NAME as firstName, ACC_LAST_NAME as lastName,<br />        ACC_EMAIL as emailAddress from ACCOUNT where ACC_ID = #id# &lt;/select&gt;<br />    <br />    &lt;!-- Insert example, using the Account parameter class --&gt;<br />    &lt;insert id="insertAccount" parameterClass="Account"&gt; insert into ACCOUNT ( ACC_ID,<br />        ACC_FIRST_NAME, ACC_LAST_NAME, ACC_EMAIL) values ( #id#, #firstName#,<br />        #lastName#, #emailAddress# ) &lt;/insert&gt;<br />    <br />    &lt;!-- Update example, using the Account parameter class --&gt;<br />    &lt;update id="updateAccount" parameterClass="Account"&gt; update ACCOUNT set<br />        ACC_FIRST_NAME = #firstName#, ACC_LAST_NAME = #lastName#, ACC_EMAIL =<br />        #emailAddress# where ACC_ID = #id# &lt;/update&gt;<br />    <br />    &lt;!-- Delete example, using an integer as the parameter class --&gt;<br />    &lt;delete id="deleteAccountById" parameterClass="int"&gt; delete from ACCOUNT where<br />        ACC_ID = #id# &lt;/delete&gt;<br />    <br />    &lt;delete id="clearAccount"&gt; delete from ACCOUNT &lt;/delete&gt;<br />    <br />&lt;/sqlMap&gt;     <br /><br /><b>spring 配置：</b><br /> <br />...<br />&lt;bean id="dataSource"<br />        class="org.springframework.jdbc.datasource.DriverManagerDataSource"&gt;<br />        &lt;property name="driverClassName"&gt;<br />            &lt;value&gt;${jdbc.driverClassName}&lt;/value&gt;<br />        &lt;/property&gt;<br />        &lt;property name="url"&gt;<br />            &lt;value&gt;${jdbc.url}&lt;/value&gt;<br />        &lt;/property&gt;<br />        &lt;property name="username"&gt;<br />            &lt;value&gt;${jdbc.username}&lt;/value&gt;<br />        &lt;/property&gt;<br />        &lt;property name="password"&gt;<br />            &lt;value&gt;${jdbc.password}&lt;/value&gt;<br />        &lt;/property&gt;<br />    &lt;/bean&gt;<br />         &lt;bean id="transactionManager"<br />        class="org.springframework.jdbc.datasource.DataSourceTransactionManager"&gt;<br />        &lt;property name="dataSource" ref="dataSource"/&gt;<br />     &lt;/bean&gt;<br />    <br />       &lt;bean id="sqlMapClient"<br />        class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"&gt;<br />        &lt;property name="dataSource" ref="dataSource"/&gt;<br />        &lt;property name="configLocation"&gt;<br />            &lt;value&gt;SqlMapConfig.xml&lt;/value&gt;<br />        &lt;/property&gt;<br />      &lt;/bean&gt;<br />      &lt;bean id="accountDao" class="org.esoft.dao.AccountDaoImpl"&gt;<br />             &lt;property name="sqlMapClient" ref="sqlMapClient"/&gt;<br />      &lt;/bean&gt;       <br />     <br /><br /><b>主要的代码：</b><br />public class AccountDaoImpl<br />        extends SqlMapClientDaoSupport {<br />    public PK save(Account obj) {<br />        return (PK) getSqlMapClientTemplate().insert("insertAccount", obj);<br />    }<br />    public void update(Accountobj) {<br />        getSqlMapClientTemplate().update("updateAccount", obj);<br />    }<br />     public void delete(Account obj) {<br />        getSqlMapClientTemplate().delete(<br />                "deleteAccountById",<br />                obj.getPk());<br />    }<br />    public Account get(PK primaryKey) {<br />        return (Account) getSqlMapClientTemplate().queryForObject(<br />                "selectAccountById",<br />                primaryKey);<br />    }<br />}<br /><br /><br /><img src ="http://www.blogjava.net/zyl/aggbug/93001.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zyl/" target="_blank">布衣郎</a> 2007-01-10 20:27 <a href="http://www.blogjava.net/zyl/archive/2007/01/10/93001.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>