数据库单例类总结(笔记)

数据库单例类总结

数据库单例类总结

适用于SQLite

单例模式(使用单个类实现)
为了防止外部的对象对其进行实例化操作=>  构造函数 提高权限为protect private
1.定义静态的类指针       //sql* sql::pSql = NULL;   用于sql类源文件中
2.定义QSqlDatabase类型的静态对象  //QSqlDatabase sql::staticDB;  用于数据库的打开
3.Instance(filename)//返回实例化的数据库
4.CreateTable() //创建/打开user表
//sql.h文件中
class sql
{
public:
    sql();
    sql(const QString& filename);//打开某个数据库
    ~sql();
    
    static sql* Instance(const QString &filename); //提供一个共有的静态函数接口//返回实例
    //数据库表操作接口
    bool CreateTable();  //创建/打开表
    //编辑表内容-具体方法
    void get_UserInformation(const QString &username);
    bool InsertData(QString tablename, QString username, QString pwd);
    bool logincheck(QString name, QString pwd);
    bool Usernamecheck(QString name);
    
private:

    static sql* pSql;
    static QSqlDatabase staticDB;
};
//sql.cpp文件中

sql* sql::pSql = NULL;//数据库对象静态成员初始化(类/对象)
QSqlDatabase sql::staticDB;//(数据库类型的变量)

sql::sql(const QString &filename)
{
    //打开/创建 数据库
    staticDB  = QSqlDatabase::addDatabase("QSQLITE");
    staticDB.setDatabaseName(filename);
    staticDB.open();
    //创建表
    if(this->CreateTable())
    {
        qDebug() << "create table success!";
    }
}

sql::~sql()
{
    staticDB.close();
}

sql* sql::Instance(const QString &filename)//实例化
{
    if(NULL == pSql)//指针为空则实例化(新建)数据库
    {
        pSql = new sql(filename);
    }
    return pSql;//返回实例
}

//// 数据库表操作接口 ////
bool sql::CreateTable()//在数据库中创建/打开user表
{
    QSqlQuery SqlQuery(staticDB);
    //判断表是否存在
    QString create_sql = "create table if not exists user(name text,pwd text);";
    if(!SqlQuery.exec(create_sql))//.exec()执行成功返回值为1
    {
        qDebug() << "fail to create table" << SqlQuery.lastError();
        return false;
    }else
    {
        qDebug() << "create table success!";
        return true;
    }
}

/////////////  编辑表内容-具体方法  ///////////////////
bool sql::logincheck(QString name, QString pwd)//登录验证
{
    QSqlQuery SqlQuery;
    qDebug() << "NAME:" << name;//userNameEdit->text();
    qDebug() << "PWD:" << pwd;//pwdEdit->text();

    QString select_sql = QString("select * from user where name = '%1' and pwd = '%2';").arg(name).arg(pwd);

    if(!SqlQuery.exec(select_sql))
    {
        qDebug() << "user do not exist!" << SqlQuery.lastError();
        return false;
    }else
    {
        qDebug() << "SqlQuery.exec()";

        QString username;
        QString userpwd;

        while(SqlQuery.next())
        {
            username = SqlQuery.value(1).toString();
            userpwd = SqlQuery.value(2).toString();
        }
        if(username==NULL)
        {
            return false;
        }else
            return true;

    }
}
bool sql::InsertData(QString tablename, QString username, QString pwd)//插入数据
{
    QSqlQuery sqlQuery(staticDB);
    QString sql = QString("insert into %1 values('%2','%3')").arg(tablename).arg(username).arg(pwd);
    qDebug() << "insert data";
    if(!sqlQuery.exec(sql))
    {
        qDebug()<<"Failed to insert table:"<<sqlQuery.lastError();
    }
    else
    {
        qDebug()<<"success to insert";
    }
}

实际应用:

1.sql* pusersql; //目标类Register中 public:下添加sql*类指针 
2.this->pusersql = sql::Instance("userinfo.db");//目标类构造函数中进行数据库实例化
3.this->pusersql->Usernamecheck(ui->Rname_lineEdit->text().toAscii()); //通过 sql*类指针 调用sql单例类中方法及属性 进行登录验证/添加用户等等操作

//Register.h 

class Register : public QWidget
{
    Q_OBJECT
public:
    explicit Register(QWidget *parent = 0);
    ~Register();

    sql* pusersql;   ////添加sql*类指针 -作为成员属性
private slots:
    void on_Register_Button_clicked();

};
//Register.cpp

Register::Register(QWidget *parent) :
    QWidget(parent)
{
    allwidgetpoint::pRegister=this;
    
    this->pusersql = sql::Instance("userinfo.db");//数据库实例化 -在构造函数中
}

void Register::on_Register_Button_clicked()
{
    if(this->pusersql->InsertData("user",ui->Rname_lineEdit->text().toAscii(),ui->Rpwd_lineEdit->text().toAscii()))    //通过sql*类指针通过调用dql方法
    {
		QMessageBox::information(this,"tip","Register successful");
	}else
	{
		QMessageBox::information(this,"tip","Register failed");
	}   
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值