本来是学习java的,最近开始学习了C#.因为对java的hibernate颇有了解,所以就利用C#写了这个面向对象的SQL处理插件。
具体是这样是用的:
首先建立一个数据库DataBaseTest(此数据库只是用来测试)
表1 Test1
Id int 主键 自增长
Name varchar(50) 非空
TId 外键 引用 Test2 的 Id
表2 Test2
Id int 主键 自增长
Value varchar(50)非空
TId 外键 引用 Test3 的 Id
表3 Test3
Id int 主键 自增长
Test varchar(50)
首先先写好3个实体类:
//Test1
using System;
namespace DataBaseTest
{
public interface ITest1
{
int Id { get; set; }
string Name { get; set; }
ITest2 TId { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DataBaseTest
{
[Serializable]
public class Test1 : DataBaseTest.ITest1
{
private Int32 _id;
public Int32 Id
{
get { return _id; }
set { _id = value; }
}
private String _name;
public String Name
{
get { return _name; }
set { _name = value; }
}
private ITest2 _tId;
public ITest2 TId
{
get { return _tId; }
set { _tId = value; }
}
}
}
//Test2
using System;
namespace DataBaseTest
{
public interface ITest2
{
int Id { get; set; }
ITest3 TId { get; set; }
string Value { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DataBaseTest
{
[Serializable]
public class Test2 : DataBaseTest.ITest2
{
private Int32 _id;
public Int32 Id
{
get { return _id; }
set { _id = value; }
}
private String _value;
public String Value
{
get { return _value; }
set { _value = value; }
}
private ITest3 _tId = new Test3();
public ITest3 TId
{
get { return _tId; }
set { _tId = value; }
}
}
}
//Test3
using System;
namespace DataBaseTest
{
public interface ITest3
{
int Id { get; set; }
string Test { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DataBaseTest
{
[Serializable]
public class Test3 : DataBaseTest.ITest3
{
private Int32 _id;
public Int32 Id
{
get { return _id; }
set { _id = value; }
}
private String _test;
public String Test
{
get { return _test; }
set { _test = value; }
}
}
}
接下来要写一个Mapping类 名字可以随意 但是必须继承Org.Shouchan.Hibernate.Data.AbsMapping 或者实现 Org.Shouchan.Hibernate.Data.IMapping
//Mapping
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Org.Shouchan.Hibernate.Data;
namespace DataBaseTest
{
public class Mapping : AbsMapping
{
private static IColumn _test1 = new Column(new Param<Int32>(EKey.MASTER_ATO_KEY, "Id", System.Data.SqlDbType.Int, 0, true, null),
new Param<String>(EKey.PARAM, "Name", System.Data.SqlDbType.VarChar, 50, true, null),
new Param<ITest2, Test2>(EKey.OUT_KEY, "TId", System.Data.SqlDbType.Int, 0, true, "Id"));
public static IColumn Test1
{
get { return Mapping._test1; }
set { Mapping._test1 = value; }
}
private static IColumn _test2 = new Column(new IOutKey[]{new OutKey<ITest1,Test1>()},
new Param<Int32>(EKey.MASTER_ATO_KEY, "Id", System.Data.SqlDbType.Int, 0, true, null),
new Param<String>(EKey.PARAM, "Value", System.Data.SqlDbType.VarChar, 50, true, null),
new Param<ITest3, Test3>(EKey.OUT_KEY, "TId", System.Data.SqlDbType.Int, 0, true, "Id"));
public static IColumn Test2
{
get { return Mapping._test2; }
set { Mapping._test2 = value; }
}
private static IColumn _test3 = new Column(new IOutKey[] { new OutKey<ITest2, Test2>() },
new Param<Int32>(EKey.MASTER_ATO_KEY, "Id", System.Data.SqlDbType.Int, 0, true, null),
new Param<String>(EKey.PARAM, "Test", System.Data.SqlDbType.VarChar, 50, false, null));
public static IColumn Test3
{
get { return Mapping._test3; }
set { Mapping._test3 = value; }
}
}
}
//注:Mapping类必须有static Icolumn类型 并且与前面实体类同名的属性
现在准备工作就都已经完成了 接下来就可以做测试了
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using Org.Shouchan.Hibernate.Data;
namespace DataBaseTest
{
class Program
{
static void Main(string[] args)
{
SqlConnection connection = new SqlConnection();
connection.ConnectionString = @"Data Source=SHOUCHAN-PC/VAIO_VEDB;Initial Catalog=DataBaseTest;Integrated Security=True";
//查找
ISelect<Mapping, ITest1> seT1 = new Select<Mapping, ITest1, Test1>(connection);
ISelect<Mapping, ITest2> seT2 = new Select<Mapping, ITest2, Test2>(connection);
ISelect<Mapping, ITest3> seT3 = new Select<Mapping, ITest3, Test3>(connection);
//seT1.AtoCheck = [Boolean] 设置 是否自动检查错误,自动检查错误时如果发现存在错误就会自动停止执行查找操作!
//seT1.AtoConnectionClose = [Boolean] 设置是否自动关闭connection
//seT1.Columns = [string[]] 设置要查找的列,不设置为 * ,推荐使用seT1.SetColumns(param string) 方法!
//seT1.ConvertParams = [IConvertParam[]] 设置CONVERT可以对列进行强转,在操作日期类型的列时,很常用,推荐使用seT1.SetConvertParam(param ConvertParam) 方法!
//seT1.DispNull = [Boolean] 设置为空时是以null返回 还是返回一个实例华的实体类
//seT1.OrderBies = [IOrderBy[]] 设置排序,推荐使用seT1.SetOrderBy(param IOrderBy) 方法!
//seT1.GetAllValue = [Boolean] 设置是否把外键的表全部调取出来!
//seT1.PageSize = [long] 设置查找多少
//seT1.Page = [IPage] 与seT1.PageSize结合使用 实现分页!
//seT1.SelectParams = [ISelectParam[]] 设置查询的条件,推荐使用seT1.SetSelectParam(param SelectParam) 方法!
seT1.SetSelectParams(new SelectParam(Mapping.Test1["Id"],ETerms.EQ,1));
ITest1 t1 = seT1.GetValue();
System.Console.WriteLine("Test1:" + t1.Id + "/t" + t1.Name + "/n外键TId:(Test2)" + t1.TId.Id + "/t" + t1.TId.Value + "/n外键TId:(Test3)" + t1.TId.TId.Id + "/t" + t1.TId.TId.Test);
System.Console.WriteLine("SQL:/n" + seT1.Sql);
//插入
IInsert<Mapping, ITest1> inT1 = new Insert<Mapping, ITest1, Test1>(connection);
IInsert<Mapping, ITest2> inT2 = new Insert<Mapping, ITest2, Test2>(connection);
IInsert<Mapping, ITest3> inT3 = new Insert<Mapping, ITest3, Test3>(connection);
ITest3 t3 = new Test3();
t3.Test = "test2";
inT3.Entity = t3;
inT3.Add();
Console.WriteLine("执行插入t3的SQL语句:");
Console.WriteLine(inT3.Sql);
ITest2 t2 = new Test2();
t2.Value = "Value2";
seT3.SetSelectParams(new SelectParam(Mapping.Test3["Id"],2));
t2.TId = seT3.GetValue();
inT2.Entity = t2;
inT2.Add();
Console.WriteLine("执行插入t2的SQL语句:");
Console.WriteLine(inT2.Sql);
t1 = new Test1();
t1.Name = "Name2";
seT2.SetSelectParams(new SelectParam(Mapping.Test2["Id"], 2));
t1.TId = seT2.GetValue();
inT1.Entity = t1;
inT1.Add();
Console.WriteLine("执行插入t1的SQL语句:");
Console.WriteLine(inT1.Sql);
//察看数据库是否有更新
IList<ITest1> liT1 = seT1.GetValues();
foreach (ITest1 tii in liT1)
{
System.Console.WriteLine("Test1:" + tii.Id + "/t" + tii.Name + "/n外键TId:(Test2)" + tii.TId.Id + "/t" + tii.TId.Value + "/n外键TId:(Test3)" + tii.TId.TId.Id + "/t" + tii.TId.TId.Test + "/n------------------------");
}
//更新
IUpdate<Mapping, ITest1> upT1 = new Update<Mapping, ITest1, Test1>(connection);
IUpdate<Mapping, ITest2> upT2 = new Update<Mapping, ITest2, Test2>(connection);
IUpdate<Mapping, ITest3> upT3 = new Update<Mapping, ITest3, Test3>(connection);
seT3.SetSelectParams(new SelectParam(Mapping.Test3["Id"],1));
t3 = seT3.GetValue();
t3.Test = "UpdateTest";
upT3.Entity = t3;
upT3.Upd();
Console.WriteLine("执行更新t3的SQL语句:");
Console.WriteLine(upT3.Sql);
seT2.SetSelectParams(new SelectParam(Mapping.Test2["Id"], 2));
t2 = seT2.GetValue();
t2.Value = "UpdateValue";
upT2.Entity = t2;
upT2.Upd();
Console.WriteLine("执行更新t2的SQL语句:");
Console.WriteLine(upT2.Sql);
seT1.SetSelectParams(new SelectParam(Mapping.Test1["Id"], 2));
t1 = seT1.GetValue();
t1.Name = "UpdateName";
upT1.Entity = t1;
upT1.Upd();
Console.WriteLine("执行更新t1的SQL语句:");
Console.WriteLine(upT1.Sql);
//察看数据库是否有更新
liT1 = seT1.GetValues();
foreach (ITest1 tii in liT1)
{
System.Console.WriteLine("Test1:" + tii.Id + "/t" + tii.Name + "/n外键TId:(Test2)" + tii.TId.Id + "/t" + tii.TId.Value + "/n外键TId:(Test3)" + tii.TId.TId.Id + "/t" + tii.TId.TId.Test + "/n------------------------");
}
//删除(如果有外键,只要在Mapping中设置好,就可以了,那么就不用先删除外键表了,所以只要删除Test3表,那么就会自动先删除外键的表,不用先删除Test1然后再删除Test2最后才能删除Test3)
IDelete<Mapping, ITest1> deT1 = new Delete<Mapping, ITest1, Test1>(connection);
IDelete<Mapping, ITest2> deT3 = new Delete<Mapping, ITest2, Test2>(connection);
IDelete<Mapping, ITest3> deT3 = new Delete<Mapping, ITest3, Test3>(connection);
seT3.SetSelectParams(new SelectParam(Mapping.Test3["Id"],1));
t3 = seT3.GetValue();
deT3.Entity = t3;
deT3.Del();
Console.WriteLine("执行删除t3的SQL语句:");
Console.WriteLine(deT3.Sql);
//察看数据库是否有更新
liT1 = seT1.GetValues();
foreach (ITest1 tii in liT1)
{
System.Console.WriteLine("Test1:" + tii.Id + "/t" + tii.Name + "/n外键TId:(Test2)" + tii.TId.Id + "/t" + tii.TId.Value + "/n外键TId:(Test3)" + tii.TId.TId.Id + "/t" + tii.TId.TId.Test + "/n------------------------");
}
}
}
}
这些是基本功能,关于高级操作下次连载。。。。。。。。。。。。。。
希望大家提供宝贵的意见!
提取插件: