Java函数中的SQL语句

时间:2014-07-28 10:37:34

标签: java mysql

我正在使用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和函数之类的变量声明为静态?

谢谢。

1 个答案:

答案 0 :(得分:0)

static main中,没有类j_sql1的对象实例。因此,只能读取静态字段。

你应该做

  1. 命名约定与99.9%的java用户相同:

    class JSql1
        void createDB()
        void createTables()
    
  2. 实例化一个对象,并在其上调用函数:

    ... 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应该抛出 异常。

    此功能在单个连接中也很有用,因此请创建连接 分开。

  3. 设计决策,但至少对于语句声明尽可能在本地

  4. 特别是尝试使用资源自动关闭帮助

    类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);
        }
    }