我正在使用Java和MySQL。 我在两个单独的函数中有两个sql语句,一个是创建数据库,另一个是创建表。 我试着写try&在每个函数中捕获异常块,它就像下面的代码一样工作。
public class j_sql1 {
static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
static final String DB_URL = "jdbc:mysql://localhost";
static final String DB_URL2 = "jdbc:mysql://localhost/zxc";
static final String USER = "root";
static final String PASS = "";
static Connection conn = null;
static Statement stmt = null;
public static void create_db()
{
conn = null;
stmt = null;
try{
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(DB_URL, USER, PASS);
stmt = conn.createStatement();
String sql = "CREATE DATABASE zxc";
stmt.executeUpdate(sql);
stmt.close();
conn.close();
}
catch(SQLException se){
se.printStackTrace();
}
catch(Exception e){
e.printStackTrace();
}
finally
{
try{
if(stmt!=null)
stmt.close();
}
catch(SQLException se2){}
try{
if(conn!=null)
conn.close();
}
catch(SQLException se){
se.printStackTrace();
}
}
}
public static void create_tables ()
{
conn = null;
stmt = null;
try{
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(DB_URL2, USER, PASS);
stmt = conn.createStatement();
String sql = "CREATE TABLE ABC("+
"abc_ID int NOT NULL AUTO_INCREMENT,"+
"abc_Name varchar(50),"+
"PRIMARY KEY (abc_ID))";
stmt.executeUpdate(sql);
stmt.close();
conn.close();
}
catch(SQLException se){
se.printStackTrace();
}
catch(Exception e){
e.printStackTrace();
}
finally
{
try{
if(stmt!=null)
stmt.close();
}
catch(SQLException se2)
{}
try{
if(conn!=null)
conn.close();
}
catch(SQLException se){
se.printStackTrace();
}
}
}
public static void main(String[] args)
{
create_db();
create_tables();
}
}
但是,如果两个函数中的两个try块中只有一个捕获异常块,就像下面的代码一样,可能吗?
public class j_sql1 {
static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
static final String DB_URL = "jdbc:mysql://localhost";
static final String DB_URL2 = "jdbc:mysql://localhost/zxc";
static final String USER = "root";
static final String PASS = "";
static Connection conn = null;
static Statement stmt = null;
public static void create_db()
{
conn = null;
stmt = null;
try{
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(DB_URL, USER, PASS);
stmt = conn.createStatement();
String sql = "CREATE DATABASE zxc";
stmt.executeUpdate(sql);
stmt.close();
conn.close();
}
}
public static void create_tables ()
{
conn = null;
stmt = null;
try{
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(DB_URL2, USER, PASS);
stmt = conn.createStatement();
String sql = "CREATE TABLE ABC("+
"abc_ID int NOT NULL AUTO_INCREMENT,"+
"abc_Name varchar(50),"+
"PRIMARY KEY (abc_ID))";
stmt.executeUpdate(sql);
stmt.close();
conn.close();
}
}
public static void main(String[] args)
{
try
{
create_db();
create_tables();
}
catch(SQLException se){
se.printStackTrace();
}
catch(Exception e){
e.printStackTrace();
}
finally
{
try{
if(stmt!=null)
stmt.close();
}
catch(SQLException se2)
{}
try{
if(conn!=null)
conn.close();
}
catch(SQLException se){
se.printStackTrace();
}
}
}
}
为什么必须将Connection,Statement和函数之类的变量声明为静态?
谢谢。
答案 0 :(得分:0)
在static
main中,没有类j_sql1的对象实例。因此,只能读取静态字段。
你应该做
命名约定与99.9%的java用户相同:
class JSql1
void createDB()
void createTables()
实例化一个对象,并在其上调用函数:
... main(...) {
JSql1 app = new JSql1();
try {
app.openConnection();
app.createDB();
app.createTables():
} catch (SQLException e) {
Logger.getLogger(JSql1.class.getName()).log(Level.FATAL, "...", e);
} finally {
app.close();
}
当createDB失败时,无需继续,因此createDB应该抛出 异常。
此功能在单个连接中也很有用,因此请创建连接 分开。
设计决策,但至少对于语句声明尽可能在本地
特别是尝试使用资源自动关闭帮助
类JSql1;
Connection conn;
void createTables() throws SQLException {
try (Statement stmt = conn.createStatement()) {
String sql = "CREATE TABLE ABC(" +
"abc_ID int NOT NULL AUTO_INCREMENT," +
"abc_Name varchar(50)," +
"PRIMARY KEY (abc_ID))";
stmt.executeUpdate(sql);
}
}