iBatis2学习笔记:单表映射

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=" name" column=" 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=" name" column="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
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值