iBatis2学习笔记:多对多映射(双向)

环境:
MySQL5.51b
iBatis 2.3
Spring 2.5.4
 
这个多对多不容易,费了好大劲才实现。
 
一、模型
 
用户(User)和角色(Role)之间是多对多的关系。
 
二、SQL
/*==============================================================*/ 
/* Table: role                                                  */ 
/*==============================================================*/ 
create  table role 

   id                    bigint  not  null auto_increment, 
   rolename              varchar(24), 
   descp                 varchar(240), 
    primary  key (id) 
); 

alter  table role comment '角色 
'; 

/*==============================================================*/ 
/* Table: tlink                                                 */ 
/*==============================================================*/ 
create  table tlink 

   userId                bigint  not  null
   roleId                bigint  not  null 
); 

alter  table tlink comment  '连接表'

/*==============================================================*/ 
/* Table: user                                                  */ 
/*==============================================================*/ 
create  table  user 

   id                    bigint  not  null auto_increment, 
   username              varchar(24), 
   remark                varchar(240), 
    primary  key (id) 
); 

alter  table  user comment  '用户'

alter  table tlink  add  constraint FK_r  foreign  key (roleId) 
       references role (id)  on  delete  restrict  on  update  restrict

alter  table tlink  add  constraint FK_u  foreign  key (userId) 
       references  user (id)  on  delete  restrict  on  update  restrict
 
三、POJO
/** 
* Created by IntelliJ IDEA.<br> 
* <b>User</b>: leizhimin<br> 
* <b>Date</b>: 2008-6-16 0:12:13<br> 
* <b>Note</b>: 用户角色多对多模型:角色 
*/
 
public  class User { 
     private Long id; 
     private String username; 
     private String remark; 
     private List<Role> roleList =  new ArrayList<Role>(); 


     public String toString() { 
         return  "User{" + 
                 "id=" + id + 
                 ", username='" + username + '\'' + 
                 ", remark='" + remark + '\'' + 
                 ", roleList='" + roleList.size() + '\'' + 
                '}'; 
    } 

     public String out() { 
        StringBuffer sb =  new StringBuffer(); 
        sb.append( "User{" + 
                 "id=" + id + 
                 ", username='" + username + '\'' + 
                 ", remark='" + remark + '\'' + 
                 ", roleList='" + roleList.size() + '\''); 
         for (Role role : roleList) { 
            sb.append( "\n\t").append(role.toString()); 
        } 
         return sb.toString(); 
    }
 
public  class Role { 
     private Long id; 
     private String rolename; 
     private String descp; 
     private List<User> userList=  new ArrayList<User>(); 

     public String toString() { 
         return  "Role{" + 
                 "id=" + id + 
                 ", rolename='" + rolename + '\'' + 
                 ", descp='" + descp + '\'' + 
                 ", userList=" + userList.size() + 
                '}'; 
    } 

     public String out(){ 
        StringBuffer sb=  new StringBuffer(); 
         if(userList.size()>0){ 
            sb.append( "Role{" + 
                 "id=" + id + 
                 ", rolename='" + rolename + '\'' + 
                 ", descp='" + descp + '\'' + 
                 ", userList=" + userList.size()); 
             for(User u: userList){ 
                sb.append( "\n\t").append(u.toString()); 
            } 
            sb.append( "\n}"); 
        } 
         return sb.toString(); 
    } 
 
/** 
* Created by IntelliJ IDEA.<br> 
* <b>User</b>: leizhimin<br> 
* <b>Date</b>: 2008-6-16 0:17:15<br> 
* <b>Note</b>: 用户角色多对多模型:连接表 
*/
 
public  class Tlink { 
     private Long id; 
     private Long userId; 
     private Long roleId;
 
四、SqlMap
User.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 ="user" > 
     < typeAlias  alias ="user"  type ="com.lavasoft.ssi.domain.User" /> 
     < resultMap  id ="result_basc"  class ="user" > 
         < result  property ="id"  column ="id" /> 
         < result  property ="username"  column ="username" /> 
         < result  property ="remark"  column ="remark" /> 
     </ resultMap > 

     < resultMap  id ="result"  class ="user"  extends ="result_basc" > 
         < result  property ="roleList"  column ="id"  select ="role.getByUserId" /> 
     </ resultMap > 


     < insert  id ="insert"  parameterClass ="user" > 
        insert into user(username,remark) values(#username#,#remark#) 
         < selectKey  keyProperty ="id"  resultClass ="long" > 
            select LAST_INSERT_ID() 
         </ selectKey > 
     </ insert > 
     < select  id ="getById"  parameterClass ="long"  resultMap ="result_basc" > 
        select * from user where id = #value# 
     </ select > 

     < select  id ="getWithCashWithRoleList"  parameterClass ="long"  resultMap ="result" > 
        select * from user where id = #value# 
     </ select > 

     < select  id ="getByRoleId"  parameterClass ="long"  resultMap ="result_basc" > 
        select u.* from user u where u.id in 
        (select userId from tlink where roleId=#value#) 
     </ select > 


</ sqlMap >
 
Role.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 ="role" > 
     < typeAlias  alias ="role"  type ="com.lavasoft.ssi.domain.Role" /> 
     < resultMap  id ="result_basc"  class ="role" > 
         < result  property ="id"  column ="id" /> 
         < result  property ="rolename"  column ="rolename" /> 
         < result  property ="descp"  column ="descp" /> 
     </ resultMap > 
     < resultMap  id ="result"  class ="role"  extends ="result_basc" > 
         < result  property ="userList"  column ="id"  select ="user.getByRoleId" /> 
     </ resultMap > 
     < insert  id ="insert"  parameterClass ="role" > 
        insert into role(rolename,descp) values(#rolename#,#descp#) 
         < selectKey  keyProperty ="id"  resultClass ="long" > 
            select LAST_INSERT_ID() 
         </ selectKey > 
     </ insert > 
     < select  id ="getById"  parameterClass ="long"  resultMap ="result_basc" > 
        select * from role where id = #value# 
     </ select > 

     < select  id ="getRoleByIdWithCashUser"  parameterClass ="long"  resultMap ="result" > 
        select * from role where id = #value# 
     </ select > 

    <!-- 为多对多配置--> 
     < select  id ="getByUserId"  parameterClass ="long"  resultClass ="role"  resultMap ="result_basc" > 
        select r.* from role r where r.id in 
        (select roleId from tlink where userId=#value#) 
     </ select > 
</ sqlMap >
 
Tlink.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 ="tlink" > 
     < typeAlias  alias ="tlink"  type ="com.lavasoft.ssi.domain.Tlink" /> 
     < resultMap  id ="result"  class ="tlink" > 
         < result  property ="id"  column ="id" /> 
         < result  property ="userId"  column ="userId" /> 
         < result  property ="roleId"  column ="roleId" /> 
     </ resultMap > 
     < insert  id ="insert"  parameterClass ="tlink" > 
        insert into tlink(userId,roleId) values(#userId#,#roleId#) 
         < selectKey  keyProperty ="id"  resultClass ="long" > 
            select LAST_INSERT_ID() 
         </ selectKey > 
     </ insert > 
     < select  id ="getByUserId"  parameterClass ="long"  resultMap ="result" > 
        select * from tlink where userId = #value# 
     </ select > 
     < select  id ="getByRoleId"  parameterClass ="long"  resultMap ="result" > 
        select * from tlink where roleId = #value# 
     </ select > 
     < delete  id ="delete"  parameterClass ="tlink" > 
        delete from tlink where userId = #userId# and roleId = #roleId# 
     </ delete > 

</ sqlMap >
 
五、DAO
public  interface UserDAO { 
     public Long insert(User user); 
     public Object getById(Long id); 
     public Object getWithCashById(Long id); 
     public User getWithCashWithRoleList(Long id); 

 
public  interface RoleDAO { 
     public Long insert(Role role); 
     public Role getById(Long id); 
     public Role getRoleByIdWithCashUser(Long id); 
     public List<Role> getByUserId(Long userId); 
}
 
public  interface TlinkDAO { 
     public  void insert(Long userId,Long roleId); 
     public  int delete(Long userId,Long roleId); 
     public  int update(Long userId,Long roleId); 
}
 
public  class UserDAOImpl  extends SqlMapClientDaoSupport  implements UserDAO { 
     public Long insert(User user) { 
         return (Long) getSqlMapClientTemplate().insert( "user.insert",user); 
    } 

     public Object getById(Long id) { 
         return getSqlMapClientTemplate().queryForList( "user.getById",id); 
    } 

     public Object getWithCashById(Long id) { 
         return getSqlMapClientTemplate().queryForList( "user.getWithCashById",id); 
    } 

     public User getWithCashWithRoleList(Long userId) { 
         return (User) getSqlMapClientTemplate().queryForObject( "user.getWithCashWithRoleList",userId); 
    } 
}
 
public  class RoleDAOImpl  extends SqlMapClientDaoSupport  implements RoleDAO { 
     public Long insert(Role role) { 
         return (Long) getSqlMapClientTemplate().insert( "role.insert",role); 
    } 

     public Role getById(Long id) { 
         return (Role) getSqlMapClientTemplate().queryForObject( "role.getById",id); 
    } 

     public Role getRoleByIdWithCashUser(Long id) { 
         return (Role) getSqlMapClientTemplate().queryForObject( "role.getRoleByIdWithCashUser",id); 
    } 

     public List<Role> getByUserId(Long userId) { 
         return getSqlMapClientTemplate().queryForList( "role.getByUserId",userId); 
    } 
}
 
public  class TlinkDAOImpl  extends SqlMapClientDaoSupport  implements TlinkDAO { 
     public  void insert(Long userId, Long roleId) { 
        Tlink tlink =  new Tlink(userId, roleId); 
        getSqlMapClientTemplate().insert( "tlink.insert",tlink); 
    } 

     public  int delete(Long userId, Long roleId) { 
        Tlink tlink =  new Tlink(userId, roleId); 
         return getSqlMapClientTemplate().delete( "tlink.delete",tlink); 
    } 

     public  int update(Long userId, Long roleId) { 
         return 0; 
    } 
}
 
 
六、测试类
public  class UserDAOTest{ 
     private UserDAO userDAO = (UserDAO) ApplicationContextUtils.getApplicationContext().getBean( "userDAO"); 

     public  void testInsert() { 
        System.out.println( "-------insert(User user)--------"); 
        User user =  new User(); 
        user.setUsername( "熔岩"); 
        user.setRemark( "系统用户"); 
        Long pk = userDAO.insert(user); 
        System.out.println( "所插入数据ID=" + pk); 
    } 

     public  void testGetById() { 
        System.out.println( "-------getById(Long id)-------"); 
        Object object = userDAO.getById(3L); 
        System.out.println(object); 
    } 

     public  void testGetWithCashById() { 
        System.out.println( "-------getWithCashById(Long id)-------"); 
        Object object = userDAO.getWithCashById(1L); 
        System.out.println(object); 
    } 

     public  void getWithCashWithRoleList(){ 
        System.out.println( "-------getWithCashWithRoleList()-------"); 
        User user = userDAO.getWithCashWithRoleList(1L); 
        System.out.println(user.out()); 
    } 

     public  static  void main(String args[]){ 
        System.out.println( "正在测试UserDAO"); 
        UserDAOTest userDAOTest  =  new UserDAOTest(); 
        userDAOTest.testInsert(); 
        userDAOTest.testGetById(); 
        userDAOTest.getWithCashWithRoleList(); 
    } 
}
 
/** 
* Created by IntelliJ IDEA.<br> 
* <b>User</b>: leizhimin<br> 
* <b>Date</b>: 2008-6-16 1:05:57<br> 
* <b>Note</b>: 用户角色多对多模型:角色 
*/
 
public  class RoleDAOTest{ 
    RoleDAO roleDAO = (RoleDAO) ApplicationContextUtils.getApplicationContext().getBean( "roleDAO"); 
     public  void testInsert() { 
        System.out.println( "------insert(Role role)-----"); 
        Role role =  new Role(); 
        role.setRolename( "admin"); 
        role.setDescp( "管理员"); 
        Long pk = roleDAO.insert(role); 
        System.out.println( "所插入数据ID="+pk); 
    } 

     public  void testGetById() { 
        System.out.println( "------getById(Long id)-----"); 
        Object obj = roleDAO.getById(1L); 
        System.out.println( "查询结果"+obj); 
    } 

     public  void testGetRoleByIdWithCashUser() { 
        System.out.println( "------getRoleByIdWithCashUser(Long id)-----"); 
        Role obj = roleDAO.getRoleByIdWithCashUser(1L); 
        System.out.println( "查询结果"+obj.out()); 
    } 

     public  void testGetByUserId(){ 
        System.out.println( "------getByUserId(Long userId)-----"); 
        List<Role> roleList= roleDAO.getByUserId(1L); 
         for(Role r: roleList){ 
            System.out.println(r); 
        }         
    } 

     public  static  void main(String args[]){ 
        System.out.println( "正在测试RoleDAO"); 
        RoleDAOTest roleDAOTest =  new RoleDAOTest(); 
        roleDAOTest.testInsert(); 
        roleDAOTest.testGetById(); 
        roleDAOTest.testGetRoleByIdWithCashUser(); 
        roleDAOTest.testGetByUserId(); 
    } 
}
 
public  class TlinkDAOTest { 
    TlinkDAO tlinkDAO = (TlinkDAO) ApplicationContextUtils.getApplicationContext().getBean( "tlinkDAO"); 

     public  void testInsert(){ 
        tlinkDAO.insert(1L,1L); 
        tlinkDAO.insert(1L,2L); 
        tlinkDAO.insert(1L,3L); 
    } 

     public  static  void main(String args[]){ 
        TlinkDAOTest tlinkDAOTest =  new TlinkDAOTest(); 
        tlinkDAOTest.testInsert(); 
    } 
}
 
七、测试结果
正在测试UserDAO 
log4j:WARN No appenders could be found for logger (org.springframework.context.support.ClassPathXmlApplicationContext). 
log4j:WARN Please initialize the log4j system properly. 
-------insert(User user)-------- 
所插入数据ID=10 
-------getById(Long id)------- 
[User{id=3, username='熔岩', remark='系统用户', roleList='0'}] 
-------getWithCashWithRoleList()------- 
User{id=1, username='熔岩', remark='系统用户', roleList='3' 
    Role{id=1, rolename='r1', descp='aaa', userList=0} 
    Role{id=2, rolename='r2', descp='bbb', userList=0} 
    Role{id=3, rolename='r3', descp='ccc', userList=0} 

Process finished with exit code 0
 
 
正在测试RoleDAO 
log4j:WARN No appenders could be found for logger (org.springframework.context.support.ClassPathXmlApplicationContext). 
log4j:WARN Please initialize the log4j system properly. 
------insert(Role role)----- 
所插入数据ID=10 
------getById(Long id)----- 
查询结果Role{id=1, rolename='r1', descp='aaa', userList=0} 
------getRoleByIdWithCashUser(Long id)----- 
查询结果Role{id=1, rolename='r1', descp='aaa', userList=3 
    User{id=1, username='熔岩', remark='系统用户', roleList='0'} 
    User{id=2, username='熔岩', remark='系统用户', roleList='0'} 
    User{id=3, username='熔岩', remark='系统用户', roleList='0'} 

------getByUserId(Long userId)----- 
Role{id=1, rolename='r1', descp='aaa', userList=0} 
Role{id=2, rolename='r2', descp='bbb', userList=0} 
Role{id=3, rolename='r3', descp='ccc', userList=0} 

Process finished with exit code 0
 
测试结果表明:双向多对多彻底搞定!
 

本文转自 leizhimin 51CTO博客,原文链接:http://blog.51cto.com/lavasoft/83905,如需转载请自行联系原作者
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值