当前位置:编程学习 > JAVA >>

自己动手写ORM框架(六):实现查询功能FindById方法

通过配置实体与表的关系映射后,就可以实现对表的操作了,接下来实现简单对象的新增功能。下面代码1-1是定义的操作数据对象方法的接口:
 
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
 
namespace System.Orm.EntityManager
{
    public interface EntityManager
    {
       //事物
        IDbTransaction Transaction { get; set; }
       
       //查询表所有数据 
        List<T> FindAll<T>() where T : new(); 
 
       //自定义SQL查询 
        List<T> FindBySql<T>(string strSql) where T : new(); 
 
       //通过主键ID查询 
        List<T> FindById<T>(object id) where T : new(); 
       
       //新增
        int Save<T>(T entity);
 
       //修改
        int Update<T>(T entity);
 
       //删除
        int Remove<T>(T entity);
 
       //根据ID删除数据
        int Remove<T>(object id) where T : new();
    }
}
 
    下面先实现比较简单的查询方法,代码1-2:
 
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.Orm.CustomAttributes;
using System.Data.SqlClient;
using System.Collections;
using System.Data;
using System.Orm.DBUtility;
using System.Orm.Common;
 
namespace System.Orm.EntityManager
{
    public class EntityManagerImpl : EntityManager
    {
        //......实现EntityManager接口...                               
    }
}
    下面是PropertyImpl 类中FindById方法的代码1-3:
 
#region 通过主键ID查询数据
public List<T> FindById<T>(object id) where T : new()
{
    List<T> listArr = new List<T>();
 
    //获取泛型T对象的类型
  Type type = new T().GetType();
 
    //获取属性信息数组
    PropertyInfo[] properties = ReflectionUtils.GetProperties(type);
    
    //获取实体对象中的表名、列名、列值信息并存于TableInfo对象中
    TableInfo tableInfo = DbEntityUtils.GetTableInfo(type, DbOperateType.SELECT);
    
    //生成查询SQL语句
    String strSql = DbEntityUtils.GetFindByIdSql(tableInfo);
 
    //创建参数数组,并将主键ID键值存入参数数组中
    IDbDataParameter[] parms = DbFactory.CreateDbParameters(1);
    parms[0].ParameterName = tableInfo.Id.Key;
    parms[0].Value = id;            
 
    IDataReader sdr = null;
    try
    {
        sdr = AdoHelper.ExecuteReader(AdoHelper.ConnectionString, CommandType.Text, strSql, parms);
        while (sdr.Read())
        {
            //创建实体类对象
              T entity = new T();
            foreach (PropertyInfo property in properties)
            {
              //通过实体类属性名称获取Column自定义属性配置的映射列名
                sttring name = tableInfo.PropToColumn[property.Name].ToString();
              
              //通过获取的列名从dataReader中检索值,并赋给实体对象属性
                ReflectionUtils.SetPropertyValue(entity, property, sdr[name]);
            }
 
            //将实体对象添加到List中
            listArr.Add(entity);
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }
    finally
    {
        if (sdr != null) sdr.Close();
    }
 
    return listArr;
}
#endregion
 
    1-3中第一行代码:TableInfo tableInfo = DbEntityUtils.GetTableInfo(entity,DbOperateType.SELECT);
 
将实体对象和操作类型传入DbEntityUtils.GetTableInfo方法中,下面是GetTableInfo代码1-4:
 
public static TableInfo GetTableInfo(object entity,DbOperateType dbOpType)
{
    
    bool breakForeach = false;//是否跳出forach循环
    
    string strPrimaryKey = string.Empty;//主键变量 
    
    Type type = entity.GetType();//获取实体对象类型             
    
    TableInfo tableInfo = new TableInfo();//存储表信息的对象
           
    tableInfo.TableName = GetTableName(type);//获取表名
    
    //获取属性信息数组
    PropertyInfo[] properties = ReflectionUtils.GetProperties(type);
    foreach (PropertyInfo property in properties)
    {
        object propvalue = null;//属性值
        string columnName = string.Empty;//列名(数据库表结构)
        string propName = columnName = property.Name;//属性名称
        
        //如果不是做查询操作,获取属性值
        if(dbOpType != DbOperateType.SELECT)
            propvalue = ReflectionUtils.GetPropertyValue(entity, property);
        
        //获取实体对象属性自定义属性数组(如Column、Id、Table)                                
        object[] propertyAttrs = property.GetCustomAttributes(false);
   
补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,