zoukankan      html  css  js  c++  java
  • JavaFX程序初次运行创建数据库并执行建表SQL

      在我的第一个JavaFX程序完成安装的时候才突然发现,不能要用这个软件还要手动执行Sql来建表吧?

     于是我的想法是在Main程序中执行时检测数据库连接状况,如果没有检测到数据库或者连接异常,那么出现错误提示,如果数据库连接没有问题那么自动创建数据库并执行建表Sql进行初始化。

    package oa.util;
    
    import java.io.IOException;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.util.Properties;
    
    import org.apache.ibatis.jdbc.ScriptRunner;
    
    import com.ibatis.common.resources.Resources;
    import com.mysql.jdbc.Connection;
    import com.mysql.jdbc.Statement;
    
    public class CreateMySqlDatabase {
    
    	public static void createDatabase() throws SQLException {
    		Connection conn;
    		conn = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/", "root", "1234");
    		Statement stmt = (Statement) conn.createStatement();
    		String sql = "CREATE DATABASE UTILITY";
    		stmt.executeUpdate(sql);
    	}
    	
    	
    	public static void executeSql() throws IOException, SQLException {
    		Properties props = Resources.getResourceAsProperties("mysql.properties");
    		String url = props.getProperty("jdbc.url");
    		String username = props.getProperty("jdbc.username");
    		String password = props.getProperty("jdbc.password");
    		Connection conn = (Connection) DriverManager.getConnection(url, username, password);
    		ScriptRunner runner = new ScriptRunner(conn);
    		runner.setErrorLogWriter(null);
    		runner.setLogWriter(null);
    		runner.runScript(Resources.getResourceAsReader("sql/utility.sql"));
    		conn.close();
    		System.out.println("==SUCCESS==");
    	}
    }
    

     需要用到 ibatis-common-2.jar读取mysql.properties文件中的JDBC信息。

     MAIN做判断:

    try {
    			DriverManager.getConnection("jdbc:mysql://localhost:3306/utility", "root", "1234");
    			isError = false;
    		} catch (MySQLSyntaxErrorException e) {
    			primaryStage.setTitle("正在创建Utility数据库……");
    			Label error = new Label("正在创建Utility数据库……");
    			error.setFont(new Font("Cambria", 100));
    			Pane pane = new Pane();
    			pane.getChildren().add(error);
    			Scene scene = new Scene(pane);
    			primaryStage.setScene(scene);
    			primaryStage.show();
    			try {
    				CreateMySqlDatabase.createDatabase();
    				CreateMySqlDatabase.executeSql();
    				isError = false;
    				primaryStage.close();
    			} catch (SQLException | IOException e1) {
    				primaryStage.close();
    				e1.printStackTrace();
    			}
    
    		} catch (SQLException se) {
    			Thread.sleep(3000);
    			primaryStage.close();
    			se.printStackTrace();
    		}
    
    		if (!isError) {
    			run();
    		}
    
    	}
    
    	public static void main(String[] args) {
    		launch(args);
    	}
    
  • 相关阅读:
    小端字节序与大端字节序
    V8引擎的垃圾回收策略
    TTL 和 DNS TTL 的区别
    详解 undefined 与 null 的区别
    Node.js 事件循环机制
    requestAnimationFrame 知多少?
    Web前端知识体系精简
    Vue.js 和 MVVM 小细节
    使用 Node.js 搭建 Web 服务器
    H5单页面手势滑屏切换原理
  • 原文地址:https://www.cnblogs.com/yangchaojie/p/10041462.html
Copyright © 2011-2022 走看看