javaweb访问数据库,数据库刚添加的条目能马上查询到吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javaweb访问数据库,数据库刚添加的条目能马上查询到吗?相关的知识,希望对你有一定的参考价值。

我是在一个servlet中写的如下代码。功能是将一个文件的相关信息输入到diary表和mydiary表中。其中diary表中有字节no1,date,file。其中no1是自动生成的序列号,date是当前日期bt,file存储的是文件路径path。
我首先在diary中添加新文件的信息。然后通过ResultSet查找自动生成的序号no1,然后再添加到mydiary中。但是我去查看数据库,mydiary中没有更新的数据。
是不是要先关闭一次st,然后再打开才能更新数据库,所以根本查不到no1?求助!

String path=null;//存储文件路径
DataSource ds=null;
//文件日期
SimpleDateFormat df = new SimpleDateFormat("yyyy.MM.dd");
String bt=df.format(new Date());

//文件名称及路径。名称是idyyMMddhhmm
SimpleDateFormat df2 = new SimpleDateFormat("yyMMddhhmm");
String bt2=df2.format(new Date());
path="/FILE/"+id+bt2+".txt";

try
//获得数据源
Context envCtx=new InitialContext();
ds=(DataSource)envCtx.lookup("java:comp/env/jdbc/diary");
Connection con=ds.getConnection();
Statement st=con.createStatement();
/*在数据库中插入相应文件信息。因为要保证diary表和mydiary中的no1一致,
所以mydiary以diary中的no1为准。而diary中的no1是自动生成的*/
//添加到diary表中
String sql="INSERT INTO diary (DATE,File) " +
"VALUES('"+bt+"','"+path+"')";
st.execute(sql);

//找到diary中生成的no1的值
String sql2="SELECT NO1 FROME diary WHERE File='"+path+"'";
ResultSet rs=st.executeQuery(sql2);
int no1=rs.getInt(1);
//往mydiary中添加
String sql1="INSERT INTO mydiary (Id,No1,Date) " +
"VALUES('"+id+"',"+no1+",'"+bt+"')";
st.execute(sql1);

rs.close();
st.close();
con.close();
catch(Exception e)
out.println(e);
//try结束
我刚才试了先关闭st,再打开查询。还是不行!
String sql="INSERT INTO diary (DATE,File) " +
"VALUES('"+bt+"','"+path+"')";
st.execute(sql);

st.close();

//找到diary中生成的no1的值
st=con.createStatement();
String sql2="SELECT NO1 FROM diary WHERE File='"+path+"'";
ResultSet rs=st.executeQuery(sql2);
int no1=rs.getInt(1);

具体你怎么写的我没有看,不过如果是表中增加一条信息的话,什么时候都可以查询的到的,还有就是每次查询最好都要关闭连接,如果需要再次查询的话重新连接查询就好了,相关的你可以看一下java关于jdbc连接数据库方面的资料。追问

错误显示是:
java.sql.SQLException: Before start of result set
太奇怪了。
你指的关闭连接是连con都要关吗?

参考技术A 事物提交就可以看到

从列表条目访问 SQL 数据

【中文标题】从列表条目访问 SQL 数据【英文标题】:Accessing SQL data from a list entry 【发布时间】:2020-02-15 00:23:23 【问题描述】:

首先,我将描述并展示我的小程序是如何工作的,以便我的问题易于理解

节目说明

以下是我用于该计划的 2 个寡妇:

主窗口

输入窗口

主窗口显示在程序的开头。我将 QListWidget 用于“宏”列表,它显示了从 Sqlite 数据库(DB)读取的每个条目的标题。当按下主窗口中的“新建”按钮时,会显示一个新的输入窗口。输入窗口中的“保存”按钮将标题和描述输入保存到数据库并更新主窗口中的“宏”列表。这看起来像这样:

在输入窗口输入信息

更新的主窗口

我的 Sqlite 表

我的问题

我希望能够在“宏”列表中选择一个条目,按“编辑”按钮,然后显示填充了数据库数据的输入窗口。但是,因为 QListWidget 只允许输入字符串,所以我无法使用它的 PK ('id') 进行搜索。

我正在考虑使用 QTableWidget 而不是 QListWidget。我将加载整个表格,但隐藏除标题列之外的所有列,以便只有标题会显示在主窗口的“宏”列表中。对于查询,我将通过访问所选条目的第 0 个索引来使用条目的 PK。

如果这是正确的步骤,请告诉我。如果不是,请描述您将使用什么来实现仅显示标题但允许查询其数据的列表。我是 PyQt/PySide 的初学者,非常感谢任何指导。

代码

以下是按下“保存”按钮时执行的代码(以及它的辅助函数)

def save_macro(self):

    title = self.lineedit.text()
    description = self.textedit.toPlainText()

    add_sql_query = ''' INSERT INTO Macros (title,description)
                  VALUES(?,?) '''

    # Helper func that creates connection to db
    sqlhelper = SqliteHelper("entry name")

    if sqlhelper is not None:  # If db is connected:
        macro_data = (title, description)
        sqlhelper.insert(add_sql_query, macro_data)  

    self.close()


class SqliteHelper:

    def __init__(self, name=None):
        self.conn = None
        self.cursor = None

        if name:
            self._create_connection(name)

    def _create_connection(self, name):
        try:
            self.conn = sqlite3.connect(name)
            self.cursor = self.conn.cursor()
            print(sqlite3.version)
        except sqlite3.Error as e:
            print(e)

    def insert(self, query, inserts):  # Insert
        c = self.cursor
        c.execute(query, inserts)
        self.conn.commit()

【问题讨论】:

【参考方案1】:

不要重新发明***,Qt提供了与数据库交互的类,例如处理表信息你可以使用QSqlQueryModel、QSqlTableModel等。要添加一行你必须创建一个QSqlRecord并将它添加到模型中,对于该版本,您可以使用映射和编辑行信息的 QDataWidgetMapper,要删除您必须删除该行并重新加载整个表。要指示应该在 QListView 中显示哪个字段,请使用 setModelColumn() 方法,它应该是“标题”字段的列。

from PyQt5 import QtCore, QtGui, QtWidgets, QtSql


def create_connection(database):
    db = QtSql.QSqlDatabase.addDatabase("QSQLITE")
    db.setDatabaseName(database)
    if not db.open():
        print("Cannot open database")
        print(
            "Unable to establish a database connection.\n"
            "This example needs SQLite support. Please read "
            "the Qt SQL driver documentation for information "
            "how to build it.\n\n"
            "Click Cancel to exit."
        )
        return False

    query = QtSql.QSqlQuery()
    if not query.exec_(
        """CREATE TABLE IF NOT EXISTS Macros (
    "id" INTEGER PRIMARY KEY AUTOINCREMENT,
    "title" TEXT,
    "description" TEXT)"""
    ):
        print(query.lastError().text())
        return False
    return True


class AddMacroDialog(QtWidgets.QDialog):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.title_le = QtWidgets.QLineEdit()
        self.description_te = QtWidgets.QPlainTextEdit()

        button_box = QtWidgets.QDialogButtonBox(self)
        button_box.setOrientation(QtCore.Qt.Horizontal)
        button_box.setStandardButtons(
            QtWidgets.QDialogButtonBox.Cancel | QtWidgets.QDialogButtonBox.Ok
        )

        button_box.accepted.connect(self.accept)
        button_box.rejected.connect(self.reject)

        lay = QtWidgets.QVBoxLayout(self)
        lay.addWidget(self.title_le)
        lay.addWidget(self.description_te)
        lay.addWidget(button_box)

    @property
    def title(self):
        return self.title_le.text()

    @property
    def description(self):
        return self.description_te.toPlainText()


class EditMacroDialog(QtWidgets.QDialog):
    def __init__(self, model, index, parent=None):
        super().__init__(parent)

        self.title_le = QtWidgets.QLineEdit()
        self.description_te = QtWidgets.QPlainTextEdit()

        mapper = QtWidgets.QDataWidgetMapper(
            self, submitPolicy=QtWidgets.QDataWidgetMapper.ManualSubmit
        )
        mapper.setModel(model)
        mapper.addMapping(self.title_le, model.record().indexOf("title"))
        mapper.addMapping(self.description_te, model.record().indexOf("description"))
        mapper.setCurrentIndex(index)

        button_box = QtWidgets.QDialogButtonBox(self)
        button_box.setOrientation(QtCore.Qt.Horizontal)
        button_box.setStandardButtons(
            QtWidgets.QDialogButtonBox.Cancel | QtWidgets.QDialogButtonBox.Ok
        )

        button_box.accepted.connect(self.accept)
        button_box.rejected.connect(self.reject)
        button_box.accepted.connect(mapper.submit)

        lay = QtWidgets.QVBoxLayout(self)
        lay.addWidget(self.title_le)
        lay.addWidget(self.description_te)
        lay.addWidget(button_box)


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)

        self._model = QtSql.QSqlTableModel(self)
        self.model.setTable("Macros")
        self.model.select()

        self.sql_list_view = QtWidgets.QListView()
        self.sql_list_view.setModel(self.model)
        self.sql_list_view.setModelColumn(self.model.record().indexOf("title"))

        self.new_button = QtWidgets.QPushButton(self.tr("New"))
        self.edit_button = QtWidgets.QPushButton(self.tr("Edit"))
        self.remove_button = QtWidgets.QPushButton(self.tr("Remove"))

        central_widget = QtWidgets.QWidget()
        self.setCentralWidget(central_widget)

        grid_layout = QtWidgets.QGridLayout(central_widget)
        grid_layout.addWidget(
            QtWidgets.QLabel(self.tr("Macros"), alignment=QtCore.Qt.AlignCenter)
        )
        grid_layout.addWidget(self.sql_list_view, 1, 0)

        vlay = QtWidgets.QVBoxLayout()
        vlay.addWidget(self.new_button)
        vlay.addWidget(self.edit_button)
        vlay.addWidget(self.remove_button)
        grid_layout.addLayout(vlay, 1, 1)
        self.resize(640, 480)

        self.new_button.clicked.connect(self.new)
        self.edit_button.clicked.connect(self.edit)
        self.remove_button.clicked.connect(self.remove)

        self.sql_list_view.selectionModel().selectionChanged.connect(
            self.onSelectionChanged
        )
        self.onSelectionChanged()

    @property
    def model(self):
        return self._model

    @QtCore.pyqtSlot()
    def new(self):
        d = AddMacroDialog()
        if d.exec_() == QtWidgets.QDialog.Accepted:
            r = self.model.record()
            r.setValue("title", d.title)
            r.setValue("description", d.description)
            if self.model.insertRecord(self.model.rowCount(), r):
                self.model.select()

    @QtCore.pyqtSlot()
    def edit(self):
        ixs = self.sql_list_view.selectionModel().selectedIndexes()
        if ixs:
            d = EditMacroDialog(self.model, ixs[0].row())
            d.exec_()

    @QtCore.pyqtSlot()
    def remove(self):
        ixs = self.sql_list_view.selectionModel().selectedIndexes()
        if ixs:
            self.model.removeRow(ixs[0].row())
            self.model.select()

    @QtCore.pyqtSlot()
    def onSelectionChanged(self):
        state = bool(self.sql_list_view.selectionModel().selectedIndexes())
        self.edit_button.setEnabled(state)
        self.remove_button.setEnabled(state)


if __name__ == "__main__":
    import sys

    database = "entry name"  # ":memory:"
    app = QtWidgets.QApplication(sys.argv)
    if not create_connection(database):
        sys.exit(app.exec_())
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

【讨论】:

以上是关于javaweb访问数据库,数据库刚添加的条目能马上查询到吗?的主要内容,如果未能解决你的问题,请参考以下文章

学javaweb之前 需要先学数据库吗

JavaWeb之JDBC

学javaweb之前 需要先学数据库吗

往数据库里面插入数据之后,刚开始能查到,过一会这些数据就没有了,请问是啥原因

如何修改 iPhone plist 以添加另一个级别并在代码中访问数据

工作中的开发过程(Javaweb路线,写给刚刚实习或者马上就要工作的朋友)