應用程序初始化數據庫配置小程序java
以前寫過一個Java版的信息管理系統,但部署系統的時候還須要手動的去配置數據庫和導入一些初始化的數據才能讓系統運行起來,因此我在想是否是能夠寫一個小程序在系統初次運行的時候自動部署數據庫和導入一些初始化數據。而後就有了如下的思路:mysql
在應用程序入口處判斷數據庫是否已經配置完成,若配置完成則進入正常的登陸系統完成正常操做便可,若未配置則進入數據庫配置的小程序完成數據庫配置而後再進入系統,但如何來判斷是否已經配置完成呢,在這裏我用的是比較原始的方法,配置數據庫的時候系統會在相關目錄下自動生成一個關於數據庫相關的配置文件(config.xml),該配置文件說明了數據庫的種類,數據庫的用戶名,數據庫的密碼(涉及到的安全性問題以後再處理),以及應用程序所用到數據庫也就是即將自動建立的數據庫名,因此在應用程序啓動的時候系統會去檢測相關路徑下是否有該配置文件,若該文件存在則數據庫配置完成,不然該系統是初次運行,須要啓動數據庫配置小程序。進入數據庫配置小程序後,會彈出一個彈出式對話框,咱們須要選擇使用到的數據庫以及輸入數據庫用戶名,密碼以及系統用到的數據庫的名,點擊測試按鈕查看是否能夠鏈接上數據庫,若能完成鏈接則會多出一個初始化按鈕,點擊初始化按鈕會執行相應的建立數據庫數據表以及導入數據等操做,而這些操做則能夠經過讀取初始化文件(文件中是初始化執行的sql語句),初始化完成即完成了整個數據庫的初始化任務,而後會調用正常的登陸程序登陸進入系統。git
因此整個流程總結下來就是,運行應用程序——>判斷相關目錄下是否有數據庫的配置文件(config.xml)(有則進入正常的登陸程序)——>若沒有則運行數據庫初始化小程序——>選擇數據庫類型,輸入用戶名密碼以及新建的數據庫的名——>點擊測試按鈕(測試不經過檢查數據庫重試)——>測試成功則點擊初始化按鈕完成初始化——>初始化任務完成後會跳轉到正常的登陸程序。github
程序入口判斷程序sql
package hxy; import java.io.File; class CreateDBConfig { public CreateDBConfig(){ try { File file = new File("config"); File filePath = new File("config//config.xml"); if(!file.exists()){ if(file.mkdir()){ if(!filePath.exists()){ new DBForm(); }else{ System.out.print("配置文件建立失敗!!!"); } } else{ System.out.println("目錄建立失敗!!!"); } } else{ if(!filePath.exists()){ new DBForm(); }else{ System.out.println("數據庫已經配置成功直接進入應用!!!"); } } } catch (Exception e) { e.printStackTrace(); } } }
數據庫選擇界面以及控件監視器程序(完成配置數據的收集而後交給配置文件生成程序生成相應的配置文件)數據庫
package hxy; import java.awt.BorderLayout; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.SQLException; import javax.swing.DefaultComboBoxModel; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JTextField; import javax.swing.SwingConstants; import javax.swing.border.EmptyBorder; class DBForm extends JDialog { private static final long serialVersionUID = 1L; private final JPanel contentPanel = new JPanel(); private JTextField userName; private JPasswordField password; private JTextField databaseName; private JComboBox<String> databaseType; private JButton okButton; private Database DBdatabase; @SuppressWarnings({ "unchecked", "rawtypes" }) public DBForm() { setTitle("Database"); setVisible(true); setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); setBounds(100, 100, 357, 276); getContentPane().setLayout(new BorderLayout()); contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5)); getContentPane().add(contentPanel, BorderLayout.CENTER); contentPanel.setLayout(null); JLabel lblNewLabel = new JLabel("DatabaseSet"); lblNewLabel.setFont(new Font("宋體", Font.PLAIN, 14)); lblNewLabel.setHorizontalAlignment(SwingConstants.CENTER); lblNewLabel.setBounds(114, 10, 108, 15); contentPanel.add(lblNewLabel); JLabel lblDatabasetype = new JLabel("DatabaseType"); lblDatabasetype.setHorizontalAlignment(SwingConstants.CENTER); lblDatabasetype.setBounds(64, 42, 82, 15); contentPanel.add(lblDatabasetype); databaseType = new JComboBox(); databaseType.setModel(new DefaultComboBoxModel(new String[] {"MySql", "SQLServer"})); databaseType.setBounds(181, 39, 108, 21); contentPanel.add(databaseType); JLabel lblUsername = new JLabel("UserName"); lblUsername.setHorizontalAlignment(SwingConstants.CENTER); lblUsername.setBounds(64, 76, 82, 15); contentPanel.add(lblUsername); userName = new JTextField(); userName.setBounds(181, 73, 108, 21); contentPanel.add(userName); userName.setColumns(10); JLabel lblPassword = new JLabel("Password"); lblPassword.setHorizontalAlignment(SwingConstants.CENTER); lblPassword.setBounds(64, 113, 82, 15); contentPanel.add(lblPassword); password = new JPasswordField(); password.setBounds(181, 110, 108, 21); contentPanel.add(password); okButton = new JButton("OK"); okButton.setVisible(false); //okButton.setVisible(true); //OKButton listener set okButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { // Database db = getDatabase(); //初始默認數據庫設置完成,接下來建立新的數據庫並建立表初始化 //建立鏈接對象 String dBName = DBdatabase.getName(); DBdatabase.setName("mysql"); ConnectDatabase conn = new ConnectDatabase(DBdatabase); //獲取鏈接的statement對象 try { ///建立新的數據庫並對並將默認數據庫改成新建的數據庫 conn.getState().executeUpdate("create database "+dBName+";"); conn.getState().close(); conn.getConn().close(); DBdatabase.setName(dBName); XMLReader xr = new XMLReader(); xr.setXML(DBdatabase); JOptionPane.showMessageDialog(okButton, "數據庫初始化成功!!!"); dispose(); // new LogIn(); System.out.println("數據庫配置成功進入應用系統!!!"); } catch (SQLException e) { JOptionPane.showMessageDialog(okButton, "數據庫初始化失敗!!!"+e); e.printStackTrace(); } } }); okButton.setBounds(71, 191, 93, 23); contentPanel.add(okButton); JButton testButton = new JButton("Test"); /////////////TestButton listener testButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { DBdatabase = getDatabase(); String dbName = DBdatabase.getName(); DBdatabase.setName("mysql"); ConnectDatabase conn = new ConnectDatabase(DBdatabase); if(conn.getConn()!=null){ okButton.setVisible(true); JOptionPane.showMessageDialog(testButton, "Test Successed!!!"); DBdatabase.setName(dbName); } else{ JOptionPane.showMessageDialog(testButton, "Test Failed!!!"); } } }); testButton.setBounds(191, 191, 93, 23); contentPanel.add(testButton); JLabel lblNewLabel_1 = new JLabel("Database"); lblNewLabel_1.setHorizontalAlignment(SwingConstants.CENTER); lblNewLabel_1.setBounds(64, 155, 82, 15); contentPanel.add(lblNewLabel_1); databaseName = new JTextField(); databaseName.setBounds(181, 152, 108, 21); contentPanel.add(databaseName); databaseName.setColumns(10); } @SuppressWarnings("static-access") public Database getDatabase(){ Database db = new Database(); String dbType = databaseType.getSelectedItem().toString().trim(); System.out.println(dbType); String dbUser = userName.getText().trim(); @SuppressWarnings("deprecation") String dbPassword = password.getText().trim(); String dbName = databaseName.getText().trim(); if(dbType==null|dbUser==null|dbPassword==null|dbName==null){ new JOptionPane().showMessageDialog(okButton, "請完善數據庫信息!!!");; } else{ if(dbType.equals("MySql")){ db.setType(dbType); db.setDriver("com.mysql.jdbc.Driver"); db.setUri("localhost"); db.setPort("3306"); db.setUser(dbUser); db.setPassword(dbPassword); db.setName(dbName); } else{ db.setType(dbType); db.setDriver("com.microsoft.sqlserver.jdbc.SQLServerDriver"); db.setUri("localhost"); db.setPort("1433"); db.setUser(dbUser); db.setPassword(dbPassword); db.setName(dbName); } } return db; } }
配置文件生成程序即把數據庫的相關信息寫入配置文件供系統以後鏈接數據庫時讀取,因此這裏生成配置文件還有一個比較好的好處就是個人程序不須要寫死就是在程序中就須要徹底的把數據庫的相關信息寫進入,這裏我只須要讀取配置文件而後注入到相關的方法中就行。至於配置文件生成器就是先建立一個文件,而後根據相應的配置數據寫入到文件中,固然這是一個xml文件,也可使用dom4j等來科學的寫入和修改,但這樣比較簡單粗暴,至於xml文件的解析器和生成器程序在之後的博文中相應的介紹到。小程序
這個小程序徹底是由於本身的小想法和小猜測去實踐寫的並應用到了個人以前的那個信息管理系統中,以上是小程序全部代碼中一部分,程序完整代碼在個人GitHub中(https://github.com/huangxinyuan650/ConnectDatabase)歡迎你們批評指正安全