iBatis2学习笔记:单表映射

环境:
MySQL5.51b
iBatis 2.3
Spring 2.5.4
 
 
一、SQL
/*==============================================================*/ 
/* Table: foo                                                   */ 
/*==============================================================*/ 
create  table foo 

   id                    bigint
    name                  varchar(20), 
   type                  varchar(20), 
   remark                varchar(600) 
); 

alter  table foo comment  '单表';
 
二、POJO
public  class Foo {  
     private Long id;  
     private String name;  
     private String type;  
     private String remark;  
 
三、SqlMap
<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE sqlMap  PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd" > 

<sqlMap namespace="foo"> 
    <typeAlias alias="foo" type="com.lavasoft.ssi.domain.Foo"/> 

    <! -- 映射结果集 --> 
    <resultMap id="result_base" class="foo"> 
        <result property="id"  column="id"/> 
        <result property=" namecolumn=" name"/> 
    </resultMap> 
    <! -- 继承映射结果集 --> 
    <resultMap id="result" class="foo" extends="result_base"> 
        <result property="type"  column="type"/> 
        <result property="remark"  column="remark"/> 
    </resultMap> 
    <resultMap id="result_map" class="foo"> 
        <result property="id"  column="fid"/> 
        <result property=" namecolumn="fname"/> 
        <result property="remark"  column="fremark"/> 
    </resultMap> 

    <! -- 插入操作:以域对象foo做参数 --> 
    < insert id=" insert" parameterClass="foo"> 
         insert  into foo( name,type,remark)  values(# name#,#type#,#remark#) 
        <selectKey keyProperty="id" resultClass="long"> 
             select LAST_INSERT_ID() 
        </selectKey> 
    </ insert
    <! -- 更新操作:以域对象foo做参数 --> 
    < update id=" update" parameterClass="foo"> 
         update foo  set  name = # name#, type = #type#, remark = #remark#  where id = #id# 
    </ update
    <! -- 多个参数情况下,用Map或者域对象做参数均可以,但域对象通常有更好的性能 --> 
    <! -- 更新操作:以Map做参数 --> 
    < update id="updateSomeByMap" parameterClass="map"> 
         update foo  set  name = # name#, remark = #remark#  where id = #id# 
    </ update
    <! -- 更新操作:以域对象做参数 --> 
    < update id="updateSomeByObject" parameterClass="foo"> 
         update foo  set  name = # name#, remark = #remark#  where id = #id# 
    </ update
    <! -- where条件的三种写法“id = #value#,id = #id# id = #?#”均正确,查询结果相同  --> 
    <! -- 结果集应该优先使用域对象 --> 
    <! -- resultClass表示结果封装为foo类型,parameterClass表示参数类型,resultMap指定查询结果要填充的字段和对应关系 --> 
    < select id="getById" resultClass="foo" parameterClass="long" resultMap="result"> 
         select *  from foo  where id = #value# 
    </ select
    <! -- 查询多条记录:结果封装为List<Foo> --> 
    < select id="foo.getAll" resultClass="foo" resultMap="result"> 
        <![CDATA[ 
         select id, name,type,remark  from foo  where id > 0  and id < 8 
        ]]> 
    </ select
    <! -- 查询多条记录:结果封装在List<HashMap>中 --> 
    < select id="getAll2" resultMap="result_map" resultClass="map"> 
        <![CDATA[ 
         select id  as fid,  name  as fname, remark  as fremark  from foo  where id > 0  and id < 8 
        ]]> 
    </ select
    < select id="getAll3"> 
        <![CDATA[ 
         select id  as xid,  name  as xname  from foo 
        ]]> 
    </ select
    < select id="getAll4"> 
        <![CDATA[ 
         select id,type  as  name  from foo   where id > 0  and id < 8 
        ]]> 
    </ select
    < delete id="deleteById" parameterClass="long"> 
         delete  from foo  where id = #value# 
    </ delete
    < delete id="deleteAll"> 
         delete  from foo 
    </ delete
    < select id="getCount" resultClass=" int"> 
         select  count(id)  from foo 
    </ select
    < select id="getByDynamic" resultMap="result" parameterClass="foo"> 
         select *  from foo 
        <dynamic prepend=" where"> 
            <isNotNull prepend=" and" property=" name"> 
                ( name  like # name#) 
            </isNotNull> 
            <isNotEmpty prepend=" and"> 
                (type  like  '%'|| #type# || '%'
            </isNotEmpty> 
        </dynamic> 
        <isGreaterThan prepend=" where" property="id" compareValue="10"> 
            remark  is  not  null 
        </isGreaterThan> 
    </ select
</sqlMap>         
  
 
三、DAO即测试代码
 
public  interface FooDAO { 
     public Long insert(Foo foo); 
     public  int getCount(); 
     public  int update(Foo foo); 
     public  int updateSomeByMap(Long id,String name,String remark); 
     public  int updateSomeByObject(Long id,String name,String remark); 
     public Foo getById(Long id); 
     public List getAll(); 
     public Object getAll2(); 
     public List getAll3(); 
     public List getAll4(); 
     public List getByDynamic(Foo foo); 
     public  int deleteById(Long id); 
     public  int deteteAll(); 
}
 
public  class FooDAOImpl  extends SqlMapClientDaoSupport  implements FooDAO { 

     public Long insert(Foo foo) { 
        return  (Long)getSqlMapClientTemplate().insert( "foo.insert", foo); 
    } 

     public  int getCount() { 
         return (Integer)getSqlMapClientTemplate().queryForObject( "foo.getCount"); 
    } 

     public  int update(Foo foo) { 
         return getSqlMapClientTemplate().update( "foo.update", foo); 
    } 

     public  int updateSomeByMap(Long id, String name, String remark) { 
        Map pm =  new HashMap(); 
        pm.put( "id", id); 
        pm.put( "name", name); 
        pm.put( "remark", remark); 
         return getSqlMapClientTemplate().update( "foo.updateSomeByMap", pm); 
    } 

     public  int updateSomeByObject(Long id,String name,String remark) { 
        Foo foo =  new Foo(); 
        foo.setId(id); 
        foo.setName(name); 
        foo.setRemark(remark); 
         return getSqlMapClientTemplate().update( "foo.updateSomeByObject", foo); 
    } 

     public Foo getById(Long id) { 
         return (Foo) getSqlMapClientTemplate().queryForObject( "foo.getById",id); 
    } 

     public List getAll() { 
         return getSqlMapClientTemplate().queryForList( "foo.getAll"); 
    } 

     public Object getAll2() { 
//        return getSqlMapClientTemplate().queryForList(); 
        List<String> ls =  new ArrayList<String>(); 


         return getSqlMapClientTemplate().queryForMap( "foo.getAll2", null, "id"); 
    } 

     public List getAll3() { 
        Object obj =getSqlMapClientTemplate().queryForObject( "foo.getAll3"); 
         return getSqlMapClientTemplate().queryForList( "foo.getAll3"); 
    } 

     public List getAll4() { 
         return getSqlMapClientTemplate().queryForList( "foo.getAll4"); 
    } 

     public List getByDynamic(Foo foo) { 
         return getSqlMapClientTemplate().queryForList( "foo.getByDynamic",foo); 
    } 

     public  int deleteById(Long id) { 
         return getSqlMapClientTemplate().delete( "foo.deleteById",id); 
    } 

     public  int deteteAll() { 
         return getSqlMapClientTemplate().delete( "foo.deleteAll"); 
    } 
}
 
package com.lavasoft.ssi.test; 

import com.lavasoft.ssi.dao.FooDAO; 
import com.lavasoft.ssi.common.utils.ApplicationContextUtils; 
import com.lavasoft.ssi.domain.Foo; 

import java.util.Random; 
import java.util.List; 
import java.util.Map; 
import java.util.Iterator; 

/** 
* Created by IntelliJ IDEA.<br> 
* <b>User</b>: leizhimin<br> 
* <b>Date</b>: 2008-6-15 9:29:26<br> 
* <b>Note</b>: FooDAO的测试 
*/
 
public  class FooDAOTest { 
     private FooDAO fooDAO = (FooDAO) ApplicationContextUtils.getApplicationContext().getBean( "fooDAO"); 

     public  void testInsert() { 
        System.out.println( "--------insert(Foo foo)--------"); 
        Foo foo =  new Foo( "变态""ttt""插入数据测试!"); 
         for ( int i = 0; i < 15; i++) { 
            Long pk = fooDAO.insert(foo); 
            System.out.println( "所插入数据的ID=" + pk); 
        } 
    } 

     public  void testGetCount() { 
        System.out.println( "--------testGetCount()--------"); 
         int count = fooDAO.getCount(); 
        System.out.println( "记录总数=" + count); 

    } 

     public  void testUpdate() { 
        System.out.println( "--------update(Foo foo)--------"); 
        String upRemark =  "已更新" +  new Random( new Random().nextLong()).nextInt(); 
        Long pk = 1L; 

        Foo foo = fooDAO.getById(pk); 
        System.out.println( "更新前" + foo); 

        foo.setRemark(upRemark); 
        fooDAO.update(foo); 
        Foo foo1 = fooDAO.getById(pk); 
        System.out.println( "更新后" + foo1); 
    } 

     public  void testUpdateSomeByMap() { 
        System.out.println( "------updateSomeByMap(Long id,String name,String remark)------"); 
        String upRemark =  "已更新" +  new Random( new Random().nextLong()).nextInt(); 
        Long pk = 2L; 
        String name =  null

        Foo foo = fooDAO.getById(pk); 
        System.out.println( "更新前" + foo); 

        fooDAO.updateSomeByMap(pk, name, upRemark); 

        Foo foo1 = fooDAO.getById(pk); 
        System.out.println( "更新后" + foo1); 
    } 

     public  void testUpdateSomeByObject() { 
        System.out.println( "------updateSomeByObject(Long id,String name,String remark)------"); 
        String upRemark =  "已更新" +  new Random( new Random().nextLong()).nextInt(); 
        Long pk = 3L; 
        String name =  null

        Foo foo = fooDAO.getById(pk); 
        System.out.println( "更新前" + foo); 

        fooDAO.updateSomeByObject(pk, name, upRemark); 

        Foo foo1 = fooDAO.getById(pk); 
        System.out.println( "更新后" + foo1); 
    } 

     public  void testGetById() { 
        System.out.println( "------getById(Long id)------"); 
        Long pk = 4L; 
        Foo foo = fooDAO.getById(pk); 
        System.out.println( "结果集" + foo); 
    } 

     public  void testGetAll() { 
        System.out.println( "------getAll()------"); 
        List<Foo> list = fooDAO.getAll(); 
         for (Foo foo : list) { 
            System.out.println( "getAll结果集>>>" + foo); 
        } 
    } 

     public  void testGetAll2() { 
        System.out.println( "------getAll2()------"); 
        Object rs = fooDAO.getAll2(); 
         if (rs  instanceof List) { 
            System.out.println( "结果集为List"); 
             for (Object obj : (List) rs) { 
                 if (obj  instanceof Map) { 
                    System.out.println( "结果集Map的元素");                     
                    Map objMap = (Map) obj; 
                     for (Iterator<Map.Entry> it = objMap.entrySet().iterator(); it.hasNext();) { 
                        Map.Entry me = it.next(); 
                        System.out.println( "\t" + me.getKey() +  "\t" + me.getValue()); 
                    } 
                } else  if(obj  instanceof Foo){ 
                    System.out.println( "结果集为Foo类型:"+obj); 
                } 
            } 
        } 

    } 

     public  void testGetAll3() { 
        System.out.println( "------getAll3()------"); 
        List<Foo> list = fooDAO.getAll3(); 
         for (Foo foo : list) { 
            System.out.println( "getAll3结果集>>>" + foo); 
        } 
    } 

     public  void testGetAll4() { 
        System.out.println( "------getAll4()------"); 
        List<Foo> list = fooDAO.getAll4(); 
         for (Foo foo : list) { 
            System.out.println( "getAll4结果集>>>" + foo); 
        } 
    } 

     public  void testGetByDynamic() { 
        System.out.println( "------getByDynamic(Foo foo)------"); 
        Foo foo =  new Foo(); 
        foo.setName( "变态"); 
        foo.setType( "t"); 

        List<Foo> list = fooDAO.getByDynamic(foo); 
         for (Foo f : list) { 
            System.out.println( "getByDynamic结果集>>>" + f); 
        } 
    } 

     public  void testDeleteById() { 
        System.out.println( "------deleteById(Long id)------"); 
        Long pk = 10L; 
         int ef = fooDAO.deleteById(pk); 
        System.out.println( "删除记录数 = " + ef); 
    } 

     public  void testDeleteAll() { 
        System.out.println( "------deteteAll()------"); 
         int ef = fooDAO.deteteAll(); 
        System.out.println( "删除记录数 = " + ef); 
    } 

     public  static  void main(String args[]) { 
        System.out.println( "正在测试FooDAO"); 
        FooDAOTest fooDAOTest =  new FooDAOTest(); 
        fooDAOTest.testInsert(); 
        fooDAOTest.testGetCount(); 
        fooDAOTest.testUpdate(); 
        fooDAOTest.testUpdateSomeByMap(); 
        fooDAOTest.testUpdateSomeByObject(); 
        fooDAOTest.testGetById(); 
        fooDAOTest.testGetAll(); 
        fooDAOTest.testGetAll2(); 
        fooDAOTest.testGetAll3(); 
        fooDAOTest.testGetAll4(); 
        fooDAOTest.testGetByDynamic(); 
//        fooDAOTest.testDeleteById(); 
//        fooDAOTest.testDeleteAll(); 
    } 
}
 
 
三、其他的资源文件
 
Spring2 的 application.xml
<? xml  version ="1.0"  encoding ="UTF-8" ?> 

< beans  default-autowire ="byType" 
        xmlns ="http://www.springframework.org/schema/beans" 
        xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation ="http://www.springframework.org/schema/beans [url]http://www.springframework.org/schema/beans/spring-beans-2.0.xsd[/url]" > 

     < bean  id ="propertyConfig"  class ="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" > 
         < property  name ="locations" > 
             < list > 
                 < value >classpath:jdbc.properties </ value > 
             </ list > 
         </ property > 
     </ bean > 
    <!--  配置系统的数据源 --> 
     < bean  id ="dataSource"  class ="org.apache.commons.dbcp.BasicDataSource"  destroy-method ="close" > 
         < property  name ="driverClassName" > 
             < value >${jdbc.driver} </ value > 
         </ property > 
         < property  name ="url" > 
             < value >${jdbc.url} </ value > 
         </ property > 
         < property  name ="username" > 
             < value >${jdbc.username} </ value > 
         </ property > 
         < property  name ="password" > 
             < value >${jdbc.password} </ value > 
         </ property > 
     </ bean > 


     < bean  id ="transactionManager" 
           class ="org.springframework.jdbc.datasource.DataSourceTransactionManager" > 
         < property  name ="dataSource"  ref ="dataSource" /> 
     </ bean > 

    <!-- 根据dataSource和configLocation创建一个SqlMapClient--> 
     < bean  id ="sqlMapClient" 
           class ="org.springframework.orm.ibatis.SqlMapClientFactoryBean" > 
         < property  name ="configLocation"  value ="sqlMapConfig.xml" /> 
         < property  name ="dataSource"  ref ="dataSource" /> 
     </ bean > 

     < bean  id ="fooDAO"  class ="com.lavasoft.ssi.dao.ibatis.FooDAOImpl" > 
         < property  name ="sqlMapClient"  ref ="sqlMapClient" /> 
     </ bean > 
     < bean  id ="customerDAO"  class ="com.lavasoft.ssi.dao.ibatis.CustomerDAOImpl" > 
         < property  name ="sqlMapClient"  ref ="sqlMapClient" /> 
     </ bean > 
     < bean  id ="ordersDAO"  class ="com.lavasoft.ssi.dao.ibatis.OrdersDAOImpl" > 
         < property  name ="sqlMapClient"  ref ="sqlMapClient" /> 
     </ bean > 
     < bean  id ="userDAO"  class ="com.lavasoft.ssi.dao.ibatis.UserDAOImpl" > 
         < property  name ="sqlMapClient"  ref ="sqlMapClient" /> 
     </ bean > 
     < bean  id ="roleDAO"  class ="com.lavasoft.ssi.dao.ibatis.RoleDAOImpl" > 
         < property  name ="sqlMapClient"  ref ="sqlMapClient" /> 
     </ bean > 
     < bean  id ="tlinkDAO"  class ="com.lavasoft.ssi.dao.ibatis.TlinkDAOImpl" > 
         < property  name ="sqlMapClient"  ref ="sqlMapClient" /> 
     </ bean > 

</ beans >
 
jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver 
jdbc.url=jdbc:mysql://localhost:3306/ssitest 
jdbc.username=root 
jdbc.password=leizhimin 
 
sqlMapConfig.xml
<? xml  version ="1.0"  encoding ="GBK"  ?> 
<!DOCTYPE sqlMapConfig 
        PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" 
        "http://www.ibatis.com/dtd/sql-map-config-2.dtd"> 

< sqlMapConfig > 
     < settings 
     cacheModelsEnabled ="true" 
     errorTracingEnabled ="true" 
     enhancementEnabled ="true" 
     lazyLoadingEnabled ="true" 
     maxRequests ="32" 
     maxSessions ="10" 
     maxTransactions ="5" 
     useStatementNamespaces ="true" /> 

    <!--  单表映射 --> 
     < sqlMap  resource ="com/lavasoft/ssi/domain/sqlmap/Foo.xml" /> 

    <!--  一对多映射 --> 
    <!-- <sqlMap resource="com/lavasoft/ssi/domain/sqlmap/Customer.xml"/>--> 
    <!-- <sqlMap resource="com/lavasoft/ssi/domain/sqlmap/Orders.xml"/>--> 

    <!--  多对多映射 --> 
    <!-- <sqlMap resource="com/lavasoft/ssi/domain/sqlmap/User.xml"/>--> 
    <!-- <sqlMap resource="com/lavasoft/ssi/domain/sqlmap/Role.xml"/>--> 
    <!-- <sqlMap resource="com/lavasoft/ssi/domain/sqlmap/Tlink.xml"/>--> 
</ sqlMapConfig > 
 
四、测试结果:
正在测试FooDAO 
log4j:WARN No appenders could be found for logger (org.springframework.context.support.ClassPathXmlApplicationContext). 
log4j:WARN Please initialize the log4j system properly. 
--------insert(Foo foo)-------- 
所插入数据的ID=1 
所插入数据的ID=2 
所插入数据的ID=3 
所插入数据的ID=4 
所插入数据的ID=5 
所插入数据的ID=6 
所插入数据的ID=7 
所插入数据的ID=8 
所插入数据的ID=9 
所插入数据的ID=10 
所插入数据的ID=11 
所插入数据的ID=12 
所插入数据的ID=13 
所插入数据的ID=14 
所插入数据的ID=15 
--------testGetCount()-------- 
记录总数=15 
--------update(Foo foo)-------- 
更新前Foo{id=1, name='变态', type='ttt', remark='插入数据测试!'} 
更新后Foo{id=1, name='变态', type='ttt', remark='已更新-1425040370'} 
------updateSomeByMap(Long id,String name,String remark)------ 
更新前Foo{id=2, name='变态', type='ttt', remark='插入数据测试!'} 
更新后Foo{id=2, name='null', type='ttt', remark='已更新1143492135'} 
------updateSomeByObject(Long id,String name,String remark)------ 
更新前Foo{id=3, name='变态', type='ttt', remark='插入数据测试!'} 
更新后Foo{id=3, name='null', type='ttt', remark='已更新1570858341'} 
------getById(Long id)------ 
结果集Foo{id=4, name='变态', type='ttt', remark='插入数据测试!'} 
------getAll()------ 
getAll结果集>>>Foo{id=1, name='变态', type='ttt', remark='已更新-1425040370'} 
getAll结果集>>>Foo{id=2, name='null', type='ttt', remark='已更新1143492135'} 
getAll结果集>>>Foo{id=3, name='null', type='ttt', remark='已更新1570858341'} 
getAll结果集>>>Foo{id=4, name='变态', type='ttt', remark='插入数据测试!'} 
getAll结果集>>>Foo{id=5, name='变态', type='ttt', remark='插入数据测试!'} 
getAll结果集>>>Foo{id=6, name='变态', type='ttt', remark='插入数据测试!'} 
getAll结果集>>>Foo{id=7, name='变态', type='ttt', remark='插入数据测试!'} 
------getAll2()------ 
------getAll3()------ 
------getAll4()------ 
------getByDynamic(Foo foo)------ 
getByDynamic结果集>>>Foo{id=1, name='变态', type='ttt', remark='已更新-1425040370'} 
getByDynamic结果集>>>Foo{id=4, name='变态', type='ttt', remark='插入数据测试!'} 
getByDynamic结果集>>>Foo{id=5, name='变态', type='ttt', remark='插入数据测试!'} 
getByDynamic结果集>>>Foo{id=6, name='变态', type='ttt', remark='插入数据测试!'} 
getByDynamic结果集>>>Foo{id=7, name='变态', type='ttt', remark='插入数据测试!'} 
getByDynamic结果集>>>Foo{id=8, name='变态', type='ttt', remark='插入数据测试!'} 
getByDynamic结果集>>>Foo{id=9, name='变态', type='ttt', remark='插入数据测试!'} 
getByDynamic结果集>>>Foo{id=10, name='变态', type='ttt', remark='插入数据测试!'} 
getByDynamic结果集>>>Foo{id=11, name='变态', type='ttt', remark='插入数据测试!'} 
getByDynamic结果集>>>Foo{id=12, name='变态', type='ttt', remark='插入数据测试!'} 
getByDynamic结果集>>>Foo{id=13, name='变态', type='ttt', remark='插入数据测试!'} 
getByDynamic结果集>>>Foo{id=14, name='变态', type='ttt', remark='插入数据测试!'} 
getByDynamic结果集>>>Foo{id=15, name='变态', type='ttt', remark='插入数据测试!'} 

Process finished with exit code 0
 
 本文转自 leizhimin 51CTO博客,原文链接:http://blog.51cto.com/lavasoft/83901,如需转载请自行联系原作者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值