IBaitsNet的对象关系一对多实现

    看了园子里很多IBatisNet的文章,感觉对实体一对多关系的配置都没有详细的解释,
这段时间空闲时间比较多一点,对使用IBatisNet的一些体会进行整理,在这里感觉善友大哥,
我IBatis的入门就是看的他的文章,这个demo也是改的他的代码。
    hibernate 的强大在于完全的对象化,对于对象之间的关系解决的比较好,
如1对1,1对多,多对1,以及多对多。当然也包括继承关系。而ibatis这方面就比较逊色了,
不过对于也支持简单的关连查询,如1对1,和1对多。对于一般的情况来说,这两种已经足够了。
    下面进入正文讲一下IBatisNet的一对多配置。
     开发环境:VS2005 SqlServer2000 IBatisNet框架(IBatisNet.DataMapper1.6.1)
     主要内容:1.准备数据表结构  2.编写实体类  3.构建配置信息

    1.准备数据表结构
在这个例子中,我们引入了两个对象User、Post,它们之间的关系是一对多,即一个User有多篇Post。需要用到的数据表结构如下
CREATE   TABLE  Users (
UserID 
int   identity   NOT   NULL ,
UserName 
nvarchar ( 40 NOT   NULL ,
Password 
nvarchar ( 20 NOT   NULL ,
EmailAddress 
nvarchar ( 40 NOT   NULL ,
LastLogon 
datetime ,
PRIMARY   KEY  (UserID)
)
CREATE   TABLE  Posts (
PostID 
int   identity   NOT   NULL ,
Title 
nvarchar ( 100 NOT   NULL ,
Message 
ntext ,
CreatedDate 
datetime ,
ModifiedDate 
datetime ,
UserID 
int   NOT   NULL ,
PRIMARY   KEY  (PostID),
FOREIGN   KEY  (UserID)  References  Users(UserID)
)
     2.编写实体类
     public   class  User
    {

        
#region  UserID

        
private  Int32 m_userID;

        
///   <summary> Gets or sets UserID </summary>
         public  Int32 UserID
        {
            
get  {  return  m_userID; }
            
set  { m_userID  =  value; }
        }

        
#endregion

        
#region  UserName

        
private  String m_userName;

        
///   <summary> Gets or sets UserName </summary>
         public  String UserName
        {
            
get  {  return  m_userName; }
            
set  { m_userName  =  value; }
        }

        
#endregion

        
#region  Password

        
private  String m_password;

        
///   <summary> Gets or sets Password </summary>
         public  String Password
        {
            
get  {  return  m_password; }
            
set  { m_password  =  value; }
        }

        
#endregion

        
#region  EmailAddress

        
private  String m_emailAddress;

        
///   <summary> Gets or sets EmailAddress </summary>
         public  String EmailAddress
        {
            
get  {  return  m_emailAddress; }
            
set  { m_emailAddress  =  value; }
        }

        
#endregion

        
#region  LastLogon

        
private  DateTime ?  m_lastLogon;

        
///   <summary> Gets or sets LastLogon </summary>
         public  DateTime ?  LastLogon
        {
            
get  {  return  m_lastLogon; }
            
set  { m_lastLogon  =  value; }
        }

        
#endregion

        
private  IList < Post >  m_postList;

        
public  IList < Post >  Posts
        {
            
get  {  return  m_postList; }
            
set  { m_postList  =  value; }
        }


    }

public   class  Post
    {

        
#region  PostID

        
private  Int32 m_postID;

        
///   <summary> Gets or sets PostID </summary>
         public  Int32 PostID
        {
            
get  {  return  m_postID; }
            
set  { m_postID  =  value; }
        }

        
#endregion

        
#region  Title

        
private  String m_title;

        
///   <summary> Gets or sets Title </summary>
         public  String Title
        {
            
get  {  return  m_title; }
            
set  { m_title  =  value; }
        }

        
#endregion

        
#region  Message

        
private  String m_message;

        
///   <summary> Gets or sets Message </summary>
         public  String Message
        {
            
get  {  return  m_message; }
            
set  { m_message  =  value; }
        }

        
#endregion

        
#region  CreatedDate

        
private  DateTime ?  m_createdDate;

        
///   <summary> Gets or sets CreatedDate </summary>
         public  DateTime ?  CreatedDate
        {
            
get  {  return  m_createdDate; }
            
set  { m_createdDate  =  value; }
        }

        
#endregion

        
#region  ModifiedDate

        
private  DateTime ?  m_modifiedDate;

        
///   <summary> Gets or sets ModifiedDate </summary>
         public  DateTime ?  ModifiedDate
        {
            
get  {  return  m_modifiedDate; }
            
set  { m_modifiedDate  =  value; }
        }

        
#endregion

        
#region  UserID

        
private  User m_user;

        
///   <summary> Gets or sets UserID </summary>
         public  User User
        {
            
get  {  return  m_user; }
            
set  { m_user  =  value; }
        }

        
#endregion


    }
     3.编写配置文件
User类的配置文件
<? xml version="1.0" encoding="utf-8"  ?>
< sqlMap  namespace ="User"
    xmlns
="http://ibatis.apache.org/mapping"
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance" >

  
< alias >
    
< typeAlias  alias ="User"  type ="IBatisNetDemo.Domain.User,IBatisNetDemo"   />
  
</ alias >

  
< resultMaps >
    
< resultMap  id ="UserResult"  class ="User" >
      
< result  property ="UserID"  column ="UserID"  dbType ="Int" />
      
< result  property ="UserName"  column ="UserName"  dbType ="NVarChar" />
      
< result  property ="Password"  column ="Password"  dbType ="NVarChar" />
      
< result  property ="EmailAddress"  column ="EmailAddress"  dbType ="NVarChar" />
      
< result  property ="LastLogon"  column ="LastLogon"  dbType ="DateTime" />
    
</ resultMap >
    
< resultMap  id ="User-Result"  class ="User"  extends ="UserResult" >
      
< result  property ="Posts"  resultMapping ="Post.PostResult"   />
    
</ resultMap >

    
< resultMap  id ="User_Result"  class ="User"  extends ="UserResult" >
      
< result  property ="Posts"  column ="UserID"  lazyLoad ="true"  select ="GetPostsForUser"   />
    
</ resultMap >
  
</ resultMaps >

  
< statements >

    
< select  id ="FindAllUser"  resultMap ="User_Result" >
      SELECT *
      FROM [dbo].[Users]
    
</ select >

    
< select  id ="GetAllUser"  resultMap ="User-Result" >
      select u.UserID,u.UserName,u.Password,u.EmailAddress,u.LastLogon
      ,p.PostID,p.Title,p.Message,p.CreatedDate,p.ModifiedDate
      from Users u 
      left outer join Posts p
      on u.UserID=p.UserID
    
</ select >

    
< select  id ="FindByUserId"  parameterClass ="int"  resultMap ="User_Result" >
      SELECT *
      FROM [dbo].[Users]
      WHERE
      ([Users].[UserID] = #UserID,dbType=Int#)
    
</ select >

    
< insert  id ="InsertUser"  parameterClass ="User" >
      
< selectKey  property ="UserID"  type ="post"  resultClass ="int" >
        ${selectKey}
      
</ selectKey >
      INSERT INTO [dbo].[Users] (
        [UserName]
      , [Password]
      , [EmailAddress]
      , [LastLogon]
      ) VALUES (
        #UserName,dbType=NVarChar#
      , #Password,dbType=NVarChar#
      , #EmailAddress,dbType=NVarChar#
      , #LastLogon,dbType=DateTime#
      )
    
</ insert >

    
< update  id ="UpdateUser"  parameterClass ="User" >
      UPDATE [dbo].[Users] SET
      [UserName] = #UserName,dbType=NVarChar#
      , [Password] = #Password,dbType=NVarChar#
      , [EmailAddress] = #EmailAddress,dbType=NVarChar#
      , [LastLogon] = #LastLogon,dbType=DateTime#
      WHERE
      ([UserID] = #UserID,dbType=Int#)
    
</ update >

    
< delete  id ="DeleteUser"  parameterClass ="int" >
      DELETE FROM [dbo].[Users]
      WHERE
      ([UserID] = #UserID,dbType=Int#)
    
</ delete >

  
</ statements >
</ sqlMap >

这里用两种方法实现了一对多关系,使用内在的resultMap解决问题完成一对多的映射
     < resultMap  id ="User-Result"  class ="User"  extends ="UserResult" >
      
< result  property ="Posts"  resultMapping ="Post.PostResult"   />
    
</ resultMap >
    
< select  id ="GetAllUser"  resultMap ="User-Result" >
      select u.UserID,u.UserName,u.Password,u.EmailAddress,u.LastLogon
      ,p.PostID,p.Title,p.Message,p.CreatedDate,p.ModifiedDate
      from Users u 
      left outer join Posts p
      on u.UserID=p.UserID
    
</ select >
还有就是在resultMap 中定义嵌套查询GetPostsForUser,实现了关联数据的读取。
需要注意的是,这里有一个潜在的性能问题,也就是所谓“n+1”Select问题,但IBatisNet支持懒加载lazyLoad="true",来解决这个性能问题。
     < resultMap  id ="User_Result"  class ="User"  extends ="UserResult" >
      
< result  property ="Posts"  column ="UserID"  lazyLoad ="true"  select ="GetPostsForUser"   />
    
</ resultMap >
Post类的配置文件
<? xml version="1.0" encoding="utf-8"  ?>
< sqlMap  namespace ="Post"
    xmlns
="http://ibatis.apache.org/mapping"
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance" >

  
< alias >
    
< typeAlias  alias ="Post"  type ="IBatisNetDemo.Domain.Post,IBatisNetDemo"   />
  
</ alias >

  
< resultMaps >
    
< resultMap  id ="PostResult"  class ="Post" >
      
< result  property ="PostID"  column ="PostID"  dbType ="Int" />
      
< result  property ="Title"  column ="Title"  dbType ="NVarChar" />
      
< result  property ="Message"  column ="Message"  dbType ="NText" />
      
< result  property ="CreatedDate"  column ="CreatedDate"  dbType ="DateTime" />
      
< result  property ="ModifiedDate"  column ="ModifiedDate"  dbType ="DateTime" />
    
</ resultMap >
    
< resultMap  id ="Post-Result"  class ="Post"  extends ="PostResult" >
      
< result  property ="User"  resultMapping ="User.UserResult" />
    
</ resultMap >
  
</ resultMaps >

  
< statements >

    
< select  id ="FindAllPost"  resultMap ="Post-Result" >
      select p.PostID,p.Title,p.Message,p.CreatedDate,p.ModifiedDate,
      u.UserID,u.UserName,u.Password,u.EmailAddress,u.LastLogon
      from Posts p,Users u
      where p.UserID=u.UserID
    
</ select >

    
< select  id ="GetAllPost"  resultMap ="PostResult" >
      select p.PostID,p.Title,p.Message,p.CreatedDate,p.ModifiedDate
      from Posts p
    
</ select >

    
< select  id ="FindByPostId"  parameterClass ="Post"  resultMap ="PostResult"  extends ="FindAllPost" >
      WHERE
      ([Posts].[PostID] = #PostID,dbType=Int#)
    
</ select >

    
< select  id ="GetPostsForUser"  parameterClass ="int"  resultMap ="PostResult"  extends ="FindAllPost" >
      WHERE
      ([Posts].[UserID] = #User.UserID,dbType=Int#)
    
</ select >
    
    
< insert  id ="InsertPost"  parameterClass ="Post" >
      
< selectKey  property ="PostID"  type ="post"  resultClass ="int" >
        ${selectKey}
      
</ selectKey >
      INSERT INTO [dbo].[Posts] (
        [Title]
      , [Message]
      , [CreatedDate]
      , [ModifiedDate]
      , [UserID]
      ) VALUES (
        #Title,dbType=NVarChar#
      , #Message,dbType=NText#
      , #CreatedDate,dbType=DateTime#
      , #ModifiedDate,dbType=DateTime#
      , #User.UserID,dbType=Int#
      )
    
</ insert >

    
< update  id ="UpdatePost"  parameterClass ="Post" >
      UPDATE [dbo].[Posts] SET
      [Title] = #Title,dbType=NVarChar#
      , [Message] = #Message,dbType=NText#
      , [CreatedDate] = #CreatedDate,dbType=DateTime#
      , [ModifiedDate] = #ModifiedDate,dbType=DateTime#
      , [UserID] = #User.UserID,dbType=Int#
      WHERE
      ([PostID] = #PostID,dbType=Int#)
    
</ update >

    
< delete  id ="DeletePost"  parameterClass ="Post" >
      DELETE FROM [dbo].[Posts]
      WHERE
      ([PostID] = #PostID,dbType=Int#)
    
</ delete >

  
</ statements >
</ sqlMap >

   小弟第一次把文章发在首页,诚惶诚恐,欢迎大家拍砖

转载于:https://www.cnblogs.com/zhchch518/archive/2007/08/01/838326.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值