WPF 项目开发入门(九)数据库连接 NHibernate使用

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;
    }
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zht_bs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值