ORM小练习代码
DOG类
namespace RupengORM
{
public class Dog
{
public Dog()
{
} /// <summary>
/// 显示提供无参构造函数
/// </summary>
/// <param name="aa"></param>
public Dog(int aa)
{
} public int Id { get; set; } public string Name { get; set; } public int Weight { set; get; }
}
}
Sqlhelper:
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using MySql.Data.MySqlClient; namespace RupengORM
{
public class DbSqlhelper
{
private static readonly string Sqlconnstr = ConfigurationManager.ConnectionStrings["mysqlconn"].ConnectionString; public static MySqlConnection CreateConnection()
{
MySqlConnection conn = new MySqlConnection(Sqlconnstr);
conn.Open();
return conn;
} public static int ExecuteNonQuery(MySqlConnection conn, string sql, params MySqlParameter[] parameters)
{
using (MySqlCommand cmd=conn.CreateCommand())
{
cmd.CommandText = sql;
cmd.Parameters.AddRange(parameters); return cmd.ExecuteNonQuery();
}
} public static int ExecuteNonQuery(string sql, params MySqlParameter [] parameters)
{
using (MySqlConnection conn = CreateConnection())
{
return ExecuteNonQuery(conn, sql, parameters); }
} public static object ExecuteScalar(MySqlConnection conn, string sql, Dictionary<string, object> dictionary)
{
using (MySqlCommand cmd=conn.CreateCommand())
{
cmd.CommandText = sql;
foreach (var kvp in dictionary)
{
IDbDataParameter parameter = cmd.CreateParameter();
parameter.ParameterName = kvp.Key;
parameter.Value = kvp.Value;
cmd.Parameters.Add(parameter);
}
return cmd.ExecuteScalar(); } } public static object ExecuteScalar(string sql, Dictionary<string, object> dictionary)
{
using (MySqlConnection conn=CreateConnection())
{
return ExecuteScalar(conn, sql, dictionary);
}
} public static DataTable ExecuteQuery(MySqlConnection conn, string sql, Dictionary<string, object> dictionary)
{
DataTable dataTable=new DataTable();
using (MySqlCommand cmd=conn.CreateCommand())
{
cmd.CommandText = sql;
foreach (var kvp in dictionary)
{
IDbDataParameter parameter = cmd.CreateParameter();
parameter.ParameterName = kvp.Key;
parameter.Value = kvp.Value;
cmd.Parameters.Add(parameter);
using (IDataReader reader=cmd.ExecuteReader())
{
dataTable.Load(reader);
} }
} return dataTable;
} public static DataTable ExecuteQuery( string sql, Dictionary<string, object> dictionary)
{
using (MySqlConnection conn=CreateConnection())
{
return ExecuteQuery(conn, sql, dictionary);
}
} } }
RProm 实现过程:
using System;
using System.Collections.Generic;
using System.Text;
using MySql.Data.MySqlClient; namespace RupengORM
{
internal class RPorm
{
//约定:1、类名要和表名一样
//2、字段名和数据库列名一样
//3、主键的名字必须叫Id,必须是自动递增,int类型
//
//
//
//
//
public static void Insert(object obj)
{
//获得obj对象的类名
var type = obj.GetType(); //typeof(Person)
var className = type.Name; //类名:Person
//propertyInfos获得类里面所有的属性
var propertyInfos = type.GetProperties();
var propNames = new string[propertyInfos.Length - ]; //排除掉Id
var paramNames = new string[propertyInfos.Length - ];
var sqlParameters = new MySqlParameter[propertyInfos.Length - ];
// Dictionary<string, object> dic = new Dictionary<string, object>();
var count = ;
foreach (var propInfo in propertyInfos)
{
var propName = propInfo.Name; if (propName != "Id") //排除Id
{
//遍历赋值,包含ID不进入赋值
propNames[count] = propName;
paramNames[count] = "@" + propName;
var mySqlParameter = new MySqlParameter();
mySqlParameter.ParameterName = "@" + propName;
mySqlParameter.Value = propInfo.GetValue(obj); //去obj对象属性的值
sqlParameters[count] = mySqlParameter;
count++;
}
} //拼接生成insert语句
var sbSql = new StringBuilder(); sbSql.Append("insert into ")
.Append(className)
.Append("(")
.Append(string.Join(",", propNames))
.Append(")");
sbSql.Append(" values (").Append(string.Join(",", paramNames)).Append(")"); DbSqlhelper.ExecuteNonQuery(sbSql.ToString(), sqlParameters); //params可变长度参数本质上就是一个数组
} public static object SelectById(Type type, int id)
{
//将表名获取到
var classname = type.Name; var sql = "select * from " + classname + " where id=@id";
var dictionary = new Dictionary<string, object>();
dictionary["@id"] = id;
var dataTable = DbSqlhelper.ExecuteQuery(sql, dictionary); if (dataTable.Rows.Count <= )
{
return null;
}
if (dataTable.Rows.Count > )
{
throw new Exception("查到多条ID=" + id + "的数据");
}
var row = dataTable.Rows[];
//创建type类的一个对象
var obj = Activator.CreateInstance(type); //给obj对象的每一个属性(包括Id)赋值,得到id name weight
foreach (var propInfo in type.GetProperties())
{
var propName = propInfo.Name; //属性名就是别名 var value = row[propName]; //获取数据库中列的值 propInfo.SetValue(obj, value); //给obj对象的propinfo属性赋值为value
}
return obj;
} public static T SelectById<T>(int id) where T : new() //泛型约束,约束T必须有一个无参的构造函数
{
var type = typeof (T); //typeof(Person) var classname = type.Name; var sql = "select * from " + classname + " where id=@id";
var dictionary = new Dictionary<string, object>();
dictionary["@id"] = id;
var dataTable = DbSqlhelper.ExecuteQuery(sql, dictionary); if (dataTable.Rows.Count <= )
{
return default(T); //default(T)运算符用来获得类型的默认值
//default(int)→0 default(bool)→false default(Person)→null
}
if (dataTable.Rows.Count > )
{
throw new Exception("查到多条ID=" + id + "的数据");
}
var row = dataTable.Rows[];
//创建type类的一个对象
// var obj = Activator.CreateInstance(type);
var obj = new T(); //泛型约束 //给obj对象的每一个属性(包括Id)赋值 返回当前 Type 的所有公共属性。
foreach (var propInfo in type.GetProperties())
{
var propName = propInfo.Name; //属性名就是别名 var value = row[propName]; //获取数据库中列的值 propInfo.SetValue(obj, value); //给obj对象的propinfo属性赋值为value
}
return obj;
} public static bool DeleteById(Type type, int id)
{
var classname = type.Name; var sql = "delete from " + classname + " where id=@id ";
var i = DbSqlhelper.ExecuteNonQuery(sql, new MySqlParameter {ParameterName = "@id", Value = id});
//delete from dog where name='孔老二4'
return i > ;
} public static bool UpdateById(object obj)
{
var type = obj.GetType(); var classname = type.Name; //获得表名 var propertyInfos = type.GetProperties(); //获得表名中的功能属性
var propNames = new string[propertyInfos.Length]; //获取该属性的长度
var paramNames = new string[propertyInfos.Length];
var sqlParameters = new MySqlParameter[propertyInfos.Length];
var count = ;
foreach (var propInfo in propertyInfos)
{
var propName = propInfo.Name;
var mySqlParameter = new MySqlParameter();
mySqlParameter.ParameterName = "@" + propName;
mySqlParameter.Value = propInfo.GetValue(obj); //去obj对象属性的值
sqlParameters[count] = mySqlParameter; if (propName != "Id") //排除Id
{
//遍历赋值,包含ID不进入赋值
propNames[count] = propName; //name paramNames[count] = propName + "=@" + propName; //@name
}
count++;
}
var oop = string.Join(" , ", paramNames).Substring();
// sqlParameters;
var sb = new StringBuilder();
sb.Append("update ").Append(classname).Append(" set ").Append(oop).Append(" where id=@id");
var sqltxt = sb.ToString();
var i = DbSqlhelper.ExecuteNonQuery(sqltxt, sqlParameters);
//生成update语句
//update dog set name=@name weight=@weight where id=@id
//怎么知道那一列被修改了呢
//把所有列都更新一下。反正不变的还是不变 return i > ;
}
}
}
主程序:
using System; namespace RupengORM
{
internal class Program
{
private static void Main(string[] args)
{
//ORM:EF(entity framework,Dapper,Nhibernate)
// Person p1=new Person();
// p1.Name = "rupeng";
// p1.Age = 7;
// RPorm.Insert(p1); for (var i = ; i < ; i++)
{
var d1 = new Dog();
d1.Name = "孔老二" + i;
d1.Weight = ;
RPorm.Insert(d1);
} //Person p1 = (Person)RPorm.SelectById(typeof(Person),1);
//Console.WriteLine(p1.Name+"的年龄是"+p1.Age); // Dog p2 = (Dog)RPorm.SelectById(typeof(Dog), 1);
//if (p2 == null)
//{
// Console.WriteLine("没找到狗");
//}
//else
//{
// Console.WriteLine(p2.Name);
//} //Dog dog = RPorm.SelectById<Dog>(1); //Console.WriteLine(dog.Name);
// Type type = new Type typeof(Dog); //bool aa= RPorm.DeleteById(typeof(Dog),2);
//Console.WriteLine(aa);
var dog = new Dog();
dog.Weight++;
dog.Name = "孔老二";
dog.Id = ;
var update = RPorm.UpdateById(dog); Console.WriteLine(update);
Console.ReadKey();
}
}
}
ORM小练习代码的更多相关文章
- 教你50招提升ASP.NET性能(二十四):ORM小窍门
ORM TipsORM小窍门 More and more people are using Object to Relational Mapping (ORM) tools to jump the d ...
- 小程序代码包压缩 策略&方案
微信小程序自推出以来,逐渐发展,目前正受到越来越多的青睐.其中很重要的一点得益于小程序的轻量级特性,每个小程序最多不超过2MB,招之即来挥之即去,相比于几十上百兆的APP,用户进入小程序,或者说,小程 ...
- 微信小程序代码构成
一.小程序代码 app.json 是当前小程序的全局配置,包括了小程序的所有页面路径.界面表现.网络超时时间.底部tab等. { "pages":[ "pages/ind ...
- 微信小程序代码片段
微信小程序代码片段是一种可分享的小项目,可用于分享小程序和小游戏的开发经验.展示组件和 API 的使用.复现开发问题等等.分享代码片段会得到一个链接,所有拥有此分享链接的人可以在工具中导入此代码片段. ...
- 关于hrtimer_forward小段代码的分析【转】
转自:http://blog.csdn.net/wowuyinglingluan/article/details/45720151 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?) ...
- 福利贴——爬取美女图片的Java爬虫小程序代码
自己做的一个Java爬虫小程序 废话不多说.先上图. 目录命名是用标签缩写,假设大家看得不顺眼能够等完成下载后手动改一下,比方像有强迫症的我一样... 这是挂了一个晚上下载的总大小,只是还有非常多由于 ...
- [RN] React Native代码转换成微信小程序代码的转换引擎工具
React Native代码转换成微信小程序代码的转换引擎工具 https://github.com/areslabs/alita
- 微信小程序转百度小程序代码
听说百度小程序开始出现手机端搜索流量,作为SEO一员,必须搞他.但是又奈何之前做的都是微信小程序,所以用php写了一个微信小程序转百度小程序代码. 修改文件后缀名 .wxml转换为.swan .wxs ...
- 开发指南~小程序代码构成~JSON配置
2.1 JSON 配置 JSON 是一种数据格式,并不是编程语言,在小程序中,JSON扮演的静态配置的角色. 2.1.1 一个例子 先看一个例子,打开开发工具的编辑器,在根目录下可以找到 app.j ...
随机推荐
- js获取url以及截取后边所带参数
var shopId = ""; function GetRequest() { var url = location.search; //获取url中"?"符 ...
- vs2010如何安装mvc3,怎样安装,详细的步骤,从哪下载?请看这篇文章。
vs2010如何安装mvc3,怎样安装,详细的步骤,从哪下载?请看这篇文章. 安装步骤:vs2010 -> vs2010sp1 -> AspNetMVC3Setup -> AspNe ...
- 从零点壹开始学JAVA(DAY 1 笔记)<补充记录>
一个同事的先生(下面称呼其为耿大神)是做开发的,比较资深的那种,在他们公司的核心技术部门. 幸运的是,耿大神很乐意帮助我这株小白菜,在业余时间指导我,这里深表感谢. 耿大神隔段时间会给我提一些问题,让 ...
- 深入理解定时器系列——被誉为神器的requestAnimationFrame
与setTimeout和setInterval不同,requestAnimationFrame不需要设置时间间隔.这有什么好处呢?为什么requestAnimationFrame被称为神器呢?本文将详 ...
- BZOJ‘s Usaco 奶牛题集锦
1230 线段树 1231 状压DP 1232 最小生成树 1527 贪心 1600 打表找规律 1601 最小生成树 1602 prime 1606 DP 1607 筛法 1609 DP 1610 ...
- 转载——CSS3 Object-fit和Object-position
在响应式设计(RWD)中,令大家最头痛的问题的是图片的自适应处理问题.往往我采取的处理方式是给图片的容器设置一个尺寸,然后给图片设置下面的代码: img { max-width: 100%; heig ...
- oracle 导出指定的存储过程
只能导出以下类型: PROCEDURE PACKAGE PACKAGE BODY TYPE BODY FUNCTION TYPE 也就是,表需要单独导出并导入(已经能俭省很多手动操作了). SET e ...
- 安装WampServer时出现的问题(丢失VCRUNTIME140.dll或MSVCR110.dll)以及解决办法
今天,在安装WampServer时,刚开始提示了"丢失VCRUNTIME140.dll"的问题. 我就网上查了一下,结果大家说是没有安装VC++,然后我就按照网友们提供的网址去下载 ...
- setView的AlertDialog在受到二次点击后出错
错误报告: 10-21 13:11:16.009: E/AndroidRuntime(27937): FATAL EXCEPTION: main10-21 13:11:16.009: E/Androi ...
- linux 进程通信 管道
1. 管道概述及相关API应用 1.1 管道相关的关键概念 管道是Linux支持的最初Unix IPC形式之一,具有以下特点: 管道是半双工的,数据只能向一个方向流动:需要双方通信时,需要建立起两个管 ...