c#自定义ORM框架---(泛型&反射&实体类扩展属性<附带通用增、删、查、改>)
该教材主要是运用到泛型、反射和实体类扩展属性
步骤一、建立扩展属性类
实体类扩展属性要继承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框架---(泛型&反射&实体类扩展属性<附带通用增、删、查、改>)的更多相关文章
- [jnhs]教训之jsp页面无法用jstl取值的坑.真他妈的奇葩,实体类的属性名不能用大写
结果页面永远都是空 调试发现,数据正常的塞进去了 问题解决: https://zhidao.baidu.com/question/570584436.html 实体类的属性名,首字母不能大写,改成小写 ...
- 常见ORM框架及JDBC操作工具类
在Java 程序里面去连接数据库,最原始的办法是使用JDBC 的API.我们先来回顾一下使用JDBC 的方式,我们是怎么操作数据库的. // 注册JDBC 驱动 Class.forName(" ...
- mybatis(一)常见ORM框架及JDBC操作工具类
转载:https://www.cnblogs.com/wuzhenzhao/p/11075569.html 在Java 程序里面去连接数据库,最原始的办法是使用JDBC 的API.我们先来回顾一下 ...
- 自定义ORM框架(转转)
ORM背景 在数据库界,主流的数据库都是关系型数据库,其采用的关系型数据结构模型,无论从数学上还是实践中都相当的成熟,得到非常广泛的应用.在关系型数据结构理 论中,所有的数据都组织成一个个相互独立的二 ...
- DataReader,DataTable利用泛型填充实体类
using System; using System.Collections.Generic; using System.Linq; using System.Web; /// <summary ...
- C#工具:反射帮助类 泛型反射帮助类
反射帮助类 using System; using System.Reflection; using System.Data; using System.Drawing; using System.R ...
- swoft orm中的坑(针对实体类的属性名称和数据库字段不相等)
最近在用swoft的orm,发现了一些问题: 首先看下实体类的定义 它的属性名称和所映射的数据库字段名不一致,这个就会导致蛋疼的问题,首先,在我们使用orm的时候,应该使用哪个字段? 我直接说结论,在 ...
- ASP.NET MVC学习---(一)ORM框架,EF实体数据模型简介
现如今 对象关系映射(ORM)框架 被大量的使用于企业级应用的开发 为什么要使用ORM? ADO.NET操作数据库不好吗? 我们可以仔细想想 当我们使用ADO.NET操作数据库的时候 我们需要先获取连 ...
- spring框架对于实体类复杂属性注入xml文件的配置
spring框架是javaWeb项目中至关重要的一个框架,大多web 项目在工作层次上分为持久层.服务层.控制层.持久层(dao.mapper)用于连接数据库,完成项目与数据库中数据的传递:服务层(s ...
随机推荐
- CodeForcesGym 100524A Astronomy Problem
Astronomy Problem Time Limit: 8000ms Memory Limit: 524288KB This problem will be judged on CodeForce ...
- 状态压缩DP总结
POJ1185 炮兵部队问题: 在平原上才能放置炮兵,每个炮兵的上下左右2格之内都不能出现别的炮兵 可以考虑在当前行放置炮兵它的右侧和下侧绝对不会出现炮兵即可,左侧和上侧就能省去考虑 明显的状态压缩d ...
- cf 55D 数位dp 好题
/* 刚开始我考虑0的情况,想将他剔除就将lcmn设为-1,这样还要判断0和lcmn是-1的情况很麻烦而且但是一直出错 后来觉得不用管0的情况就行了,可以认为符合. 解:将lcmn离散化,因为1-9的 ...
- 无法打开物理文件 "X.mdf"。操作系统错误 5:"5(拒绝访问。)"。 (Microsoft SQL Server,错误: 5120)解决
环境 SQLServer 2008 R2 问题 附加数据库出现“无法打开物理文件 "X.mdf".操作系统错误 5:"5(拒绝访问.)". (Microsoft ...
- mybatis collection标签和association标签(一对多,一对一)转载
mybatis 一对一与一对多collection和association的使用 在mybatis如何进行一对一.一对多的多表查询呢?这里用一个简单的例子说明. 一.一对一 1.associati ...
- react的类型检查PropTypes自React v15.5起已弃用,请使用prop-types
最近使用React的类型检查PropTypes时,遇到错误:TypeError: Cannot read property 'array' of undefined 看了下自己的React版本: ...
- 获取路由事件的源Source和OriginalSource
路由事件的消息包括在RoutedEventArgs实例中,该实例有两个属性Source和OriginalSource,都是表示路由事件传递的起点.即事件消息的源头.仅仅只是Source表示的是Logi ...
- javaWeb_使用标签库简化jsp
jsp标签库.也叫自己定义标签. 应用范围 jsp标签.主要应用于前台页面.在jsp中.假设jsp中存在<% %> 等 java代码.那么对前台开发者来说.就须要了解 java代码. 怎样 ...
- react 项目实战(一)创建项目 及 服务端搭建
1.安装 React社区提供了众多的脚手架,这里我们使用官方推荐的create-react-app. //安装脚手架 npm install -g create-react-app //生成并运行项目 ...
- ubuntu系统下,下载Android源码
博主电脑的Windows的 是用的vmware装的ubuntu kylin.vmware随便找都能找到尽量安装最新版本号的,而unbuntu在官方站点下载即可了,安装vmware的时候建议关闭安全类 ...