MVC设计模式---数据库单例设计 实现用户的登录、注册

目录

一:单例设计模式 适应范围

二:单例设计模式 优缺点

三:MVC设计模式 简单介绍

四:MVC设计模式 案例源码


一:单例设计模式 适应范围

单例模式可以保证:

在一个应用程序中,一个类有且只有一个实例,并提供一个访问它的全局访问点

在程序设计过程中,有很多情况需要确保一个类只有一个实例

二:单例设计模式 优缺点

优点:

该实现是一个"懒汉"单例模式,意味着只有在第一次调用GetInstance()静态方法的时候才进

行内存分配

如果整个程序不调用该静态方法,则不会分配内存 相对应的是"饿汉"单例模式

缺点:

1."懒汉"模式虽然有优点,但是每次调用GetInstance()静态方法时,必须判断NULL ==

m_instance,使程序相对开销增大

2.由于使用指针动态内存分配,我们必须在程序结束时,手动的调用ReleaseInstance()静态方法,进行内存的释放

3. 教科书标准实现最大的缺点是线程不安全

    根据该模式的定义,整个应用程序中,不管是单线程,还是多线程,都只能有且只有该类的一个实例

     而在多线程中会导致多个实例的产生,从而导致运行代码不正确以及内存的泄露

三:MVC设计模式 简单介绍

MVC的英文全称为Model-View-Controller,

即把一个信息系统的应用按照模型(Model)、视图(View)、控制器(Controller)的方式进行分离,

这样一个应用就被分成三层:模型层、视图层和控制层

通过视图层去操作控制器(将数据信息传输给控制器),由控制器去找到对应的模型,在模型中去访问数据库,数据库返回出来的结果通过模型返回给控制器,再将控制器中的数据返回给视图层 

四:MVC设计模式 案例源码

mysqlite.h .cpp

数据库【数据处理

#ifndef MYSQLITE_H
#define MYSQLITE_H

#include"sqlite3.h"
#include<QString>//定义用户名密码

class mySqlite
{
public:
    static mySqlite *getInstance(char *dataBaseName);//公有的静态的获取类对象指针的方法

    static void createUserTable(char *tableName);//建表

    static int getData(const char *sql,char **&result,int &row,int &col);

    sqlite3 *getAppDataBase();//获取数据库对象

private:

    mySqlite(char *dataBaseName);//构造函数私有化
    ~mySqlite();

    static mySqlite *PdataBase;//私有的静态的类对象指针

    sqlite3 *appDataBase;//数据库指针
};


#endif // MYSQLITE_H
#include "mysqlite.h"
#include<QDebug>

mySqlite *mySqlite::PdataBase = nullptr;//类对象指针

mySqlite *mySqlite::getInstance(char *dataBaseName)
{
    if(mySqlite::PdataBase == nullptr)
    {
        mySqlite::PdataBase = new mySqlite(dataBaseName);
    }
    return mySqlite::PdataBase;
}

void mySqlite::createUserTable(char *tableName)
{
       char *zErrMsg = 0;
       QString createTablesql=QString("CREATE TABLE if not exists %1(\
                                      userID integer  primary key autoincrement,\
                                      userName text not null,\
                                      userPasswd text not null\
                                      );").arg(tableName);
       int  rc=sqlite3_exec(PdataBase->appDataBase, createTablesql.toStdString().c_str(), nullptr, 0, &zErrMsg);
       if( rc != SQLITE_OK )
       {
           qDebug()<<zErrMsg;
           qDebug()<<createTablesql;
       }
       else
       {
           qDebug()<<tableName<<"table created successfully!";
       }
}

int mySqlite::getData(const char *sql, char **&result, int &row, int &col)
{
     char *errmsg = 0;
     int ret = sqlite3_get_table(PdataBase->appDataBase,sql,&result,&row,&col,&errmsg);
     if(ret != SQLITE_OK)
     {
        qDebug()<<sqlite3_errmsg(PdataBase->appDataBase);
        qDebug()<<sqlite3_errcode(PdataBase->appDataBase);
     }
     return 0;
}

sqlite3 *mySqlite::getAppDataBase()
{
    return this->appDataBase;
}

mySqlite::mySqlite(char *dataBaseName)
{
    //打开数据库
    int ret = sqlite3_open(dataBaseName,&appDataBase);//数据库不存在自动创建
    if(ret)
    {
        qDebug()<<"Can't open DataBase";
        qDebug()<<sqlite3_errmsg(appDataBase);
        exit(0);
    }
    else
    {
        qDebug()<<"Open"<<dataBaseName<<"successfully!";
    }
}

mySqlite::~mySqlite()
{
    //关闭数据库
    sqlite3_close(appDataBase);
}

widget.h .cpp

视图层

#include"mycontroller.h"

//视图层中定义控制器
myController *pusercontroller;

void Widget::goLoginSlot()
{
    qDebug()<<"点击登录";//测试

    //获取 编辑框内容
    //获取输入的用户名
    QString username = userEdit->text();
    //qDebug()<<username; //测试
    //获取输入的密码
    QString userpwd = pwdEdit->text();
   //视图层
   int ret1 = pusercontroller->findUserModelByUserName(username);
   if(ret1 == 0)
   {
       qDebug()<<"登录成功";
   }
   else
   {
       qDebug()<<"登录失败";
   }
}

mycontroller.h .cpp

控制层

#ifndef MYCONTROLLER_H
#define MYCONTROLLER_H
#include<QString>
#include"mymodel.h"

class myController
{
public:
    //静态的公有的获取类对象指针的方法
    static myController*getIntance();
    //控制器->模型
    int findUserModelByUserName(QString username);
private:
    //构造函数私有化
    myController();
    //定义一个静态的类对象指针
    static myController*pmyController;
    //定义一个模型对象
    myModel *pusermodel;
};

#endif // MYCONTROLLER_H
#include "mycontroller.h"
#include<QDebug>

myController*myController::pmyController = nullptr;

myController *myController::getIntance()
{
    if(myController::pmyController == nullptr)
    {
        myController::pmyController = new myController;
    }
    return myController::pmyController;
}

int myController::findUserModelByUserName(QString username)
{
    qDebug()<<"findUserModelByUserName";
    //通过用户名查找数据库里的内容
    return pusermodel->getUserModelByUserName(username);
}

myController::myController()
{
    pusermodel = myModel::getIntance();
}

mymodel.h .cpp

模型层

#ifndef MYMODEL_H
#define MYMODEL_H
#include"mysqlite.h"
#include<QString>
class myModel
{
public:
    //静态公有获取类对象指针的方法  模型--get方法
    static myModel*getIntance();

    int getUserModelByUserName(QString username);
private:
    //构造函数私有化
    myModel();
    //静态私有的类对象指针
    static myModel*pmyModel;
    //数据库对象
    mySqlite *appdb;
};

#endif // MYMODEL_H
#include "mymodel.h"
#include<QDebug>

myModel*myModel::pmyModel = nullptr;

myModel *myModel::getIntance()
{
    if(myModel::pmyModel == nullptr)
    {
        myModel::pmyModel = new myModel;
    }
    return myModel::pmyModel;
}

int myModel::getUserModelByUserName(QString username)
{
    qDebug()<<"getUserModelByUserName";
    //模型操作数据库
    char **result = nullptr;
    int nRow = 0;
    int nCol = 0;
    QString selectUser = QString("select userName from user where userName = '%1'").arg(username);
    int ret = mySqlite::getData(selectUser.toLatin1(),result,nRow,nCol);
    if(ret ==0)
    {
        qDebug()<<"nRow"<<nRow;
        if(nRow == 0)
        {
            qDebug()<<"该用户不存在";
        }
        else
        {
            qDebug()<<"该用户存在";
            return 0;
        }
    }
    else
    {
        return -1;
    }
}

myModel::myModel()
{
    //获取数据库对象指针
    appdb = mySqlite::getInstance("app.db");
}

实现结果:视图中不进行数据库的相关操作【小翻车,不过后来解决啦

程序异常结束,没有进入getUserModelByUserName函数中

这个地方我想了好久,代码就先不改,如果能够自己看出来哪里有问题的,是对能力的一次锻炼

当然实在解决不了这个程序异常结束,可以看以下两个解决方法,更推荐方法一!

问题已经解决!!!

方法一

方法二

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

chenruhan_QAQ_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值