ORM框架想必大家都比较熟知了,即对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。 当你开发一个应用程序的时候(不使用O/R MAPPING),你可能会写不少数据访问层的代码,用来从数据库保存,删除,读取对象信息,等等。

现在流行的ORM框架有:
JAVA系列:APACHE OJB,CAYENNE,JAXOR,JPA,HIBERNATE,IBATIS/MYBATIS,JRELATIONALFRAMEWORK,SMYLE,TOPLINK等
其中 TOPLINK 是 ORACLE 的商业产品,其他均为开源项目。其中 HIBERNATE的轻量级 ORM 模型逐步确立了在 JAVA ORM 架构中领导地位,甚至取代复杂而又繁琐的 EJB 模型而成为事实上的 JAVA ORM 工业标准。
.NET系列:EF(ENTITY FRAMWORK),NHIBERNATE,Ibits,ENTITYSCODEGENERATE,LINQ TOSQL,GROVE,RUNGOO.ENTERPRISEORM,FIRECODE CREATOR,MYGENERATION,CODESMITH PRO,CODEAUTO等
微软VS中自带的有EF(ENTITY FRAMWORK)框架。

你在DAL中写了很多的方法来读取对象数据,改变状态对象等等任务。而这些代码写起来总是重复的。我们可不可以写一个类来封装这些重复的劳动呢?

想必大家都有曾经想过写SqlHelper吧,实际上,从SqlHelper一步步写下来,封装到足够好之后,就会成为一个自己专属的ORM框架了。

在这里,小编写了一个很基础的类ORM的SqlHelper里面仅仅对Select查询语句进行了封装,由于考虑到了反射机制的诟病(这里不再讨论,关于反射效率问题有大多数的讨论,利与弊总是同时存在的,我们不纠结于这点)。对于常见的CRUD来说,CUD通常一个方法可以实现,并且Sql语句可以得到更大的封装结合配置文件和反射机制进行操作。小编这里采用的模式是SqlServer+SqlHelper+代码生成器(需要代码生成器的可以联系本人,不定期更新)来完成的代码编写工作,因此没有对CUD进行大量的封装,同时也提高了执行效率(你懂的)。

接下来我贴上我的代码(里面注释采用中文注释,比较完善有不懂的可以咨询本人):

 public static readonly string ConnString = ConfigurationManager.ConnectionStrings["ConStr"].ConnectionString;

这里的读取数据库连接字符串采用在配置文件中读取的方式,需要在配置文件中进行配置一个连接名称为"ConStr"的连接字符串。如下Appconfig.XML:(这里配置为本机)

 <connectionStrings>
     <add name="ConStr" connectionString="Data Source=.;Initial Catalog=db_Test;Integrated Security=True"/>
 </connectionStrings>

内部的一些主要方法介绍:

ExecuteNonQuery 执行sql命令,返回受影响的行数。 一般用作CUD操作

ExecuteScalar 执行sql语句或存储过程 返回ExecuteScalar (返回自增的ID)不带参数

ExecuteReader 执行sql语句或存储过程 返回DataReader

ExecuteDataSet 执行sql语句或存储过程,返回DataSet

public static List<T> ReturnListByModels<T>(DataSet ds) 反射返回一个List T 类型的结果集 如List<User> 用于Reader操作

public static T ReturnModelByModels<T>(SqlDataReader reader) 反射返回一个T类型的结果 如User 用于Reader操作

SqlHelper_DG代码如下:

 using System;
 using System.Collections.Generic;
 using System.ComponentModel;
 using System.Configuration;
 using System.Data;
 using System.Data.SqlClient;
 using System.Reflection;

 namespace SqlHelper_Framework4_5_DG
 {
     /// <summary>
     /// SqlHelper
     /// 此类为抽象类,不允许实例化,在应用时直接调用即可;
     /// author qixiao(DG);
     /// release Time :20160506;
     /// </summary>
     public abstract class SqlHelper_DG
     {
         #region ConStr链接字符串---ConStr链接字符串声明
         /// <summary>
         /// 连接字符串 ConnString 公共静态只读 不允许进行修改 在后续调用中目前不支持代码修改链接字符串--DG
         /// </summary>
         public static readonly string ConnString = ConfigurationManager.ConnectionStrings["ConStr"].ConnectionString;
         #endregion

         #region ExcuteNonQuery 执行sql语句或者存储过程,返回影响的行数---ExcuteNonQuery
         /// <summary>
         /// 执行sql语句或存储过程,返回受影响的行数,不带参数。--DG
         /// </summary>
         /// <param name="ConnString">连接字符串,可以自定义,可以使用SqlHelper_DG.ConnString</param>
         /// <param name="commandTextOrSpName">sql语句或存储过程名称</param>
         /// <param name="commandType">命令类型 有默认值CommandType.Text</param>
         /// <returns>返回受影响的行数</returns>
         public static int ExecuteNonQuery(string ConnString, string commandTextOrSpName, CommandType commandType = CommandType.Text)
         {
             try
             {
                 using (SqlConnection conn = new SqlConnection(ConnString))
                 {
                     using (SqlCommand cmd = new SqlCommand())
                     {
                         PreparCommand(conn, cmd, commandTextOrSpName, commandType);//参数增加了commandType 可以自己编辑执行方式
                         return cmd.ExecuteNonQuery();
                     }
                 }
             }
             catch (Exception)
             {
                 return default(int);
             }
         }
         /// <summary>
         /// 执行sql语句或存储过程,返回受影响的行数。--DG
         /// </summary>
         /// <param name="ConnString">连接字符串,可以自定义,可以使用SqlHelper_DG.ConnString</param>
         /// <param name="commandTextOrSpName">sql语句或存储过程名称</param>
         /// <param name="commandType">命令类型 t</param>
         /// <param name="parms">SqlParameter[]参数数组,允许空</param>
         /// <returns>返回受影响的行数</returns>
         public static int ExecuteNonQuery(string ConnString, string commandTextOrSpName, CommandType commandType, params SqlParameter[] parms)
         {
             try
             {
                 using (SqlConnection conn = new SqlConnection(ConnString))
                 {
                     using (SqlCommand cmd = new SqlCommand())
                     {
                         PreparCommand(conn, cmd, commandTextOrSpName, commandType, parms);//参数增加了commandType 可以自己编辑执行方式
                         return cmd.ExecuteNonQuery();
                     }
                 }
             }
             catch (Exception)
             {
                 return default(int);
             }

         }
         /// <summary>
         /// 执行sql命令,返回受影响的行数。--DG
         /// </summary>
         /// <param name="ConnString">连接字符串,可以自定义,可以以使用SqlHelper_DG.ConnString</param>
         /// <param name="commandTextOrSpName">sql语句或存储过程名称</param>
         /// <param name="commandType">命令类型</param>
         /// <param name="obj">object[]参数数组,允许空</param>
         /// <returns>返回受影响的行数</returns>
         public static int ExecuteNonQuery(string ConnString, string commandTextOrSpName, CommandType commandType, params object[] obj)
         {
             try
             {
                 using (SqlConnection conn = new SqlConnection(ConnString))
                 {
                     using (SqlCommand cmd = new SqlCommand())
                     {
                         PreparCommand(conn, cmd, commandTextOrSpName, commandType, obj);//参数增加了commandType 可以自己编辑执行方式
                         return cmd.ExecuteNonQuery();
                     }
                 }
             }
             catch (Exception)
             {
                 return default(int);
             }

         }
         #endregion

         #region ExecuteScalar 执行sql语句或者存储过程,执行单条语句,返回自增的id---ScalarExecuteScalar
         /// <summary>
         /// 执行sql语句或存储过程 返回ExecuteScalar (返回自增的ID)不带参数--DG
         /// </summary>
         /// <param name="ConnString">连接字符串,可以自定义,可以使用SqlHelper_DG.ConnString</param>
         /// <param name="commandTextOrSpName">sql语句或存储过程名称</param>
         /// <param name="commandType">命令类型 有默认值CommandType.Text</param>
         /// <returns></returns>
         public static object ExecuteScalar(string ConnString, string commandTextOrSpName, CommandType commandType = CommandType.Text)
         {
             try
             {
                 using (SqlConnection conn = new SqlConnection(ConnString))
                 {
                     using (SqlCommand cmd = new SqlCommand())
                     {
                         PreparCommand(conn, cmd, commandTextOrSpName, commandType);
                         return cmd.ExecuteScalar();
                     }

                 }
             }
             catch (Exception)
             {
                 return default(int);
             }
         }
         /// <summary>
         /// 执行sql语句或存储过程 返回ExecuteScalar (返回自增的ID)--DG
         /// </summary>
         /// <param name="ConnString">连接字符串,可以自定义,可以使用SqlHelper_DG.ConnString</param>
         /// <param name="commandTextOrSpName">sql语句或存储过程名称</param>
         /// <param name="commandType">命令类型</param>
         /// <param name="parms">SqlParameter[]参数数组,允许空</param>
         /// <returns></returns>
         public static object ExecuteScalar(string ConnString, string commandTextOrSpName, CommandType commandType, params SqlParameter[] parms)
         {
             try
             {
                 using (SqlConnection conn = new SqlConnection(ConnString))
                 {
                     using (SqlCommand cmd = new SqlCommand())
                     {
                         PreparCommand(conn, cmd, commandTextOrSpName, commandType, parms);
                         return cmd.ExecuteScalar();
                     }

                 }
             }
             catch (Exception)
             {
                 return default(int);
             }
         }
         /// <summary>
         /// 执行sql语句或存储过程 返回ExecuteScalar (返回自增的ID)--DG
         /// </summary>
         /// <param name="ConnString">连接字符串,可以自定义,可以使用SqlHelper_DG.ConnString</param>
         /// <param name="commandTextOrSpName">sql语句或存储过程名称</param>
         /// <param name="commandType">命令类型</param>
         /// <param name="obj">object[]参数数组,允许空</param>
         /// <returns></returns>
         public static object ExecuteScalar(string ConnString, string commandTextOrSpName, CommandType commandType, params object[] obj)
         {
             try
             {
                 using (SqlConnection conn = new SqlConnection(ConnString))
                 {
                     using (SqlCommand cmd = new SqlCommand())
                     {
                         PreparCommand(conn, cmd, commandTextOrSpName, commandType, obj);
                         return cmd.ExecuteScalar();
                     }
                 }
             }
             catch (Exception)
             {

                 return default(int);
             }
         }
         #endregion

         #region ExecuteReader 执行sql语句或者存储过程,返回DataReader---DaataReader
         /// <summary>
         /// 执行sql语句或存储过程 返回DataReader 不带参数--DG
         /// </summary>
         /// <param name="ConnString">连接字符串,可以自定义,可以使用SqlHelper_DG.ConnString</param>
         /// <param name="commandTextOrSpName">sql语句或存储过程名称</param>
         /// <param name="commandType">命令类型 有默认值CommandType.Text</param>
         /// <returns></returns>
         public static SqlDataReader ExecuteReader(string ConnString, string commandTextOrSpName, CommandType commandType = CommandType.Text)
         {
             //sqlDataReader不能用using 会关闭conn 导致不能获取到返回值。注意:DataReader获取值时必须保持连接状态
             try
             {
                 SqlConnection conn = new SqlConnection(ConnString);
                 SqlCommand cmd = new SqlCommand();
                 PreparCommand(conn, cmd, commandTextOrSpName, commandType);
                 return cmd.ExecuteReader(CommandBehavior.CloseConnection);
             }
             catch (Exception)
             {
                 return null;
             }
         }
         /// <summary>
         /// 执行sql语句或存储过程 返回DataReader--DG
         /// </summary>
         /// <param name="ConnString">连接字符串,可以自定义,可以使用SqlHelper_DG.ConnString</param>
         /// <param name="commandTextOrSpName">sql语句或存储过程名称</param>
         /// <param name="commandType">命令类型</param>
         /// <param name="parms">SqlParameter[]参数数组,允许空</param>
         /// <returns></returns>
         public static SqlDataReader ExecuteReader(string ConnString, string commandTextOrSpName, CommandType commandType, params SqlParameter[] parms)
         {
             //sqlDataReader不能用using 会关闭conn 导致不能获取到返回值。注意:DataReader获取值时必须保持连接状态
             try
             {
                 SqlConnection conn = new SqlConnection(ConnString);
                 SqlCommand cmd = new SqlCommand();
                 PreparCommand(conn, cmd, commandTextOrSpName, commandType, parms);
                 return cmd.ExecuteReader(CommandBehavior.CloseConnection);
             }
             catch (Exception)
             {
                 return null;
             }
         }
         /// <summary>
         /// 执行sql语句或存储过程 返回DataReader--DG
         /// </summary>
         /// <param name="ConnString">连接字符串,可以自定义,可以使用SqlHelper_DG.ConnString</param>
         /// <param name="commandTextOrSpName">sql语句或存储过程名称</param>
         /// <param name="commandType">命令类型</param>
         /// <param name="obj">object[]参数数组,允许空</param>
         /// <returns></returns>
         public static SqlDataReader ExecuteReader(string ConnString, string commandTextOrSpName, CommandType commandType, params object[] obj)
         {
             //sqlDataReader不能用using 会关闭conn 导致不能获取到返回值。注意:DataReader获取值时必须保持连接状态
             try
             {
                 SqlConnection conn = new SqlConnection(ConnString);
                 SqlCommand cmd = new SqlCommand();
                 PreparCommand(conn, cmd, commandTextOrSpName, commandType, obj);
                 return cmd.ExecuteReader(CommandBehavior.CloseConnection);
             }
             catch (Exception)
             {
                 return null;
             }
         }
         #endregion

         #region ExecuteDataset 执行sql语句或者存储过程,返回一个DataSet---DataSet
         /// <summary>
         /// 执行sql语句或存储过程,返回DataSet 不带参数--DG
         /// </summary>
         /// <param name="ConnString">连接字符串,可以自定义,可以使用SqlHelper_DG.ConnString</param>
         /// <param name="commandTextOrSpName">sql语句或存储过程名称</param>
         /// <param name="commandType">命令类型 有默认值CommandType.Text</param>
         /// <returns></returns>
         public static DataSet ExecuteDataSet(string ConnString, string commandTextOrSpName, CommandType commandType = CommandType.Text)
         {
             try
             {
                 using (SqlConnection conn = new SqlConnection(ConnString))
                 {
                     using (SqlCommand cmd = new SqlCommand())
                     {
                         PreparCommand(conn, cmd, commandTextOrSpName, commandType);
                         using (SqlDataAdapter da = new SqlDataAdapter(cmd))
                         {
                             DataSet ds = new DataSet();
                             da.Fill(ds);
                             return ds;
                         }
                     }
                 }
             }
             catch (Exception)
             {
                 return null;
             }
         }
         /// <summary>
         /// 执行sql语句或存储过程,返回DataSet--DG
         /// </summary>
         /// <param name="ConnString">连接字符串,可以自定义,可以使用SqlHelper_DG.ConnString</param>
         /// <param name="commandTextOrSpName">sql语句或存储过程名称</param>
         /// <param name="commandType">命令类型</param>
         /// <param name="parms">SqlParameter[]参数数组,允许空</param>
         /// <returns></returns>
         public static DataSet ExecuteDataSet(string ConnString, string commandTextOrSpName, CommandType commandType, params SqlParameter[] parms)
         {
             try
             {
                 using (SqlConnection conn = new SqlConnection(ConnString))
                 {
                     using (SqlCommand cmd = new SqlCommand())
                     {
                         PreparCommand(conn, cmd, commandTextOrSpName, commandType, parms);
                         using (SqlDataAdapter da = new SqlDataAdapter(cmd))
                         {
                             DataSet ds = new DataSet();
                             da.Fill(ds);
                             return ds;
                         }
                     }
                 }
             }
             catch (Exception)
             {
                 return null;
             }
         }
         /// <summary>
         /// 执行sql语句或存储过程,返回DataSet--DG
         /// </summary>
         /// <param name="ConnString">连接字符串,可以自定义,可以使用SqlHelper_DG.ConnString</param>
         /// <param name="commandTextOrSpName">sql语句或存储过程名称</param>
         /// <param name="commandType">命令类型 </param>
         /// <param name="obj">object[]参数数组,允许空</param>
         /// <returns></returns>
         public static DataSet ExecuteDataSet(string ConnString, string commandTextOrSpName, CommandType commandType, params object[] obj)
         {
             try
             {
                 using (SqlConnection conn = new SqlConnection(ConnString))
                 {
                     using (SqlCommand cmd = new SqlCommand())
                     {
                         PreparCommand(conn, cmd, commandTextOrSpName, commandType, obj);
                         using (SqlDataAdapter da = new SqlDataAdapter(cmd))
                         {
                             DataSet ds = new DataSet();
                             da.Fill(ds);
                             return ds;
                         }
                     }
                 }
             }
             catch (Exception)
             {
                 return null;
             }
         }
         #endregion

         #region ---PreparCommand 构建一个通用的command对象供内部方法进行调用---
         /// <summary>
         /// 不带参数的设置sqlcommand对象--DG
         /// </summary>
         /// <param name="conn">sqlconnection对象</param>
         /// <param name="cmd">sqlcommmand对象</param>
         /// <param name="commandTextOrSpName">sql语句或存储过程名称</param>
         /// <param name="commandType">语句的类型</param>
         private static void PreparCommand(SqlConnection conn, SqlCommand cmd, string commandTextOrSpName, CommandType commandType)
         {
             //打开连接
             if (conn.State != ConnectionState.Open)
             {
                 conn.Open();
             }

             //设置SqlCommand对象的属性值
             cmd.Connection = conn;
             cmd.CommandType = commandType;
             cmd.CommandText = commandTextOrSpName;
             cmd.CommandTimeout = ;
         }
         /// <summary>
         /// 设置一个等待执行的SqlCommand对象--DG
         /// </summary>
         /// <param name="conn">sqlconnection对象</param>
         /// <param name="cmd">sqlcommmand对象</param>
         /// <param name="commandTextOrSpName">sql语句或存储过程名称</param>
         /// <param name="commandType">语句的类型</param>
         /// <param name="parms">参数,sqlparameter类型,需要指出所有的参数名称</param>
         private static void PreparCommand(SqlConnection conn, SqlCommand cmd, string commandTextOrSpName, CommandType commandType, params SqlParameter[] parms)
         {
             //打开连接
             if (conn.State != ConnectionState.Open)
             {
                 conn.Open();
             }

             //设置SqlCommand对象的属性值
             cmd.Connection = conn;
             cmd.CommandType = commandType;
             cmd.CommandText = commandTextOrSpName;
             cmd.CommandTimeout = ;

             cmd.Parameters.Clear();
             if (parms != null)
             {
                 cmd.Parameters.AddRange(parms);
             }
         }
         /// <summary>
         /// PreparCommand方法,可变参数为object需要严格按照参数顺序传参--DG
         /// </summary>
         /// <param name="conn">sqlconnection对象</param>
         /// <param name="cmd">sqlcommmand对象</param>
         /// <param name="commandTextOrSpName">sql语句或存储过程名称</param>
         /// <param name="commandType">语句的类型</param>
         /// <param name="parms">参数,object类型,需要按顺序赋值</param>
         private static void PreparCommand(SqlConnection conn, SqlCommand cmd, string commandTextOrSpName, CommandType commandType, params object[] parms)
         {

             //打开连接
             if (conn.State != ConnectionState.Open)
             {
                 conn.Open();
             }

             //设置SqlCommand对象的属性值
             cmd.Connection = conn;
             cmd.CommandType = commandType;
             cmd.CommandText = commandTextOrSpName;
             cmd.CommandTimeout = ;

             cmd.Parameters.Clear();
             if (parms != null)
             {
                 cmd.Parameters.AddRange(parms);
             }
         }
         //之所以会用object参数方法是为了我们能更方便的调用存储过程,不必去关系存储过程参数名是什么,知道它的参数顺序就可以了 sqlparameter必须指定每一个参数名称
         #endregion

         #region 通过Model反射返回结果集 Model为 T 泛型变量的真实类型---反射返回结果集Private
         /// <summary>
         /// 反射返回一个List T 类型的结果集--DG
         /// </summary>
         /// <typeparam name="T">Model中对象类型</typeparam>
         /// <param name="ds">DataSet结果集</param>
         /// <returns></returns>
         public static List<T> ReturnListByModels<T>(DataSet ds)
         {
             try
             {
                 List<T> list = new List<T>();//实例化一个list对象
                 T model = System.Activator.CreateInstance<T>();                     //实例化一个T类型对象
                 PropertyInfo[] propertyInfos = model.GetType().GetProperties();     //获取T对象的所有公共属性

                 DataTable dt = ds.Tables[];    // 获取到ds的dt
                 )
                 {
                     //判断读取的行是否>0 即数据库数据已被读取
                     foreach (DataRow row in dt.Rows)
                     {
                         T model1 = System.Activator.CreateInstance<T>();//实例化一个对象,便于往list里填充数据
                         foreach (PropertyInfo propertyInfo in propertyInfos)
                         {
                             //遍历模型里所有的字段
                             if (row[propertyInfo.Name] != System.DBNull.Value)
                             {
                                 //判断值是否为空,如果空赋值为null见else
                                 if (propertyInfo.PropertyType.IsGenericType && propertyInfo.PropertyType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
                                 {
                                     //如果convertsionType为nullable类,声明一个NullableConverter类,该类提供从Nullable类到基础基元类型的转换
                                     NullableConverter nullableConverter = new NullableConverter(propertyInfo.PropertyType);
                                     //将convertsionType转换为nullable对的基础基元类型
                                     propertyInfo.SetValue(model1, Convert.ChangeType(row[propertyInfo.Name], nullableConverter.UnderlyingType), null);
                                 }
                                 else
                                 {
                                     propertyInfo.SetValue(model1, Convert.ChangeType(row[propertyInfo.Name], propertyInfo.PropertyType), null);
                                 }
                             }
                             else
                             {
                                 propertyInfo.SetValue(model1, null, null);//如果数据库的值为空,则赋值为null
                             }
                         }
                         list.Add(model1);//将对象填充到list中
                     }
                 }
                 return list;
             }
             catch (Exception)
             {
                 return null;
             }
         }
         /// <summary>
         /// 反射返回一个T类型的结果--DG
         /// </summary>
         /// <typeparam name="T">Model中对象类型</typeparam>
         /// <param name="reader">SqlDataReader结果集</param>
         /// <returns></returns>
         public static T ReturnModelByModels<T>(SqlDataReader reader)
         {
             try
             {
                 T model = System.Activator.CreateInstance<T>();                     //实例化一个T类型对象
                 PropertyInfo[] propertyInfos = model.GetType().GetProperties();     //获取T对象的所有公共属性
                 using (reader)
                 {
                     if (reader.Read())
                     {
                         foreach (PropertyInfo propertyInfo in propertyInfos)
                         {
                             //遍历模型里所有的字段
                             if (reader[propertyInfo.Name] != System.DBNull.Value)
                             {
                                 //判断值是否为空,如果空赋值为null见else
                                 if (propertyInfo.PropertyType.IsGenericType && propertyInfo.PropertyType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
                                 {
                                     //如果convertsionType为nullable类,声明一个NullableConverter类,该类提供从Nullable类到基础基元类型的转换
                                     NullableConverter nullableConverter = new NullableConverter(propertyInfo.PropertyType);
                                     //将convertsionType转换为nullable对的基础基元类型
                                     propertyInfo.SetValue(model, Convert.ChangeType(reader[propertyInfo.Name], nullableConverter.UnderlyingType), null);
                                 }
                                 else
                                 {
                                     propertyInfo.SetValue(model, Convert.ChangeType(reader[propertyInfo.Name], propertyInfo.PropertyType), null);
                                 }
                             }
                             else
                             {
                                 propertyInfo.SetValue(model, null, null);//如果数据库的值为空,则赋值为null
                             }
                         }
                         return model;//返回T类型的赋值后的对象 model
                     }
                 }
                 return default(T);//返回引用类型和值类型的默认值0或null
             }
             catch (Exception)
             {
                 return default(T);//返回引用类型和值类型的默认值0或null
             }
         }
         #endregion
     }
 }

SqlHelper_DG


接下来我们介绍一下使用方法 :

这里写的一个tb_TestService数据访问层(用本人的代码生成器自动生成的),实现的是一个简单的增删改查CRUD操作,里面包含了大部分的SqlHelper_DG的使用方法,大家自己在里面找吧!本人就不在具体说明了。

 using Model;
 using SqlHelper_Framework4_5_DG;
 using System;
 using System.Collections.Generic;
 using System.Data;
 using System.Data.SqlClient;
 using System.Text;

 namespace DAL
 {
     /// <summary>
     ///七小代码生成器
     ///版本号:2.0.0
     ///Author:EnglishName:Qixiao,中文名:七小(東哥)
     ///生成器编写时间:20160507,地点:亚洲中国天津
     ///代码标准:東哥的SqlHelper_DG
     /// </summary>

     /// <summary>
     /// 实体类tb_TestService(可添加属性说明)
     /// </summary>
     public class tb_TestService
     {
         /// <summary>
         /// 计算当前表内的符合条件的所有数据的数量
         /// </summary>
         /// <param name="safeSqlConditionInBLL">安全的sql条件语句,从BLL层获取</param>
         /// <returns></returns>
         public int DataCount(string safeSqlConditionInBLL = "")
         {
             try
             {
                 string commandText = "select count(0) from tb_Test WHERE " + safeSqlConditionInBLL;
                 return Convert.ToInt32(SqlHelper_DG.ExecuteScalar(SqlHelper_DG.ConnString, commandText));
             }
             catch (Exception)
             {
                 return default(int);
             }
         }
         /// <summary>
         /// 检测是否存在条件所指示的数据------------这个方法需要按需求来修改条件,不能盲目使用!!!
         /// </summary>
         /// <param name="tb_TestObject">从对象中提取中要查找的字段是否存在(对象方式是防止数据注入!)</param>
         /// <returns></returns>
         public Boolean IsExistWhereFeild(tb_Test tb_TestObject)
         {
             try
             {
                 string commandText = "select count(0) from tb_Test WHERE Str1=@Str1";
                 SqlParameter[] parms = new SqlParameter[]{
                 new SqlParameter("@Str1",tb_TestObject.Str1),
                 };
                  ? true : false;
             }
             catch (Exception)
             {
                 return false;
             }
         }
         /// <summary>
         /// Insert插入语句,返回插入的结果:成功true,失败false
         /// </summary>
         /// <param name="tb_TestObject">要插入的对象,屏蔽掉自增的字段</param>
         /// <returns></returns>
         public Boolean IsInsert(tb_Test tb_TestObject)
         {
             try
             {
                 string commandText = "INSERT INTO tb_Test ( Str1,Id2,Str2) VALUES (@Str1,@Id2,@Str2)";
                 SqlParameter[] parms = new SqlParameter[]{
                 new SqlParameter("@Str1",tb_TestObject.Str1),
                 new SqlParameter("@Id2",tb_TestObject.Id2),
                 new SqlParameter("@Str2",tb_TestObject.Str2),
                 };
                  ? true : false;
             }
             catch (Exception)
             {
                 return false;
             }
         }
         /// <summary>
         /// Update修改语句,返回修改的结果:成功true,失败false
         /// </summary>
         /// <param name="tb_TestObject">要修改的结果对象,屏蔽掉自增的列,条件可修改</param>
         /// <returns></returns>
         public Boolean IsUpdate(tb_Test tb_TestObject)
         {
             try
             {
                 string commandText = "UPDATE tb_Test SET Str1=@Str1,Id2=@Id2,Str2=@Str2 WHERE Id=@Id";
                 SqlParameter[] parms = new SqlParameter[]{
                     new SqlParameter("@Id",tb_TestObject.Id),
                     new SqlParameter("@Str1",tb_TestObject.Str1),
                     new SqlParameter("@Id2",tb_TestObject.Id2),
                     new SqlParameter("@Str2",tb_TestObject.Str2),
                 };
                  ? true : false;
             }
             catch (Exception)
             {
                 return false;
             }
         }
         /// <summary>
         /// Delete删除语句,返回删除的结果:成功true,失败false
         /// </summary>
         /// <param name="tb_TestObject">条件对象,唯一字段或者自定义删除条件</param>
         /// <returns></returns>
         public Boolean IsDelete(tb_Test tb_TestObject)
         {
             try
             {
                 string commandText = "DELETE FROM tb_Test WHERE Id=@Id";
                 SqlParameter[] parms = new SqlParameter[]{
                 new SqlParameter("@Id",tb_TestObject.Id),
                 };
                  ? true : false;
             }
             catch (Exception)
             {
                 return false;
             }
         }
         /// <summary>
         /// Select Model语句,返回查询的Model结果
         /// </summary>
         /// <param name="tb_TestObject">条件对象,按需求来确定查找的条件</param>
         /// <returns></returns>
         public T SelectSingleLine_RTModel<T>(tb_Test tb_TestObject)
         {
             try
             {
                 string commandText = "SELECT TOP (1) * FROM tb_Test WHERE Id=@Id";//这里需要按需求来确定需要查找的是哪个参数 因为要返回一行数据,所以搜索的条件值必须是唯一的,主键是最佳选择!
                 SqlParameter[] parms = new SqlParameter[]{
                 new SqlParameter("@Id",tb_TestObject.Id),
                 };
                 return SqlHelper_DG.ReturnModelByModels<T>(SqlHelper_DG.ExecuteReader(SqlHelper_DG.ConnString, commandText, CommandType.Text, parms));
             }
             catch (Exception)
             {
                 return default(T);
             }
         }
         /// <summary>
         /// Select List语句,返回查询的List结果集
         /// </summary>
         /// <param name="safeSqlCondition">查询的条件,从BLL层传来的安全的sql语句</param>
         /// <returns></returns>
         public List<T> SelectALL<T>(string safeSqlCondition = " 1=1 ")
         {
             try
             {
                 string commandText = "SELECT * FROM tb_Test WHERE " + safeSqlCondition;//这里修改条件语句 默认全部
                 return SqlHelper_DG.ReturnListByModels<T>(SqlHelper_DG.ExecuteDataSet(SqlHelper_DG.ConnString, commandText));
             }
             catch (Exception)
             {
                 return null;
             }
         }
         /// <summary>
         /// 用RowNumber方法进行分页处理返回List结果集,效率最佳但不支持低版本SqlServer
         /// </summary>
         /// <param name="PageSize">int页大小,每页容纳的行数</param>
         /// <param name="PageNumber">int页码,第几页</param>
         /// <param name="DataOrderBy">object表中按这个字段顺序排序,可以是任意字段,可以加修饰符如DESC</param>
         /// <param name="safeSqlCondition">所有集合中先找出符合这个条件的结果再进行分页处理 查询的条件,从BLL层传来的安全的sql语句</param>
         /// <returns></returns>
         public List<T> SelectALLPaginByRowNumber<T>(int PageSize, int PageNumber, string DataOrderBy,string safeSqlCondition="1=1")
         {
             try
             {
                 StringBuilder commandText=new StringBuilder ();
                 commandText.Append("SELECT TOP " + PageSize + " * FROM (SELECT ROW_NUMBER() OVER (ORDER BY " + DataOrderBy + ") AS RowNumber,* FROM tb_Test ");
                 commandText.Append(" WHERE " + safeSqlCondition + " ");//这里修改条件语句
                 commandText.Append(" ) AS T  WHERE RowNumber > (" + PageSize + "*(" + PageNumber + "-1))");
                 return SqlHelper_DG.ReturnListByModels<T>(SqlHelper_DG.ExecuteDataSet(SqlHelper_DG.ConnString, commandText.ToString()));
             }
             catch (Exception)
             {
                 return null;
             }
         }
     }
 }

tb_TestService


写到这里,相信大家都已经对ORM框架的实现机制有一定的了解,并且能完美的实现一个SqlHelper来进行对自己数据访问代码的封装!如果喜欢,大家可以进一步对Service层的代码进行封装放到一个类里面,更加方便自己对数据库的访问,可以更加简便地访问数据库,有朝一日写出一个属于自己的ORM框架!


有关于 Java 的 DBUtils 介绍详情请参考:http://www.cnblogs.com/qixiaoyizhan/p/5818599.html

2016-08-29 16:44:12

本文为七小站主原创作品,转载请注明出处:http://www.cnblogs.com/qixiaoyizhan/

自己写ORM框架 SqlHelper_DG C#(java的写在链接里)的更多相关文章

  1. 自己写ORM框架 DBUtils_DG Java(C#的写在链接里)

    ORM框架想必大家都比较熟知了,即对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同 ...

  2. 重学 Java 设计模式:实战中介者模式「按照Mybaits原理手写ORM框架,给JDBC方式操作数据库增加中介者场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 同龄人的差距是从什么时候拉开的 同样的幼儿园.同样的小学.一样 ...

  3. (新)自己动手写ORM框架(1)-增删查改的使用

    之前写过一个系列文章自己动手写ORM框架,经过在多个项目的中的使用,对这套代码进行了许多改进,下面是使用方法: 新增学员信息代码预览: DBHelper db = DBHelper.getInstan ...

  4. 自己动手写ORM框架

    提起ORM框架,大家都很熟悉,网上流行的ORM框架有很多,其中出名的有一些,不出名的更是数不胜数. 下面是自己实现的一个简单的ORM框架,实现了常用的增删查改功能,供大家研究ORM实现原理. 功能描述 ...

  5. 深入理解Mybatis(第一讲)——手写ORM框架(简易版Mybatis)

    我们来自定义一个持久层框架,也就是Mybatis的简易版. 使用端的搭建 idea中新建maven工程IPersistence_test: 在resources目录下新建sqlMapConfig.xm ...

  6. 基于springJDBC手写ORM框架

    一.添加MySQLjar包依赖 二.结构 三.文件内容 (一).bean包 1.ColumnInfo.java 2.javaFiledInfo.java 3.TableInfo.java 4.Conf ...

  7. Python练习册 第 0013 题: 用 Python 写一个爬图片的程序,爬 这个链接里的日本妹子图片 :-),(http://tieba.baidu.com/p/2166231880)

    这道题是一道爬虫练习题,需要爬链接http://tieba.baidu.com/p/2166231880里的所有妹子图片,点进链接看一下,这位妹子是日本著名性感女演员--杉本由美,^_^好漂亮啊,赶紧 ...

  8. 常见ORM框架及JDBC操作工具类

    在Java 程序里面去连接数据库,最原始的办法是使用JDBC 的API.我们先来回顾一下使用JDBC 的方式,我们是怎么操作数据库的. // 注册JDBC 驱动 Class.forName(" ...

  9. mybatis(一)常见ORM框架及JDBC操作工具类

      转载:https://www.cnblogs.com/wuzhenzhao/p/11075569.html 在Java 程序里面去连接数据库,最原始的办法是使用JDBC 的API.我们先来回顾一下 ...

随机推荐

  1. python字典访问的三种方法

    定义字典 dic = {'a':"hello",'b':"how"} 法一: for key in dic: print key,dic[key] # a he ...

  2. 关于Listview布局的一点经验

    1.尽量是给item一个固定高度,最外层不要设高度,里面套一层设置一个固定高度:如果用wrap_content的话,之后用alignTop等会出奇怪的问题. 2.如果要使用alignTop align ...

  3. lua中的协程

    lua中的协程和线程类似: 1. 协程拥有自己的独立的栈,局部变量,和指令: 2. 所有协程都可以共享全局变量: 3. 协程不能像线程那样并行执行,协程之间需要相互协调执行,同一个时刻只能运行一个协程 ...

  4. 3dsMax脚本插件开发之路

    经过这两个月的努力,RDF2.1的升级开发已经基本完成,只待过些天正式发布.所以现在总算有时间思考,来整理一下自己的思路,以及今后的方向. 回顾当初,1.0是纯Maxscript编写的,一机一码的方式 ...

  5. Android IOS WebRTC 音视频开发总结(六九)-- qq视频通话都是p2p,我们还怕啥?

    本文主要介绍在线教育这个行业,文章最早发表在我们的微信公众号上,支持原创,详见这里, 欢迎关注微信公众号blackerteam,更多详见www.rtc.help 先简单介绍什么是p2p? p是peer ...

  6. JAVA的包装类 【转】

    Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,这在实际使用时存在很多的不便,为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数 ...

  7. spring mvc 初始化错误

    java.lang.NoSuchMethodError: org.springframework.util.ClassUtils.isPresent(Ljava/lang/String;Ljava/l ...

  8. Windows程序设计(第五版)学习:第一章 起步

    第一章 起步 1,windows主要的三个动态库: kernel32.dll负责操作系统的传统工作,包括内存管理.文件输入以及任务管理等. user32.dll负责用户界面的操作,即所有窗口的管理 g ...

  9. WebForm---登陆状态保持(Cookies内置对象)

    登录状态保持: 首先做一个登录界面,点击 登录按钮 protected void Page_Load(object sender, EventArgs e) { Button1.Click += Bu ...

  10. BackgroundWorker控件

    在我们的程序中,经常会有一些耗时较长的运算,为了保证用户体验,不引起界面不响应,我们一般会采用多线程操作,让耗时操作在后台完成,完成后再进行处理或给出提示,在运行中,也会时时去刷新界面上的进度条等显示 ...