posts - 165, comments - 198, trackbacks - 0, articles - 1
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

ibatis 关系数据库设计参考

Posted on 2008-07-15 15:37 G_G 阅读(1996) 评论(0)  编辑  收藏 所属分类: DatabaseJDBC

直接运行demo
http://www.blogjava.net/Files/Good-Game/iba2.rar
数据说明:
/*  ibatis 测试使用
 * 一对多;多对一;多对多 
*/


/*  等级表 
 *  (外键) colum -> fid  
 
持久层类说明
  Level{
    Integer id ;
    String name ;
    Level flevel ; //
维护与表level 多对一 关系属性 (上一级level) ;
    List<Level> clevel; // 维护与表level 一对多 关系属性 (下一级孩子节点) ;
    List<Luser> lusers ; // 维护与表luser 多对多 关系属性
  }
 
*/
create   table   level   (
    id 
int   not   null ,
    name 
varchar ( 80 null ,
    fid 
int  ,
    
constraint  pk_supplier_level  primary   key  (id),
    
constraint  fk_item_1  foreign   key  (fid)
        
references   level  (id)
);

/*  使用者
   持久层类说明
   Luser {
     int id ;
     String name ;
     List<Level> levels ;
//维护与表level 多对多 关系属性
     gget;sset()....
   }
 
*/
create   table  luser  (
    id 
int   not   null ,
    name 
varchar ( 80 null ,
     
constraint  pk_supplier_luser  primary   key  (id)
);

/*  维护 使用者 和 等级 多对多 关系
 *      (外键) colum -> lid ;  uid
 
*/
create   table  level_M2M_user  (
    id 
int   not   null ,
    lid 
int   not   null  ,
    uid 
int   not   null  ,
    
constraint  pk_supplier_level_M2M_user  primary   key  (id),
    
constraint  fk_item_2  foreign   key  (lid)
        
references   level  (id),
    
constraint  fk_item_3  foreign   key  (uid)
        
references  luser (id)
);
create   index  levelName  on   level  (name);

insert   into   level  (id,name,fid)  values ( 1 , ' root ' , null );
insert   into   level  (id,name,fid)  values ( 2 , ' level_1 ' , 1 );
insert   into   level  (id,name,fid)  values ( 3 , ' root_2 ' , 1 );
insert   into   level  (id,name,fid)  values ( 4 , ' root_1_1 ' , 2 );
insert   into   level  (id,name,fid)  values ( 5 , ' root_1_2 ' , 2 );
insert   into   level  (id,name,fid)  values ( 6 , ' root_1_1_1 ' , 4 );

insert   into  luser (id,name)  values  ( 1 , ' liukaiyi '  );
insert   into  luser (id,name)  values  ( 2 , ' good-game '  );

insert   into  level_M2M_user (id,uid,lid)  values ( 1 , 1 , 1 );
insert   into  level_M2M_user (id,uid,lid)  values ( 2 , 1 , 2 );
insert   into  level_M2M_user (id,uid,lid)  values ( 3 , 1 , 3 );
insert   into  level_M2M_user (id,uid,lid)  values ( 4 , 2 , 1 );
insert   into  level_M2M_user (id,uid,lid)  values ( 5 , 2 , 5 );
insert   into  level_M2M_user (id,uid,lid)  values ( 6 , 2 , 6 );

sql map
DaoConfig.getSqlMap() 参考最下面工具类;

1.ddl 简单些这就 使用ddl insert level
<!--  
   测试代码:
1.Level level = new Level();    
    $$ Level 扩展属性  
    public int getIdentity() {
        synchronized (Level.class) {
            try {
                return Integer.parseInt( DaoConfig.getSqlMap().queryForObject("level.maxInsertId").toString() );
            } catch (NumberFormatException e) {
                e.printStackTrace();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return 0;
    }

2.level.setName("liukaiyi");
3.DaoConfig.getSqlMap().insert("level.addLevel",level);
4.DaoConfig.getSqlMap().insert("level.addLevel",level);

3;4行 利用 扩展属性 id 自动增长!
-->

     
<select id="maxInsertId" resultClass="int"  >
         select max(id)+1  from level 
     
</select>

     
<insert id="addLevel" parameterClass="level"  >
         insert into level (id,name,fid) values(#identity#,#name#,#flevel.id#)
     
</insert>
  


2.动态组合查询
<!--
   运行测试代码:
   Level level = new Level(); \\ map 也可以 !
            level.setName("%_1%");
            level.setFlevel(new Level(2));

            for(Level ltmp : (List<Level>)DaoConfig.getSqlMap().queryForList("level.dynamicLevel",level)){

                if( ltmp.getFlevel()!=null )
                    System.out.println("f_level:"+ltmp.getFlevel().getId()+"="+ltmp.getFlevel().getName());
                
                System.out.println("->level:"+ltmp.getId()+"="+ltmp.getName());
                
                for(Level lctmp : ltmp.getClevel()){
                    System.out.println("    c_level:"+lctmp.getId()+"="+lctmp.getName());
                }
                System.out.println();
            }
            
-->
    
<select id="dynamicLevel" parameterClass="level" resultMap="getLevelByFid">  
       Select id,name,fid from level  
      
<dynamic prepend="WHERE">  
          
<isNotEmpty prepend="AND" property="name">  
               (name like #name#)  
          
</isNotEmpty>  
          
<isNotEmpty prepend="AND" property="flevel">  
               (fid=#flevel.id#)  
          
</isNotEmpty>  
           order by id desc 
      
</dynamic>  
 
    </select>  


运行结果:
f_level:2=level_1
->level:5=root_1_2

f_level:2=level_1
->level:4=root_1_1
    c_level:6=root_1_1_1


3.查询结果xml
<!--
  测试运行结果:
     String xmlData = DaoConfig.getSqlMap().
                     queryForObject("level.getLevelXmlById",new Integer(3)).toString();
      System.out.println(xmlData);
-->    

<select id="getLevelXmlById" resultClass="xml" xmlResultName="level"  >  
         select 
         id ,
         name ,
         fid 
         from level  
         where id=#id# 
     
</select>

结果:
<?xml version="1.0" encoding="UTF-8"?>
<level>
  <
ID>3</ID>
  <
NAME>root_2</NAME>
  <
FID>1</FID>
</
level>


4.多对一
(此方法可以 大概看成 hbm 中的 lazy='true' )
<!--
    运行测试代码:
    Level level = (Level)DaoConfig.getSqlMap().queryForObject("level.getLevelId",new Integer(2));
            Level fLevel = level.getFlevel();
            System.out.println(fLevel.getName());
结果:
root
-->

    
<typeAlias alias="level" type="test.domain.Level" />

    
<resultMap class="level" id="getLevelByFid">
        
<result property="id" column="id" />  
        
<result property="name" column="name" />
        
        
<result property="flevel" column="fid" select="level.getLevelId"/>
        
<result property="clevel" column="id" select="level.getLevelByfId"/>
        
        
<result property="lusers" column="id" select="m2m.getLuserByLevelId"/>
    
</resultMap>
    
    
<select id="getLevelId" resultClass="level" parameterClass="int" resultMap="getLevelByFid"  >  
         select 
         id ,
         name ,
         fid 
         from level   
         WHERE id =#id#  
     
</select>
    

4.2一对多 第2种方法(此方法可以 大概看成 hbm 中的 lazy='false' )
<!--
    运行测试结果:
                Level level = (Level)DaoConfig.getSqlMap().queryForObject("level.getLevelId",new Integer(2));
            Level fLevel = level.getFlevel();
            System.out.println(fLevel.getName());

结果:
root
-->
    
<select id="getLevelIdAddFid" resultClass="level" parameterClass="int"  >  
         select 
         tl.id as id,
         tl.name as name ,
         tlf.id as "flevel.id",
         tlf.name as "flevel.name" 
         from level tl inner join level tlf on tl.fid=tlf.id
         WHERE tl.id =#id#  
     
</select>




5.多对一
<!--
    测试运行代码:
    Level level = (Level)DaoConfig.getSqlMap().queryForObject("level.getLevelId",new Integer(2));
      for( Level ltmp : level.getClevel() ){
         System.out.println(ltmp.getName());
       }

结果:
root_1_1
root_1_2
-->

    
<typeAlias alias="level" type="test.domain.Level" />

    
<resultMap class="level" id="getLevelByFid">
        
<result property="id" column="id" />  
        
<result property="name" column="name" />
        
        
<result property="flevel" column="fid" select="level.getLevelId"/>
        
<result property="clevel" column="id" select="level.getLevelByfId"/>
        
        
<result property="lusers" column="id" select="m2m.getLuserByLevelId"/>
    
</resultMap>
    
    
<select id="getLevelByfId" resultClass="level" parameterClass="int" resultMap="getLevelByFid"  >  
         select 
         id ,
         name ,
         fid 
         from level   
         WHERE fid =#id#  
     
</select>

6.多对多

关系维护 m2m.xml
<?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="m2m">


    
<select id="getLuserByLevelId" resultMap="luser.getLuserByFid" resultClass="luser" parameterClass="int" >  
         select 
         tlu.id as id,
         tlu.name as name
         from 
             luser tlu inner join level_M2M_user t2 on tlu.id=t2.uid
              inner join level tl on tl.id=t2.lid
         where tl.id=#id#
     
</select> 
     
    
<select id="getLevelsByLuserId" resultMap="level.getLevelByFid" resultClass="level"  parameterClass="int" >  
         select 
         tl.id as id,
         tl.name as name,
         tl.fid as fid
         from 
             luser tlu inner join level_M2M_user t2 on tlu.id=t2.uid
              inner join level tl on tl.id=t2.lid
         where tlu.id=#id#
     
</select> 
     
     
</sqlMap>



luser.xml

<?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="luser">
    
<typeAlias alias="luser" type="test.domain.Luser" />

    
    
<resultMap class="luser" id="getLuserByFid">
        
<result property="id" column="id" />  
        
<result property="name" column="name" />
        
<result property="levels" column="id" select="m2m.getLevelsByLuserId"/>
    
</resultMap>
    
    
<select id="getluserById" resultClass="luser" resultMap="getLuserByFid" parameterClass="int" >
        select id , name from luser where id=#id#
    
</select>
</sqlMap>


level.xml
<!--
    测试运行代码:
                Luser luser = (Luser)DaoConfig.getSqlMap().queryForObject("luser.getluserById",new Integer(1));
            System.out.println("luser="+luser.getName());
            if( luser!=null )
                for(Level ltmp : luser.getLevels() ){
                    System.out.println(ltmp.getName());
                    for(Luser lutmp : ltmp.getLusers() ){
                        System.out.println(" ->"+lutmp.getName());
                    }
                }

结果:
luser=liukaiyi
root
 ->liukaiyi
 ->good-game
level_1
 ->liukaiyi
root_2
 ->liukaiyi

-->
    
<typeAlias alias="level" type="test.domain.Level" />

    
<resultMap class="level" id="getLevelByFid">
        
<result property="id" column="id" />  
        
<result property="name" column="name" />
        
        
<result property="flevel" column="fid" select="level.getLevelId"/>
        
<result property="clevel" column="id" select="level.getLevelByfId"/>
        
        
<result property="lusers" column="id" select="m2m.getLuserByLevelId"/>
    
</resultMap>












只有注册用户登录后才能发表评论。


网站导航: