自己动手写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 ,
- 更多JAVA疑问解答:
- java怎么在线读取ftp服务器上的文件内容
- 关于程序员的职业规划
- HTML和JSP矛盾吗?
- java小程序如何打包?
- java怎么split路径文件名?
- 关于Hibernate实体自身多对一的抓取问题
- 关于apache2+tomcat群集出现的问题
- SSH 导入导出excel 谁有这块的资料吗?
- springmvc 加载一个jsp页面执行多个方法 报404
- 关于用jquery 导入 excel
- java对时间进行循环放到List中
- 一个图片的输入输出程序,第一次调用某方法会中断,第二次调用则正常
- 请上过传智播客的人说一下传智播客怎么样呀!是不是像它说的那样好呀!
- spring的schema怎么配置
- 【菜鸟求助】SSH中怎么从JSP页面往后台传值呢