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

步骤一、建立扩展属性类

实体类扩展属性要继承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. hdu 3622 二分+2-sat

    /* 二分+2-sat 题意:在一个二维平面上给你n个炸弹,和2*n个位置,每一行的两个位置只能有一个放炸弹 现在炸弹爆炸有一个半径,当炸弹爆炸时两个炸弹的半径化成的圆不能相交,求最大半径 二分半径, ...

  2. 序列终结者(bzoj 1521)

    Description 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这 ...

  3. NOIP2012 文化之旅

    题目描述 Description 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不同的国家可 ...

  4. 【intellij】intellij idea 建立与src级别的目录

    在使用三大框架时,通常会把配置文件放在自己新建的config文件夹里,以便编程.在 myeclipse里新建的config文件夹是Source Folder属性的 这样他的级别适合src一个级别,但是 ...

  5. javabean组件

    javaBean组件引入: javaBean是使用java语言开发的一个可重用的组件,在Jsp开发中可以使用javaBean减少重复代码,使整个JSP代码的开发更简洁. 我们首先创建一个类叫做Stud ...

  6. 2017-10-01-afternoon

    T1 一道图论好题(graph) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带 ...

  7. 输入一个URL之后。。。

    1.输入URL2.浏览器去浏览器缓存.系统缓存.路由器缓存查找缓存记录,有则直接访问URL对应的IP,无则下一步3.DNS解析URL,获得对应的IP4.浏览器通过TCP/IP三次握手连接服务器5.客户 ...

  8. Ubuntu 16.04下Redis Cluster集群搭建(官方原始方案)

    前提:先安装好Redis,参考:http://www.cnblogs.com/EasonJim/p/7599941.html 说明:Redis Cluster集群模式可以做到动态增加节点和下线节点,使 ...

  9. pkill有的时候并不能杀死进程?

    pkill的用法:http://man.linuxde.net/pkill 根据进程命令行,杀死进程 如下intellij.go代码为一个代理服务器,把本地请求转向一个代理 package main ...

  10. Lua:ipairs和pairs的区别

    ipairs 和pairs在lua中都是遍历tbale的函数但是两者有区别 1.pairs遍历table中的所有的key-vale 而ipairs会根据key的数值从1开始加1递增遍历对应的table ...