WPF 项目开发入门(一) 安装运行
WPF 项目开发入门(二) WPF 页面布局
WPF 项目开发入门(三)WPF 窗体与页面
WPF 项目开发入门(四) MVVM 模式 与 TreeView树组件
WPF 项目开发入门(五)ListView列表组件 与 Expander组件
WPF 项目开发入门(六)DataGrid组件
WPF 项目开发入门(七) From表单组件
WPF 项目开发入门(八)数据库驱动配置与数据库操作
WPF 项目开发入门(九)数据库连接 NHibernate使用
WPF 项目开发入门(十)DevExpress 插件+NHibernate登录
WPF 项目开发入门(十一)DevExpress 插件 Grid表格应用
NHibernate 是C#中使用的ORM数据插件可以简化数据库的操作与JAVA中的Hibernate一样。使用方法非常靠近JAVA 中Hibernate 的使用,对JAVA软件工程非常友好,JAVA开发人员可以更快更好的开发数据库功能。在NuGet中下载这两个驱动 FluentNHibernate ,NHibernate 。
创建ISessionFactory工厂的时候注意,我们使用的是Oracle.ManagedDataAccess 驱动,Fluently设置的时候也应该设置对应的Oracle.ManagedDataAccess 驱动配置,不能使用默认配置信息,默认配置信息走的是System.Data.OracleClient驱动。
- Driver: NHibernate.Driver.OracleManagedDataClientDriver
- Dialect:NHibernate.Dialect.Oracle10gDialect
static void Main(string[] args) {
string str = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.101.2.201)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ora10g)));Persist Security Info=True;User ID=jx_jmdj;Password=jx_jmdj;";
//获得ISessionFactory 工厂
//Driver<NHibernate.Driver.OracleManagedDataClientDriver>() 对应Oracle.ManagedDataAccess 驱动
//Dialect<NHibernate.Dialect.Oracle10gDialect>() 对应Oracle.ManagedDataAccess 驱动
ISessionFactory sf=Fluently.Configure().Database(
OracleDataClientConfiguration.Oracle10
.ConnectionString(str)
.Provider<NHibernate.Connection.DriverConnectionProvider>()
.Driver<NHibernate.Driver.OracleManagedDataClientDriver>()
.Dialect<NHibernate.Dialect.Oracle10gDialect>()
).
Mappings( x => x.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly()))
.BuildSessionFactory();
//获得数据库操作Session对象
ISession se=sf.OpenSession();
//Hibernate 经典操作接口之一SQL文接口
IList<Hashtable> list=
se.CreateSQLQuery("select * from sys_user")
.SetResultTransformer(Transformers.AliasToEntityMap)//设置数据集合为Hashtable K/V 建值对
.List<Hashtable>();
foreach (Hashtable row in list) {//取出数据
foreach (DictionaryEntry d in row)
{
string key = (string)d.Key;
Console.WriteLine("属性:{0},值:{1}", key, d.Value);
}
}
//关闭数据库
se.Close();
sf.Close();
}
4.1 Mapping配置类
在FluentNHibernate的模式下,使用ClassMap类来做NHibernate数据库映射配置。配置数据库表的映射关系到Hibernate中的POJO数据模型中来。
创建用户表
create table SYS_USER(
USER_ID NUMBER not null,
DEPT_ID NUMBER,
LOGIN_NAME NVARCHAR2(30),
USER_NAME NVARCHAR2(30),
PASSWORD NVARCHAR2(50)
)
创建Pojo类
- virtual Pojo 类中的属性类型必须是virtual 类型才能在ClassMap映射中生效。
//Pojo数据模型与数据库表关系配置
//必须继承ClassMap
public class UserMap :ClassMap<SysUserPojo>{
public UserMap(){
Table("SYS_USER");//映射表
//主键设置
Id(m => m.USER_ID).Column("USER_ID").GeneratedBy.Assigned();
// SysUserPojo 属性 对应表中属性
Map(m => m.DEPT_ID).Column("DEPT_ID");
Map(m => m.LOGIN_NAME).Column("LOGIN_NAME");
Map(m => m.USER_NAME).Column("USER_NAME");
Map(m => m.PASSWORD).Column("PASSWORD");
}
}
//创建Pojo数据模型类
public class SysUserPojo{
//对应表中数据属性
public virtual int USER_ID { get; set; }
public virtual int DEPT_ID { get; set; }
public virtual string LOGIN_NAME { get; set; }
public virtual string USER_NAME { get; set; }
public virtual string PASSWORD { get; set; }
}
NHibernate导入UserMap
NHibernate导入配置UserMap类,将SysUserPojo变成NHibernate配置类。在Fluently类中的Mappings方法中 m.FluentMappings.AddFromAssemblyOf()加入UserMap配置类。
FluentNHibernate.Cfg.Fluently.Configure().Database(
OracleDataClientConfiguration.Oracle10
.ConnectionString(str)
.Provider<NHibernate.Connection.DriverConnectionProvider>()
.Driver<NHibernate.Driver.OracleManagedDataClientDriver>()
.Dialect<NHibernate.Dialect.Oracle10gDialect>().ShowSql()
)
// 加入UserMap成为Hibernate中的POJO数据模型
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<UserMap>())
.ExposeConfiguration(f => f.SetInterceptor(new SqlSysLog()))
.BuildSessionFactory();
ClassMap 主键
.CustomSqlType(“VARCHAR2”);
Assigned: 自定义主键。
this.Id(m => m.USER_ID).Column("USER_ID").GeneratedBy.Assigned();
sequence :在DB2,Oracle, SAP DB, McKoi中使用序列(sequence)。
this.Id(x => x.USER_ID)
.Column("USER_ID")
.GeneratedBy
.SequenceIdentity("SEQ_Name");//oracle中 sequence 值
identity:对DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的内置标识字段提供支持。数据库返回的主键值 返回的标识符是int类型的。
this.Id(x => x.USER_ID).Column("USER_ID").GeneratedBy.Identity();
increment: 表主键必须是int类型。只有一个进程在同一张表中插入数据时才能使用。 在集群下不起使用
this.Id(x => x.USER_ID).Column("USER_ID").GeneratedBy.Increment();
UuidString: 表主键必须是字符串类型,自动生成字符串主键
this.Id(x => x.USER_ID).Column("USER_ID").GeneratedBy.UuidString()
4.2 NHibernate常用方法
CreateSQLQuery 方法
ISession se = sf.OpenSession();
Ilist<SysUserPojo> list=se.CreateSQLQuery(sql).AddEntity(typeof(SysUserPojo)).List<SysUserPojo>();
//返回的数据Ilist集合类型 可以使用ToList()方法转成List集合类型
List<SysUserPojo> ls=list.ToList()
Sava添加方法
ISession se = sf.OpenSession();
var txn = se.BeginTransaction();//开始事务
se.Save(obj);//保存数据库,必须是NHibernate 注册的Pojo(Mappings)
txn.Commit();//提交事务
SaveOrUpdate添加与修改
操作的时候用主键查询数据库表,如果没有这个主键的数据,执行添加数据,如果有这条数据,数据还发生了变化就执行修改。
ISession se = sf.OpenSession();
var txn = se.BeginTransaction();//开始事务
se.SaveOrUpdate(obj);//保存数据库,必须是NHibernate 注册的Pojo(Mappings)
txn.Commit();//提交事务
Update修改
ISession se = sf.OpenSession();
var txn = se.BeginTransaction();//开始事务
se.Update(obj);//修改数据模型
txn.Commit();//提交事务
Delete删除
ISession se = sf.OpenSession();
var txn = se.BeginTransaction();//开始事务
se.Delete(obj);//删除数据模型
txn.Commit();//提交事务
4.2 SQLite 内嵌式数据库
在C#工具中下载 System.Data.SQLite 内嵌式数据库驱动与数据库运行环境。
使用SQLite 驱动创建 SQLite在项目中的数据库,数据库文件以.db结尾
//创建项目文件夹地址 Environment.CurrentDirectory 例如 D:\项目\测试项目\bin\Debug 目录下
string Path = "Data Source =" + Environment.CurrentDirectory + "/zhtbs.db";
SQLiteConnection conn = new SQLiteConnection(Path);//创建数据库实例,指定文件位置
conn.Open();//打开数据库,若文件不存在会自动创建
string sql = "CREATE TABLE IF NOT EXISTS User(id integer, name varchar(20), dept varchar(2));";//建表语句
SQLiteCommand cmdCreateTable = new SQLiteCommand(sql, conn);
cmdCreateTable.ExecuteNonQuery();//如果表不存在,创建数据表
SQLiteCommand cmdInsert = new SQLiteCommand(conn);
cmdInsert.CommandText = "INSERT INTO User VALUES(1, '张**', '部门一')";//插入几条数据
cmdInsert.ExecuteNonQuery();
cmdInsert.CommandText = "INSERT INTO User VALUES(2, '李**', '部门一')";
cmdInsert.ExecuteNonQuery();
cmdInsert.CommandText = "INSERT INTO User VALUES(3, '王**', '部门一')";
cmdInsert.ExecuteNonQuery();
conn.Close();
SQLite在NHibernate中配置使用与 oracle一样
string Path = "test.db";
//SQLiteConfiguration.Standard.UsingFile 默认的地址是 例如 D:\项目\测试项目\bin\Debug 目录下
ISessionFactory sf = Fluently.Configure().Database(
SQLiteConfiguration.Standard.UsingFile(Path)
).BuildSessionFactory();
//获得数据库操作Session对象
ISession se = sf.OpenSession();
//Hibernate 经典操作接口之一SQL文接口
IList<Hashtable> list =
se.CreateSQLQuery("select * from User")
.SetResultTransformer(Transformers.AliasToEntityMap)//设置数据集合为Hashtable K/V 建值对
.List<Hashtable>();
foreach (Hashtable row in list){//取出数据
foreach (DictionaryEntry d in row){
string key = (string)d.Key;
Console.WriteLine("属性:{0},值:{1}", key, d.Value);
}
}//关闭数据库
se.Close();
sf.Close();
5 项目数据库公共类
在项目中创建一个工程包,工程包中定义数据库操作通用类,用于操作所有关于数据库操作的业务类。
1 原生数据源公共类
项目中设置一个原生数据源调用功能类,方便Dao业务程序调用。根据开发者具体业务情况来选择使用那种开发模式连接数据。
public class OracleDb{
static string str = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.101.2.201)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ora10g)));Persist Security Info=True;User ID=jx_jmdj;Password=jx_jmdj;";
static OracleConnection conn = null;
public static OracleConnection getConn() {
if (conn==null) {
conn = new OracleConnection(str);
conn.Open();
}
return conn;
}
public static void Close() {
if (conn!=null) {
conn.Close();
}
}
}
2 NHibernate公共类
public class HOracleDb{
static string str = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.101.2.201)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ora10g)));Persist Security Info=True;User ID=jx_jmdj;Password=jx_jmdj;";
private static ISessionFactory sessionFactory = null;
//NHibernate 基础配置方法
private static ISessionFactory
InitSessionFactory() {
return FluentNHibernate.Cfg.Fluently.Configure()
.Database(OracleDataClientConfiguration.Oracle10
.ConnectionString(str)
.Provider<NHibernate.Connection.DriverConnectionProvider>()
.Driver<NHibernate.Driver.OracleManagedDataClientDriver>()
.Dialect<NHibernate.Dialect.Oracle10gDialect>().ShowSql())
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<UserMap>())
.ExposeConfiguration(f => f.SetInterceptor(new SqlSysLog()))
.BuildSessionFactory();
}
private static ISessionFactory getSessionFactory{
get{
if (sessionFactory == null) {
sessionFactory = InitSessionFactory();
}
return sessionFactory;
}
}
public static ISession OpenSession() {
return getSessionFactory.OpenSession();
}
public static void OnClose(){
if (sessionFactory!=null) {
sessionFactory.Close();
}
}
public static void OnSeClose(ISession se){
if (se != null){
se.Close();
}
}
// 原生sql查询,生成IList<Hashtable>对象
public static IList<Hashtable> FindListSqlHt(string sql){
ISession se=null;
IList<Hashtable> list = null;
try{
se = HOracleDb.OpenSession();
list= se.CreateSQLQuery(sql)
.SetResultTransformer(Transformers.AliasToEntityMap)
.List<Hashtable>();
}
finally {
OnSeClose(se);
}
return list;
}
// 原生sql查询,生成IList<T>对象
public static IList<T> FindListSqlObj<T>(string sql){
ISession se = null;
IList<T> list = null;
try{
se = HOracleDb.OpenSession();
list= se.CreateSQLQuery(sql)
.AddEntity(typeof(T)).List<T>();
}
finally{
OnSeClose(se);
}
return list;
}
//添加数据Save到数据库
public static Object Save<T>(Object obj){
Object id = null;
ISession se = null;
try{
se = HOracleDb.OpenSession();
var txn = se.BeginTransaction();
id = se.Save(obj);
txn.Commit();
}finally {
if (se!=null) {
se.Close();
}
}
return id;
}
//修改数据库表内容
public static void Update<T>(Object obj){
ISession se = null;
try{
se = HOracleDb.OpenSession();
var txn = se.BeginTransaction();
se.Update(obj);
txn.Commit();
}
finally{
if (se != null){
se.Close();
}
}
}
//删除数据库表内容
public static void Delete<T>(Object obj){
ISession se = null;
try{
se = HOracleDb.OpenSession();
var txn = se.BeginTransaction();
se.Delete(obj);
txn.Commit();
}
finally{
if (se != null) {
se.Close();
}
}
}
//条件与删除数据库表内容
public static void SaveOrUpdate<T>(Object obj){
ISession se = null;
try{
se = HOracleDb.OpenSession();
var txn = se.BeginTransaction();
se.SaveOrUpdate(obj);
txn.Commit();
}
finally{
if (se != null){
se.Close();
}
}
}
}
Sql日志打印类
public class SqlSysLog : EmptyInterceptor{
//重载 日志输出
public override NHibernate.SqlCommand.SqlString
OnPrepareStatement(NHibernate.SqlCommand.SqlString sql){
System.Diagnostics.Trace.WriteLine(sql.ToString());
return sql;
}
}