PhotonServer(二)——MySql数据库的连接与映射

重要的事情说三遍:

MySQL数据库的连接与映射,有两种方式:(1)利用MySql.Data.dll库直接连接,用SQL语句直接操作;(2)利用Nhibernate第三方插件进行映射数据库,进行操作。

MySQL数据库的连接与映射,有两种方式:(1)利用MySql.Data.dll库直接连接,用SQL语句直接操作;(2)利用Nhibernate第三方插件进行映射数据库,进行操作。

MySQL数据库的连接与映射,有两种方式:(1)利用MySql.Data.dll库直接连接,用SQL语句直接操作;(2)利用Nhibernate第三方插件进行映射数据库,进行操作。

图更直接:

PhotonServer(二)——MySql数据库的连接与映射

MySql数据库安装就不介绍了,32位系统和64位系统下载对应安装包,下载官方:https://dev.mysql.com/downloads/mysql/

MySql.Data.dll库直接连接数据库

首先,创建一个和数据库操作类,我这里用单例。

引用MySql.Data.dll库,可以在NuGet下载,也可以从官网下载引用:https://dev.mysql.com/downloads/windows/installer/8.0.html

定义了数据库连接配置和数据连接后返回的类型conn

 class MySqlConnectionHelper
    {
        private static MySqlConnectionHelper instance;
        public static MySqlConnectionHelper Instance
        {
            get
            {
                if (instance == null)
                    instance = new MySqlConnectionHelper();
                return instance;
            }
        }
        //连接数据库的配置
        private String connetStr = "server=127.0.0.1;port=3306;User Id=root;password=root; database=work;";
        private MySqlConnection conn;
    }

其次,做数据库连接操作,插入数据,(注意:数据库每操作一次,打开操作完就要关闭

?

  public void Insert(User user, Action<string> callBack)
        {   
            try
            {
                string userName = user.Username;
                string userPassword = user.Password;
                DateTime registerdate = user.Registerdate;
                //连接数据库
                 conn = new MySqlConnection(connetStr);
                conn.Open();//打开

                #region 插入
                //插入数据库语句
                string insert_sql = "insert into ar_user(Username,Password,Registerdate) values(‘" + userName + "‘,‘" + userPassword + "‘,‘" + registerdate + "‘)";
                MySqlCommand cmd = new MySqlCommand(insert_sql, conn);
                if (cmd.ExecuteNonQuery() > 0) //cmd.ExecuteNonQuery()执行后会插入成功
                {
                    callBack("successfully");
                    callBack("数据插入成功");
                }
                else
                {
                    callBack("failly");
                }
                cmd.Dispose();
                #endregion
                conn.Close();
            }
            catch (MySqlException ex)
            {
                switch (ex.Number)
                {
                    case 0:
                        RemoteServer.log.Info("Cannot connect to server.  Contact administrator");
                        break;
                    case 1045:
                        RemoteServer.log.Info("Invalid username/password, please try again");
                        break;
                }
            }
        }

再次,做数据更新

   public void Updata(User user, Action<string> callBack)
        {
            try
            {
                //建立DataSet对象(相当于建立前台的虚拟数据库)
                DataSet ds = new DataSet();
                //建立DataTable对象(相当于建立前台的虚拟数据库中的数据表)
                DataTable dtable;
                //建立DataRowCollection对象(相当于表的行的集合)
                DataRowCollection coldrow; //行
                //建立DataRow对象(相当于表的列的集合)
                DataRow drow;  //列
                string userName = user.Username;
                string userPassword = user.Password;
                //查询语句
                string select_sql = "select Id,Username,Password from ar_user";
                 conn = new MySqlConnection(connetStr);
                conn.Open();//打开
                //建立数据库执行对象
                 MySqlCommand cmd = new MySqlCommand(select_sql, conn);
                //建立执行后的数据对象
                MySqlDataAdapter msda = new MySqlDataAdapter(cmd);
                ///建立 CommandBuilder 对象来自动生成 DataAdapter 的 Command 命令,否则就要自己编写
                //Insertcommand ,deletecommand , updatecommand 命令。
                MySqlCommandBuilder mySqlCmdBuilder = new MySqlCommandBuilder(msda);
                //将查询的结果存到虚拟数据库ds中的虚拟表tab_user中
                msda.Fill(ds, "tab_user");
                //将数据表tab_user的数据复制到DataTable对象(取数据)
                dtable = ds.Tables["tab_user"];
                //用DataRowCollection对象获取这个数据表的所有数据行
                coldrow = dtable.Rows;
                //遍历
                for (int i = 0; i < coldrow.Count; i++)
                {
                    drow = coldrow[i];
                    string name_msg = drow["Username"].ToString();
                    RemoteServer.log.Info(userName + " : " + name_msg);
                    if(userName.Equals(name_msg))
                    {
                        drow["Password"] = userPassword;
                        msda.Update(ds, "tab_user");//用此方法,一定要从数据库表拿带有主键的数据
                        callBack("passord Updata successful");
                        break;
                    }
                }
                cmd.Dispose();
               conn.Close();

            }
            catch (MySqlException ex)
            {
                switch (ex.Number)
                {
                    case 0:
                        RemoteServer.log.Info("Cannot connect to server.  Contact administrator");
                        break;
                    case 1045:
                        RemoteServer.log.Info("Invalid username/password, please try again");
                        break;
                }
            }
        }

注意上边两种数据处理方式:数据库操作方式都一样,需要增、删、改、查,只需要改sql查询语句就可以,会返回对应的操作。需要注意上边两个方法采用了不通的数据处理方式,插入数据方法中,采用了用sql语句直接执行插入数据操作。数据更新采用的是Sql语句都用Select查询语句,需要增删改查,都引进了DataSet、DataTable、DataRowCollection、DataRow虚拟表的类,得到的数据MySqlDataAdapter,用MySqlCommandBuilder绑定,对数据虚拟表数据进行增删改查,最后只需msda.Update(ds, "tab_user");把虚拟表中数据更新到数据库中。

利用Nhibernate第三方插件进行映射数据库

引用MySql.Data.dll库和Nhibernate.dll库 ?https://nhibernate.info/

映射数据库配置文件:创建名为hibernate.cfg.xml,名字是固定的,不能自定义,

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory>
    <!--设置的数据库类型,一般都是关系型不用变-->
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
    <!--设置数据库版本-->
    <property name="dialect">NHibernate.Dialect.MySQL8Dialect</property>
    <!--设置使用什么数据库-->
    <property name="connection.driver_class">NHibernate.Driver.MySqlDataDriver</property>
    <!--连接数据库-->
    <property name="connection.connection_string">Server=127.0.0.1;Port=3306;User Id=root;password=root;database=work;</property>

    <property name="show_sql">true</property>   
  </session-factory>
</hibernate-configuration>

配置文件属性设置

PhotonServer(二)——MySql数据库的连接与映射

数据表字段和实体类属性映射

数据表对应的实体类:

 class User
    {
        public virtual int Id { get; set; }
        public virtual string Username { get; set; }//用户名
        public virtual string Password { get; set; }//密码
        public virtual DateTime Registerdate { get; set; }//s注册时间
    }

创建对应的映射配置文件,命名User.hbm.xml? ? User可以自定义,一般都和类名一致。如果自定义,要在读取的地方输入名字路径

<?xml version="1.0" encoding="utf-8" ?>
<!--一个数据表对应一个类对应一个映射配置文件-->

<!--assembly:模型所在的程序集-->
<!--namespace:表示User这个类在那个命名空间下的那个文件内-->
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="AR_RemoteServer"
                   namespace="AR_RemoteServer.Model">

  <class name="User" table="ar_user">
    <!--表示User这个类跟数据库里面的user表对应-->
    <id name="Id" column="Id" type="Int32">
      <!--id name配置User类里面主键的映射,column表示跟数据库中哪个主键对应,type类型-->
      <generator class="native"> </generator>
      <!--generator表示一个生成器(自动增长),class指定generator的类型,native表示使用数据库自带的生成器-->
    </id>
    <!--其他类型用property配置,主键特殊用Id标签配置-->
    <property name="Username" column="Username" type="String"> </property>
    <property name="Password" column="Password" type="String"> </property>
    <property name="Registerdate" column="Registerdate" type="Date"></property>
  </class>
</hibernate-mapping>

配置文件属性设置,设置不复制,嵌入的资源,就打包在程序里面了

PhotonServer(二)——MySql数据库的连接与映射

创建配置读取,映射关系解析类NhibernateHelper

   class NhibernateHelper
    {
        private static ISessionFactory _sessionFactory;
        private static ISessionFactory SessionFactory
        {
            get
            {
                if (_sessionFactory == null)
                {
                    var configuration = new Configuration();
                    configuration.Configure();//解析nhibernate.cfg文件,也可以指定路径
                    configuration.AddAssembly("AR_RemoteServer");//解析各种映射文件

                    _sessionFactory = configuration.BuildSessionFactory();
                }
                return _sessionFactory;
            }
        }

        public static ISession OpenSession()
        {
            return SessionFactory.OpenSession();//打开一个数据库会话
        }  
    }

创建数据操作管理类UserManager

  interface IUserManager {

        void Add(User ser);
        void Update(User user);//更新数据
        void Remove(User user); //删除数据
        User GetById(int id); //根据ID获取数据
        User GetByUsername(string username); //根据username获取数据
        ICollection<User> GetAllUsers();  //获取所有数据
        bool VerifyUser(string username, string password);//验证用户密码

    }

    class UserManager : IUserManager
    {
        public void Add(User user)
        {
            using (ISession session = NhibernateHelper.OpenSession())
            {
                using (ITransaction transaction = session.BeginTransaction())
                {
                    //进行操作
                    session.Save(user);
                    transaction.Commit();//事物的提交
                }
            }
        }

        public ICollection<User> GetAllUsers()
        {
            
        }

        public User GetById(int id)
        {
           
        }

        public User GetByUsername(string username)
        {
            
        }

        public void Remove(User user)
        {
            using (ISession session = NhibernateHelper.OpenSession())
            {
                using (ITransaction transaction = session.BeginTransaction())//事务的开始
                {
                    //进行操作
                    session.Delete(user);//删除数据
                    transaction.Commit();//事物的提交
                }
            }
        }

        public void Update(User user)
        {
            
        }
        //检查数据是否存在数据库
        public bool VerifyUser(string username, string password)
        {
            using (ISession session = NhibernateHelper.OpenSession())
            {
                IList<User> users = session.CreateCriteria(typeof(User)).List<User>();
                User user = session.CreateCriteria(typeof(User))
                          .Add(Restrictions.Eq("Username", username))
                          .Add(Restrictions.Eq("Password", password))
                          .UniqueResult<User>();
                if (user == null) return false;
                return true;
            }
        }
    }

最后:需要什么自己可以扩展。一定要朱阿姨配置表中的相关字段和你安装的要对应。

PhotonServer(二)——MySql数据库的连接与映射

上一篇:Python urllib与urllib2


下一篇:Effective C++条款01: 视C++为一个语言联邦