反射ORM 三层(for sql server/mysql)
sql server and oracle 不同之处只在于:
1·参数@和:
2·自增和序列
RPROM.cs //(写错愕,应该是RPORM)
RPROM.Insert(p1); //需求:DBS中插入一条数据
约定:
类名要和表名一样
字段名和数据库列名一样
主键的名字必须是Id,必须自动递增,int类型
class RupengROM
{
/// 插入对象
internal static void Insert(Object obj)
{
//获得类名
Type type = obj.GetType();
string className = type.Name;
//获得除id的所有列名
PropertyInfo[] properties = type.GetProperties();
string[] propertyNames = new string[properties.Length - 1]; //存除id的属性名(列名)
string[] propertyAtNames = new string[properties.Length - 1]; //存除id的属性+@名
//获得除id的所有参数
MySqlParameter[] mysqlParameters = new MySqlParameter[properties.Length - 1]; //存除id的参数名
int i = 0;
foreach(PropertyInfo property in properties)
{
if(property.Name!="Id")
{
propertyNames[i] = property.Name;
propertyAtNames[i] = "@" + property.Name;
MySqlParameter mysqlParam = new MySqlParameter();
mysqlParam.ParameterName = "@" + property.Name;
mysqlParam.Value = property.GetValue(obj); //获得指定对象的属性值
mysqlParameters[i] = mysqlParam;
i++;
}
}
string propertyNamesStr = string.Join(",", propertyNames);
string propertyAtNamesStr = string.Join(",", propertyAtNames);
//拼接sql语句
//insert into T_Person(Name,Age) values(@Name,@Age)
StringBuilder sb = new StringBuilder();
sb.Append("insert into T_").Append(className).Append("(").Append(propertyNamesStr).Append(") values(").Append(propertyAtNamesStr).Append(")");
int im = MySqlHelper.ExecuteNonQuery(sb.ToString(), mysqlParameters);
string msg = im > 0 ? "插入成功" : "插入失败";
Console.WriteLine(msg);
}
/// 根据id查询对象
internal static Object SelectById(Type type,int id)
{
string className = type.Name;
//拼接sql语句
//select * from T_Person where Id=@Id
StringBuilder sb = new StringBuilder();
sb.Append("select * from T_").Append(className).Append(" where Id=@Id");
DataTable dt = MySqlHelper.ExecuteQuery(sb.ToString(), new MySqlParameter() { ParameterName = "@Id", Value = id });
if(dt.Rows.Count<=0)
{
return null;
}
else if(dt.Rows.Count>1)
{
throw new Exception("数据库发生异常,存在id=" + id + "的重复数据");
}
else
{
DataRow row = dt.Rows[0];
Object obj = Activator.CreateInstance(type); //动态创建指定类型的实例
PropertyInfo[] propertyInfoes = type.GetProperties();
foreach(PropertyInfo propertyInfo in propertyInfoes)
{
string propertyName = propertyInfo.Name; //属性名就是列名
object value = row[propertyName];
propertyInfo.SetValue(obj, value); //设置指定对象的属性值
}
return obj;
}
}
/// 根据Id更新实例
internal static void UpdateById(Object obj)
{
//获得类名
Type type = obj.GetType();
string className = type.Name;
//获得除id的列名变化形式 "Name=@Name"
PropertyInfo[] propertyInfoes = type.GetProperties();
string[] propertyChanges = new string[propertyInfoes.Length - 1]; //存除id的属性变化形式
MySqlParameter[] mysqlParameters = new MySqlParameter[propertyInfoes.Length]; //存sql参数
int i = 0;
foreach(PropertyInfo propertyInfo in propertyInfoes)
{
string propertyName = propertyInfo.Name;
if (propertyName != "Id")
{
propertyChanges[i] = propertyName + "=@" + propertyName;
i++;
}
MySqlParameter mysqlParam = new MySqlParameter();
mysqlParam.ParameterName = "@" + propertyName;
mysqlParam.Value = propertyInfo.GetValue(obj);
mysqlParameters[i] = mysqlParam;
}
string propertyChangesStr = string.Join(",", propertyChanges);
//拼接sql语句
//update T_Person set Name=@Name,Age=@Age where Id=@Id
StringBuilder sb = new StringBuilder();
sb.Append("update T_").Append(className).Append(" set ").Append(propertyChangesStr).Append(" where Id=@Id");
int im = MySqlHelper.ExecuteNonQuery(sb.ToString(), mysqlParameters);
string msg = im > 0 ? "更新成功" : "更新失败";
Console.WriteLine(msg);
}
/// 根据id删除
internal static void DeleteById(Type type, int id)
{
//获得类名
string className = type.Name;
//拼接sql语句
//delete from T_Person where Id=@Id
StringBuilder sb = new StringBuilder();
sb.Append("delete from T_").Append(className).Append(" where Id=@Id");
int im = MySqlHelper.ExecuteNonQuery(sb.ToString(), new MySqlParameter() { ParameterName = "@Id", Value = id });
string msg = im > 0 ? "删除成功" : "删除失败";
Console.WriteLine(msg);
}
}
反射ORM 三层(for sql server/mysql)的更多相关文章
- SQL Server | Mysql 对表的unique 的实现方式
在ANSI SQL 标准中unique 有两种实现方式 1.是可以插入多个空值.也就是说多个null值看成是互不相同的. 2.是只可以插入一个空值,也主是说把所有的空值看也是相同的. 在SQL Ser ...
- 数据库管理工具神器-DataGrip,可同时管理多个主流数据库[SQL Server,MySQL,Oracle等]连接
前言 DataGrip:Jet Brains出品的一款数据库管理工具(没错,是Jet Brains出品,必属精品).DataGrip整合集成了当前主流数据库(如:SQL Server, MySQL, ...
- SQL Server,MySQL,Oracle三者的区别
SQL Server,MySQL,Oracle三者的区别 2016-10-14 转自:SQL Server,MySQL,Oracle三者的区别 目录 1 Oracle.Sql Server.MySql ...
- Java与SQL Server, MySql, Oracle, Access的连接方法以及一些异常解决
Java与SQL Server, MySql, Oracle, Access的连接方法以及一些异常解决 I. 概述 1.1 JDBC概念 JDBC(Java Database Connectivity ...
- Bootstrap + AngularJS+ Ashx + SQL Server/MySQL
去年年底12月,为适应移动端浏览需求,花了1个月时间学习Bootstrap,并将公司ASP网站重构成ASP.NET. 当时采取的网站架构: Bootstrap + jQuery + Ashx + SQ ...
- 反射ORM 三层(for oracle)
sql server and oracle 不同之处只在于: 1·参数@和: 2·自增和序列 3·oracle使用了存储过程以获得当前插入数据的ID DAL层的ORM using Oracle.Dat ...
- iBatis自动生成的主键 (Oracle,MS Sql Server,MySQL)【转】
iBatis的sqlMap配置文件的selectKey元素有个type属性,可以指定pre或者post表示前生成(pre)还是后生成(post). Oracle设置 <!-- Oracle SE ...
- SQL Server Mysql primary key可更新性分析
SQL Server: 一般来说SQL Server 中表的主键是支持更新操作的.但是如果这个主键是由identity(1,1)这类的方式生成的话它是不可更新的. Mysql : Mysql 中表的主 ...
- SQL Server Mysql 对null值理解的不同
在说到对null值的理解主要是用unique来体现的.也是说null在unique约束看来是一个值还是多个值的问题. 还是开始实验吧. MYSQL create table t(x int ,cons ...
随机推荐
- php数组函数-array_merge()
array_merge()函数把两个或多个数组合并为一个数组. 如果键名有重复,该键的键值为最后一个键名对应的值.如果数组是数字 索引,则键名会以连续方式重新索引. 注:如果仅仅向array_merg ...
- 20165101刘天野 2017-2018-2 《Java程序设计》第7周学习总结
#20165101刘天野 2017-2018-2 <Java程序设计>第7周学习总结 教材学习内容总结 第十一章JDBC与MySQL数据库 JDBC简介 JDBC(Java Databas ...
- 【计算机网络】OSI模型,TCPIP模型
今天给大家分享的是两种模型的主要区别,夜视比较容易混淆的地方.我尽力用图形的方式来说问题,这样比较好理解~ (PS:画图真的不会,正在认真学,希望多多包含:)) 一.二者的模型对比 (这个图有点丑.. ...
- SSH或者SSM开发web,mysql数据库,数据库配置文件配置不当~数据库读写数据乱码问题解决办法。
相信,大家都有遇到过在传入一个中文string,debug自己的每一行代码时,都发现始终是没有乱码的(即:排除了,源码文件的编码格式是没问题的),但是数据进入数据库之后就是乱掉了. 那么很明显问题就出 ...
- Spark常用算子-value数据类型的算子
package com.test; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; im ...
- JSON解析字符串
JSON解析字符串 JSON 解析字符串时,应按严格的标准,否则无法解析: str1 = '{"str":"string","number" ...
- Effective java第一章引言
菜鸟一枚,开始读第一本书<Effective Java>(第二版)~ 看引言就有好多名词不懂(>_<) 导出的API由所有可在定义该API的包之外访问的API元素组成.一个包的 ...
- 分开统计的sql写法
DECLARE @StartDate DATETIME= '2017-10-13 00:00:00';DECLARE @EndDate DATETIME= '2017-11-13 23:00:00'; ...
- BZOJ 2752 [HAOI2012]高速公路(road):线段树【维护区间内子串和】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2752 题意: 有一个初始全为0的,长度为n的序列a. 有两种操作: (1)C l r v: ...
- java:Writer/Reader字符流操作
字符流的操作: 字节流的操作,是直接映射文件的:file->文件 字符流的操作是需要存在缓存区的:file->缓冲区->文件 (中文处理,一般用字符流) public static ...