zhchch518

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(40NOT NULL,
Password 
nvarchar(20NOT NULL,
EmailAddress 
nvarchar(40NOT NULL,
LastLogon 
datetime,
PRIMARY KEY (UserID)
)
CREATE TABLE Posts (
PostID 
int identity NOT NULL,
Title 
nvarchar(100NOT 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>

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

posted on 2007-08-01 02:48  Csharp民工  阅读(1490)  评论(6编辑  收藏  举报

导航