我尝试使用java代码将数据插入到mysql数据库中。我在数据库中构建了一个用户表。用户表有4个字段:id,用户名,密码和地址。
mysql> desc user;
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| username | varchar(32) | YES | | NULL | |
| password | varchar(64) | YES | | NULL | |
| address | varchar(64) | YES | | NULL | |
+----------+-------------+------+-----+---------+----------------+
这是我的java代码。
Connection conn = null;
PreparedStatement stmt = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC";
String mysqlUserName = "root";
String mysqlPassword = "123456";
conn = DriverManager.getConnection(url, mysqlUserName, mysqlPassword);
String sql = "INSERT INTO user(username,password,address) VALUES (?,?,?)";
stmt = conn.prepareStatement(sql);
stmt.setString(1,"11dsa1");
stmt.setString(2,"111");
stmt.setString(3,"111");
stmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if (conn!=null)
conn.close();
}catch (SQLException e){
}
try {
if (stmt!=null)
stmt.close();
}catch (SQLException e){
}
}
未发生错误。 但我的数据库中没有数据。
mysql> select * from user;
Empty set (0.01 sec)
但我可以通过shell插入数据。
mysql> insert into user(username,password,address) values ("aaa","aaa","aaa");
Query OK, 1 row affected (0.09 sec)
mysql> select * from user;
+----+----------+----------+---------+
| id | username | password | address |
+----+----------+----------+---------+
| 22 | aaa | aaa | aaa |
+----+----------+----------+---------+
1 row in set (0.00 sec)
但 id为22而不是1!
实际上我之前已经运行过这个java代码21次。我的理解是这个java代码可以将数据插入到mysql中,但会立即从数据库中删除数据。 我真的无法理解这种荒谬的情况
答案 0 :(得分:3)
你不忘记实际执行声明吗?
关闭之前,只需添加stmt.executeUpdate()即可
String sql = "INSERT INTO user(username,password,address) VALUES (?,?,?)";
stmt = conn.prepareStatement(sql);
stmt.setString(1,"11dsa1");
stmt.setString(2,"111");
stmt.setString(3,"111");
stmt.executeUpdate()
我还建议您在finally块中关闭准备好的语句,或者如果您使用java 7+,请查看如何使用try-with-resources here使用预准备语句。此外,如果您在finally块中关闭连接,为什么还要在尝试块中关闭它(最后一个命令)?这绝对是多余的。
通常,保持代码清洁可以让您更好地阅读它,从而更好地查看可能的问题。
答案 1 :(得分:2)
<强>解决方案:强>
在ui->widget->SideBar::addAction( new QAction( QIcon(QString(":/icons/icon%1").arg(i)) , QString("Action %1").arg(i)) );
添加此内容之前..
stmt.close()
它应该工作!!
<强>建议:强>
此外,如果您的Java版本高于6,那么您应该采用试用资源方法,以更智能的方式管理关键资源。 !!
答案 2 :(得分:0)
在stmt.close();
之前,添加此stmt.executeupdate();
,因为您应该先更新表,然后再更新查询。