该教材主要是运用到泛型、反射和实体类扩展属性

步骤一、建立扩展属性类

实体类扩展属性要继承Attribute基类完成

 [AttributeUsage(AttributeTargets.Property)]
public class FieldAttribute : Attribute
{
/// <summary>
///是否为主键(true/false)
/// </summary>
public bool PropertyKey { get; set; }
/// <summary>
/// 是否为自动增长(true/false)
/// </summary>
public bool Identity { get; set; }
}
 [AttributeUsage(AttributeTargets.Class)]
public class TableAttribute:Attribute
{
/// <summary>
/// 数据库表名
/// </summary>
public string TableName { get; set; }
}

步骤二、创建实体类并引用扩展实体类属性

注意:
[Serializable]表示实体类可被序列化
[Table(TableName = "emesc.Dome")]表示引入的扩展属性名并且数据库名为emesc.Dome

[Field(PropertyKey = true)]表示是否为主键
 
 [Table(TableName = "emesc.Dome")]
[Serializable]
public class Dome
{
[Field(PropertyKey = true)]
public string EMP_NO { get; set; }
public string EMP_NAME { get; set; }
public string EMP_DESC { get; set; }
public string TYPE { get; set; }
public string EMP_RANK { get; set; }
public string EMP_PASS { get; set; }
public object FACTORY_CODE { get; set; }
public DateTime QUIT_DATE { get; set; }
public object CALENDAR_CODE { get; set; }
}

步骤三、创建BaseClass 该Class主要是用来封装ORM框架的通用方法(增、删、查、改)

  1.反射出实体类所有字段属性

  注意:反射实体类字段主要运用到PropertyInfo[]和泛型T

      PropertyInfo[] 主要反射实体类字段属性

      T 主要是用来传递实体类对象

  

 private static string GetClassType<T>(T modelName) {
try {
StringBuilder type= new StringBuilder();
PropertyInfo[] props = modelName.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);//抓取泛型類的字段屬性;
foreach ( PropertyInfo Info in props) {
//if ((Info.GetValue(modelName,null) + "").Equals("")|| (Info.GetValue(modelName, null) + "").Equals(null)) continue;
//if (Info.PropertyType.Name.StartsWith("DateTime"))
//{
// if (Convert.ToDateTime(Info.GetValue(modelName, null)) == DateTime.MinValue) continue;//判斷時間是否為最小時間 ;
//}
type.Append(Info.Name+",");
}
return type.ToString().Substring(, Start.Length - );//拼接所有字段属性名
}
catch (Exception ex)
{
throw ex;
}
}

  2.反射扩展类字段属性

  /// <summary>
/// 获取实体类中的唯一id和对应的表名
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="modelName"></param>
/// <returns></returns>
public static List<string> GetModelFeature<T>(T modelName) {
try {
List<string> list = new List<string>();
var info= modelName.GetType().GetCustomAttributes(typeof(TableAttribute), false);
foreach (var item in info)
{
TableAttribute attr = item as TableAttribute;
if (attr != null)
{
string tableName = attr.TableName;//表名只有获取一次
list.Add(tableName);
break;
}
}
PropertyInfo[] props = modelName.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);//抓取泛型類的字段屬性;
foreach (var item in props)
{
object[] objAttrs = item.GetCustomAttributes(typeof(FieldAttribute), true);
if (objAttrs.Length > )
{
FieldAttribute attr = objAttrs[] as FieldAttribute;
if (attr.PropertyKey == true)
{
list.Add(item.Name+" = '"+ item.GetValue(modelName,null)+"'");//抓取筛选条件
}
}
}
return list;
}
catch (Exception ex)
{
throw ex;
}
}

  

3. 编写通用增删查改方法 insert、update、delete、Query(select)方法

   通用方法编写思维引导:当我们在对数据库进行操作时我们发现不管怎么对数据库操作都少不了表名、字段名和值 那么我们可以封装函数用来存储字段名和值

   如:insert into 表名 (字段名) values(值)

     update set 字段名=‘值’ from 表名 where 字段名=‘值’

     delete 表名 where 字段名=‘值’

     select 字段名 from 表名 where 字段名=‘值

     存储字段名代码(核心代码):

 private static string GetNumericField<T>(T modelName)
{
try
{
StringBuilder Start = new StringBuilder();
PropertyInfo[] props = modelName.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);//抓取泛型類的字段屬性;
foreach (var item in props)
{
Start.Append(item.Name + ","); }
return Start.ToString().Substring(, Start.Length - );
}
catch (Exception ex)
{
throw ex;
}
}

    存储值代码(核心代码):

 private static string GetValues<T>(T modelName)
{
try {
StringBuilder End = new StringBuilder();
PropertyInfo[] props = modelName.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);//抓取泛型類的字段屬性;
foreach (var item in props)
{
if ((item.GetValue(modelName, null) + "").Equals("") || (item.GetValue(modelName, null) + "").Equals(null)) continue;
if (item.PropertyType.Name.StartsWith("String"))//判斷字段類型
{
End.Append(" and " + item.Name + " = '" + item.GetValue(modelName, null) + "'");
}
else if (item.PropertyType.Name.StartsWith("DateTime"))//判斷字段的屬性是否為時間類型//判斷字段類型
{
if (Convert.ToDateTime(item.GetValue(modelName, null)) == DateTime.MinValue)
{
continue;
}
else
{
End.Append(" and " + item.Name + " = '" + item.GetValue(modelName, null) + "'");
}
}
else
{
End.Append(" and " + item.Name + " = " + item.GetValue(modelName, null) + "");
} }
return End.ToString();
}
catch (Exception ex)
{
throw ex;
}
}

下图为完整版的通用增删改的代码:

  /// <summary>
/// 最低兼容.net 4.0(該ORM緊支持對單表操作)
/// <para>開發時間:2019/5/27</para>
/// <para>開發人員:会害羞的青蛙</para>
/// </summary>
public class BaseFunction
{
DBHelper DB = new DBHelper();
/// <summary>
/// 添加數據(數據錄入時必須將時間轉換為DateTime)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="modelName"></param>
/// <param name="dbName"></param>
/// <returns></returns>
public static int Save<T>(T modelName) {
try {
List<string> list = GetModelFeature(modelName);
string dbName = list[];
StringBuilder SQL = new StringBuilder("insert into ");
StringBuilder End = new StringBuilder();
SQL.Append(dbName + " ("+ GetSaveStart(modelName)+") values ("+ GetSaveEnd(modelName) + ")");
return DBHelper.ExecuteNonQuery(SQL.ToString().Trim().ToUpper());
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 添加數據(數據錄入時必須將時間轉換為DateTime)
/// <para>connectionString為自定義數據庫連接地址支持不同數據庫操作</para>
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="modelName"></param>
/// <param name="dbName"></param>
/// <returns></returns>
public static int Save<T>(T modelName,string connectionString)
{
try
{
List<string> list = GetModelFeature(modelName);
string dbName = list[];
StringBuilder SQL = new StringBuilder("insert into ");
StringBuilder End = new StringBuilder();
SQL.Append(dbName + " (" + GetSaveStart(modelName) + ") values (" + GetSaveEnd(modelName) + ")");
return DBHelper.ExecuteNonQuery(SQL.ToString().Trim().ToUpper(), connectionString);
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 根据主键ID修改數據(若没有主键请在实体类定义一个主键,數據編輯時必須將時間轉換為DateTime)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="modelName"></param>
/// <param name="dbName"></param>
/// <returns></returns>
public static int Update<T>(T modelName)
{
try {
List<string> list = GetModelFeature(modelName);
string dbName = list[];//數據庫名
StringBuilder SQL = new StringBuilder("update "+ dbName + " set ");
StringBuilder End = new StringBuilder();
SQL.Append(GetEditStart(modelName) +" where " + list[]);
return DBHelper.ExecuteNonQuery(SQL.ToString().Trim().ToUpper());
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 根据主键ID修改數據(若没有主键请在实体类定义一个主键,數據編輯時必須將時間轉換為DateTime)
/// <para>connectionString為自定義數據庫連接地址支持不同數據庫操作</para>
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="modelName"></param>
/// <param name="dbName"></param>
/// <returns></returns>
public static int Update<T>(T modelName, string connectionString)
{
try
{
List<string> list = GetModelFeature(modelName);
string dbName = list[];//數據庫名
StringBuilder SQL = new StringBuilder("update " + dbName + " set ");
StringBuilder End = new StringBuilder();
SQL.Append(GetEditStart(modelName) + " where " + list[]);
return DBHelper.ExecuteNonQuery(SQL.ToString().Trim().ToUpper(), connectionString);
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 根据主键ID删除数据(若没有主键请在实体类定义一个主键)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="modelName"></param>
/// <returns></returns>
public static int Delete<T>(T modelName)
{
try {
List<string> list = GetModelFeature(modelName);
string dbName = list[];//數據庫名
string primaryKey = string.Empty;
string primaryValue = string.Empty;
PropertyInfo[] props = modelName.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);//抓取泛型類的字段屬性;
foreach (var item in props)
{
object[] objAttrs = item.GetCustomAttributes(typeof(FieldAttribute), true);
if (objAttrs.Length > )
{
FieldAttribute attr = objAttrs[] as FieldAttribute;
if (attr.PropertyKey == true)
{
primaryKey = item.Name;
primaryValue = item.GetValue(modelName, null)+"";
}
}
}
if (primaryValue=="") { throw new Exception("主键不能为空!"); }
StringBuilder SQL = new StringBuilder("delete " + dbName+ " where " + primaryKey+"='"+ primaryValue + "'");
return DBHelper.ExecuteNonQuery(SQL.ToString().Trim().ToUpper());
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 根据主键ID删除数据(若没有主键请在实体类定义一个主键)
/// <para>connectionString為自定義數據庫連接地址支持不同數據庫操作</para>
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="modelName"></param>
/// <returns></returns>
public static int Delete<T>(T modelName, string connectionString)
{
try
{
List<string> list = GetModelFeature(modelName);
string dbName = list[];//數據庫名
string primaryKey = string.Empty;
string primaryValue = string.Empty;
PropertyInfo[] props = modelName.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);//抓取泛型類的字段屬性;
foreach (var item in props)
{
object[] objAttrs = item.GetCustomAttributes(typeof(FieldAttribute), true);
if (objAttrs.Length > )
{
FieldAttribute attr = objAttrs[] as FieldAttribute;
if (attr.PropertyKey == true)
{
primaryKey = item.Name;
primaryValue = item.GetValue(modelName, null) + "";
}
}
}
if (primaryValue == "") { throw new Exception("主键不能为空!"); }
StringBuilder SQL = new StringBuilder("delete " + dbName + " where " + primaryKey + "='" + primaryValue + "'");
return DBHelper.ExecuteNonQuery(SQL.ToString().Trim().ToUpper(), connectionString);
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 查询所有结果 modelName(实体类)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="modelName"></param>
/// <returns></returns>
public static DataTable QueryList<T>(T modelName) {
try {
List<string> list = GetModelFeature(modelName);
string dbName = list[];//數據庫名
StringBuilder Start = new StringBuilder();
Start.Append(GetQueryStart(modelName));
StringBuilder End = new StringBuilder();
End.Append(GetQueryEnd(modelName));
string SQL = "SELECT " + Start + " FROM " + dbName + " WHERE 1=1" + End;
return DBHelper.GetMultipleResults(SQL.ToString().Trim().ToUpper());
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 查询所有结果 modelName(实体类)
/// <para>connectionString為自定義數據庫連接地址支持不同數據庫操作</para>
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="modelName"></param>
/// <returns></returns>
public static DataTable QueryList<T>(T modelName, string connectionString)
{
try
{
List<string> list = GetModelFeature(modelName);
string dbName = list[];//數據庫名
StringBuilder Start = new StringBuilder();
Start.Append(GetQueryStart(modelName));
StringBuilder End = new StringBuilder();
End.Append(GetQueryEnd(modelName));
string SQL = "SELECT " + Start + " FROM " + dbName + " WHERE 1=1" + End;
return DBHelper.GetMultipleResults(SQL.ToString().Trim().ToUpper(), connectionString);
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 查询所有结果(包含分页)modelName(实体类),page(当前页),linmt(当前页的总条数),count(结果集总条数)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="modelName"></param>
/// <param name="page"></param>
/// <param name="linmt"></param>
/// <returns></returns>
public static DataTable QueryList<T>(T modelName, int page, int linmt ,out int count)
{
try {
List<string> list = GetModelFeature(modelName);
string dbName = list[];//數據庫名
StringBuilder Start = new StringBuilder();
Start.Append(GetQueryStart(modelName));
StringBuilder StartToPagination = new StringBuilder();
StartToPagination.Append(GetQueryStartToPagination(modelName));
StringBuilder End = new StringBuilder();
End.Append(GetQueryEnd(modelName)); count = Convert.ToInt32(DBHelper.GetMultipleResults("SELECT COUNT(*) AS COUNTNUM FROM " + dbName+" WHERE 1=1 "+ End).Rows[]["COUNTNUM"]);
string SQL = "SELECT " + StartToPagination + " FROM (SELECT ROWNUM AS NUM ," + Start + " FROM " + dbName + " WHERE 1=1" + End + " AND ROWNUM<=" + linmt + "*" + page + ") WHERE NUM>" + linmt + "*(" + page + "-1) ";
return DBHelper.GetMultipleResults(SQL.ToString().Trim().ToUpper());
}
catch (Exception ex) {
throw ex;
}
}
/// <summary>
/// 查询所有结果(包含分页)modelName(实体类),page(当前页),linmt(当前页的总条数),count(结果集总条数)
/// <para>connectionString為自定義數據庫連接地址支持不同數據庫操作</para>
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="modelName"></param>
/// <param name="page"></param>
/// <param name="linmt"></param>
/// <returns></returns>
public static DataTable QueryList<T>(T modelName, string connectionString, int page, int linmt, out int count)
{
try
{
List<string> list = GetModelFeature(modelName);
string dbName = list[];//數據庫名
StringBuilder Start = new StringBuilder();
Start.Append(GetQueryStart(modelName));
StringBuilder StartToPagination = new StringBuilder();
StartToPagination.Append(GetQueryStartToPagination(modelName));
StringBuilder End = new StringBuilder();
End.Append(GetQueryEnd(modelName)); count = Convert.ToInt32(DBHelper.GetMultipleResults("SELECT COUNT(*) AS COUNTNUM FROM " + dbName + " WHERE 1=1 " + End).Rows[]["COUNTNUM"]);
string SQL = "SELECT " + StartToPagination + " FROM (SELECT ROWNUM AS NUM ," + Start + " FROM " + dbName + " WHERE 1=1" + End + " AND ROWNUM<=" + linmt + "*" + page + ") WHERE NUM>" + linmt + "*(" + page + "-1) ";
return DBHelper.GetMultipleResults(SQL.ToString().Trim().ToUpper(), connectionString);
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 获取实体类中的唯一id和对应的表名
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="modelName"></param>
/// <returns></returns>
public static List<string> GetModelFeature<T>(T modelName) {
try {
List<string> list = new List<string>();
var info= modelName.GetType().GetCustomAttributes(typeof(TableAttribute), false);
foreach (var item in info)
{
TableAttribute attr = item as TableAttribute;
if (attr != null)
{
string tableName = attr.TableName;//表名只有获取一次
list.Add(tableName);
break;
}
}
PropertyInfo[] props = modelName.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);//抓取泛型類的字段屬性;
foreach (var item in props)
{
object[] objAttrs = item.GetCustomAttributes(typeof(FieldAttribute), true);
if (objAttrs.Length > )
{
FieldAttribute attr = objAttrs[] as FieldAttribute;
if (attr.PropertyKey == true)
{
list.Add(item.Name+" = '"+ item.GetValue(modelName,null)+"'");//抓取筛选条件
}
}
}
return list;
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 獲取起始字段
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="modelName"></param>
/// <returns></returns>
private static string GetSaveStart<T>(T modelName) {
try {
StringBuilder Start = new StringBuilder();
PropertyInfo[] props = modelName.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);//抓取泛型類的字段屬性;
foreach ( PropertyInfo Info in props) {
if ((Info.GetValue(modelName,null) + "").Equals("")|| (Info.GetValue(modelName, null) + "").Equals(null)) continue;
if (Info.PropertyType.Name.StartsWith("DateTime"))
{
if (Convert.ToDateTime(Info.GetValue(modelName, null)) == DateTime.MinValue) continue;//判斷時間是否為最小時間 ;
}
Start.Append(Info.Name+",");
}
return Start.ToString().Substring(, Start.Length - );
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 獲取字段對應的結果
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="modelName"></param>
/// <returns></returns>
private static string GetSaveEnd<T>(T modelName)
{
try {
StringBuilder End = new StringBuilder();
PropertyInfo[] props = modelName.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);//抓取泛型類的字段屬性;
foreach (PropertyInfo Info in props)
{
if ((Info.GetValue(modelName, null) + "").Equals("") || (Info.GetValue(modelName, null) + "").Equals(null)) continue; if (Info.PropertyType.Name.StartsWith("String"))//判斷字段類型
{
End.Append("'" + Info.GetValue(modelName, null) + "',");
}
else if (Info.PropertyType.Name.StartsWith("DateTime"))//判斷字段類型
{
if (Convert.ToDateTime(Info.GetValue(modelName, null)) == DateTime.MinValue)//判斷時間是否為最小時間
{
continue;
}
else {
End.Append("to_date('" + ((DateTime)(Info.GetValue(modelName, null))).ToString("yyyy-MM-dd HH:mm:ss") + "','YYYY-MM-DD HH24:MI:SS'),");
}
}
else {
End.Append(Info.GetValue(modelName, null) + ",");
}
}
return End.ToString().Substring(, End.Length - );
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 重新定義分頁後的查詢字段並且格式化DateTime樣式
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="modelName"></param>
/// <returns></returns>
private static string GetQueryStartToPagination<T>(T modelName) {
try {
StringBuilder Start = new StringBuilder();
PropertyInfo[] props = modelName.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);//抓取泛型類的字段屬性;
foreach (var item in props)
{
if (item.PropertyType.Name.StartsWith("DateTime"))//判斷字段的屬性是否為時間類型
{
Start.Append("TO_CHAR(" + item.Name + ",'YYYY-MM-DD HH:mm:ss') AS " + item.Name + ",");//格式化時間
}
else {
Start.Append(item.Name + ",");
} }
return Start.ToString().Substring(, Start.Length - );
}
catch (Exception ex)
{
throw ex;
}
}
private static string GetQueryStart<T>(T modelName)
{
try
{
StringBuilder Start = new StringBuilder();
PropertyInfo[] props = modelName.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);//抓取泛型類的字段屬性;
foreach (var item in props)
{
Start.Append(item.Name + ","); }
return Start.ToString().Substring(, Start.Length - );
}
catch (Exception ex)
{
throw ex;
}
}
private static string GetQueryEnd<T>(T modelName)
{
try {
StringBuilder End = new StringBuilder();
PropertyInfo[] props = modelName.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);//抓取泛型類的字段屬性;
foreach (var item in props)
{
if ((item.GetValue(modelName, null) + "").Equals("") || (item.GetValue(modelName, null) + "").Equals(null)) continue;
if (item.PropertyType.Name.StartsWith("String"))//判斷字段類型
{
End.Append(" and " + item.Name + " = '" + item.GetValue(modelName, null) + "'");
}
else if (item.PropertyType.Name.StartsWith("DateTime"))//判斷字段的屬性是否為時間類型//判斷字段類型
{
if (Convert.ToDateTime(item.GetValue(modelName, null)) == DateTime.MinValue)
{
continue;
}
else
{
End.Append(" and " + item.Name + " = '" + item.GetValue(modelName, null) + "'");
}
}
else
{
End.Append(" and " + item.Name + " = " + item.GetValue(modelName, null) + "");
} }
return End.ToString();
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 编辑起始内容
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="modelName"></param>
/// <returns></returns>
private static string GetEditStart<T>(T modelName) {
try {
StringBuilder Start = new StringBuilder();
PropertyInfo[] props = modelName.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);//抓取泛型類的字段屬性;
foreach (PropertyInfo Info in props)
{
object[] objAttrs = Info.GetCustomAttributes(typeof(FieldAttribute), true);
if (objAttrs.Length > )
{
FieldAttribute attr = objAttrs[] as FieldAttribute;
if (attr.PropertyKey == true) continue;//判断自定义特性中的主键
}
if ((Info.GetValue(modelName, null) + "").Equals("") || (Info.GetValue(modelName, null) + "").Equals(null)) continue; if (Info.PropertyType.Name.StartsWith("String"))//判斷字段類型
{
Start.Append(Info.Name + "='" + Info.GetValue(modelName, null) + "',");
}
else if (Info.PropertyType.Name.StartsWith("DateTime"))//判斷字段類型
{
if (Convert.ToDateTime(Info.GetValue(modelName, null)) == DateTime.MinValue)//判斷時間是否為最小時間
{
continue;
}
else
{
Start.Append(Info.Name+"=to_date('" + ((DateTime)(Info.GetValue(modelName, null))).ToString("yyyy-MM-dd HH:mm:ss") + "','YYYY-MM-DD HH24:MI:SS'),");
}
}
else {
Start.Append(Info.Name + "=" + Info.GetValue(modelName, null) + ",");
}
}
return Start.ToString().Substring(, Start.Length - );
}
catch (Exception ex)
{
throw ex;
}
}
}

 

  警告:严禁以商用名义贩卖此代码

  代码紧提供学习使用,若要转载此教程备注原创者:会害羞的青蛙

                                          

c#自定义ORM框架---(泛型&反射&实体类扩展属性<附带通用增、删、查、改>)的更多相关文章

  1. [jnhs]教训之jsp页面无法用jstl取值的坑.真他妈的奇葩,实体类的属性名不能用大写

    结果页面永远都是空 调试发现,数据正常的塞进去了 问题解决: https://zhidao.baidu.com/question/570584436.html 实体类的属性名,首字母不能大写,改成小写 ...

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

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

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

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

  4. 自定义ORM框架(转转)

    ORM背景 在数据库界,主流的数据库都是关系型数据库,其采用的关系型数据结构模型,无论从数学上还是实践中都相当的成熟,得到非常广泛的应用.在关系型数据结构理 论中,所有的数据都组织成一个个相互独立的二 ...

  5. DataReader,DataTable利用泛型填充实体类

    using System; using System.Collections.Generic; using System.Linq; using System.Web; /// <summary ...

  6. C#工具:反射帮助类 泛型反射帮助类

    反射帮助类 using System; using System.Reflection; using System.Data; using System.Drawing; using System.R ...

  7. swoft orm中的坑(针对实体类的属性名称和数据库字段不相等)

    最近在用swoft的orm,发现了一些问题: 首先看下实体类的定义 它的属性名称和所映射的数据库字段名不一致,这个就会导致蛋疼的问题,首先,在我们使用orm的时候,应该使用哪个字段? 我直接说结论,在 ...

  8. ASP.NET MVC学习---(一)ORM框架,EF实体数据模型简介

    现如今 对象关系映射(ORM)框架 被大量的使用于企业级应用的开发 为什么要使用ORM? ADO.NET操作数据库不好吗? 我们可以仔细想想 当我们使用ADO.NET操作数据库的时候 我们需要先获取连 ...

  9. spring框架对于实体类复杂属性注入xml文件的配置

    spring框架是javaWeb项目中至关重要的一个框架,大多web 项目在工作层次上分为持久层.服务层.控制层.持久层(dao.mapper)用于连接数据库,完成项目与数据库中数据的传递:服务层(s ...

随机推荐

  1. 61. mybatic insert异常:BindingException: Parameter 'name' not found【从零开始学Spring B】

    mybatic insert异常:BindingException: Parameter 'name' not found [从零开始学习Spirng Boot-常见异常汇总] 异常信息如下: nes ...

  2. Window Pains(poj 2585)

    题意: 一个屏幕要同时打开9个窗口,每个窗口是2*2的矩阵,整个屏幕大小是9*9,每个窗口位置固定. 但是是否被激活(即完整显示出来)不确定. 给定屏幕状态,问是否可以实现显示. 分析:拓扑排序,把完 ...

  3. 【HDOJ3047】Zjnu Stadium(带权并查集)

    题意:浙江省第十二届大学生运动会在浙江师范大学举行,为此在浙师大建造了一座能容纳近万人的新体育场. 观众席每一行构成一个圆形,每个圆形由300个座位组成,对300个座位按照顺时针编号1到300,且可以 ...

  4. Thinkphp5.0 控制器向视图view赋值

    Thinkphp5.0 控制器向视图view的赋值 方式一(使用fetch()方法的第二个参数赋值): <?php namespace app\index\controller; use thi ...

  5. 从零开始写STL-容器-list

    从零开始写STL-容器-list List 是STL 中的链表容器,今天我们将通过阅读和实现list源码来解决一下问题: List内部的内存结构是如何实现的? 为什么List的插入复杂度为O(1)? ...

  6. element-ui自定义table表头

    场景描述: 这个需求的场景很简单,表头自定义居中显示 <el-table-column show-overflow-tooltip prop="telephone" labe ...

  7. 如何使用python书写守护进程?daemon、python-daemon

    可以参考的supervisor实现:https://github.com/Supervisor/supervisor:http://supervisord.org/configuration.html ...

  8. 【SSH进阶之路】Hibernate搭建开发环境+简单实例(二)

    Hibernate是很典型的持久层框架,持久化的思想是很值得我们学习和研究的.这篇博文,我们主要以实例的形式学习Hibernate,不深究Hibernate的思想和原理,否则,一味追求,苦学思想和原理 ...

  9. javascript闭包具体解释

    今天我们从内存结构上来解说下 javascript中的闭包概念. 闭包:是指有权訪问另外一个函数作用域中的变量的函数. 创建闭包的常见方式就是在一个函数内部创建另外一个函数. 在javascript中 ...

  10. POJ2773 Happy 2006【容斥原理】

    题目链接: http://poj.org/problem?id=2773 题目大意: 给你两个整数N和K.找到第k个与N互素的数(互素的数从小到大排列).当中 (1 <= m <= 100 ...