以编程方式创建数据库表
前几天下了个开源的论坛系统JForum,看了一下,此论坛系统是以可编程的方式进行数据库表的创建。
研究了一下,现把具体的代码分离一下,感兴趣的朋友可以看看,以后可能会用到的。
下面是解析SQL文件的语句代码:
public class ParseDBStructFile { /** * 读取Sql文件,得到Sql语句信息列表 * @param operation 控制Sql语句的数组 * @param filename Sql文件所在的路径 * @return Sql语句的信息列表 */ @SuppressWarnings("unchecked") public static List parse(String[] operation,String filename) { //保存Sql语句的List List statements = new ArrayList(); BufferedReader reader = null; try { reader = new BufferedReader(new FileReader(filename)); StringBuffer sb = new StringBuffer(512); boolean processing = false; char delimiter = ';';// String[] creators = { "CREATE INDEX", "CREATE TABLE",// "CREATE SEQUENCE", "DROP TABLE", "IF EXISTS",// "DROP SEQUENCE", "DROP INDEX" }; String[] creators = operation; String line; while ((line = reader.readLine()) != null) { if (line.length() == 0) { continue; } char charAt = line.charAt(0); // Ignore comments if (charAt == '-' || charAt == '#') { continue; } if (processing) { sb.append(line); if (line.indexOf(delimiter) > -1) { sb.delete(sb.length() - 1, sb.length()); statements.add(sb.toString()); processing = false; } } else { for (int i = 0; i < creators.length; i++) { if (line.indexOf(creators[i]) > -1) { sb.delete(0, sb.length()); if (line.indexOf(delimiter) > -1) { if (line.indexOf(';') > -1) { line = line.replace(';', ' '); } statements.add(line); } else { sb.append(line); processing = true; } break; } } } } } catch (Exception e) { e.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (Exception e) { } } } return statements; }}
此类用于对包含SQL语句的文件进行分析。
把SQL语句添加至一个List对象里面。其中String数组中包含数据库表创建中的一些关键字段,比如CREATE INDEX, CREATE TABLE,DROP TABLE,DROP INDEX等语句。
接着就可以创建执行Sql语句的类,以创建数据库表信息,以下是具体代码:
public class InstallTables { /** * 创建数据库表的方法 * @param post 数据库对应的端口 * @param dbName 数据库名称 * @param username 用户名 * @param password 密码 * @param operation 控制数据库创建表数组 * @param filename Sql表文件的路径 * @throws Exception */ @SuppressWarnings("unchecked") public void install(String post,String dbName,String username,String password,String[] operation,String filename) throws Exception{ Connection conn = DBConnection.getConnectionMySqlDB(post,dbName,username,password); boolean autoCommit = conn.getAutoCommit(); Statement st = null; List queryList = ParseDBStructFile.parse(operation,filename); for(String sql:queryList){ if (sql == null || "".equals(sql.trim())) { continue; } st = conn.createStatement(); st.executeUpdate(sql); st.close(); } conn.setAutoCommit(autoCommit); }}
其中DBConnection是一个建立与数据库连接的类,参数代表了数据库的端口号、要连接的目标数据库名称、用户名、密码。
DBConnection类的具体代码:
public class DBConnection { public static Connection getConnectionMySqlDB(String post, String dbName,String userName,String password) throws Exception { String driver = "com.mysql.jdbc.Driver"; String url = "jdbc:mysql://localhost:" + post + "/" + dbName; String user = userName; String pwd = password; Class.forName(driver); return DriverManager.getConnection(url, user, pwd); }}
当然你也可以自己进行扩展,比如再创建与SQLServer、Oracle的连接等。
现在一切都已经完成啦,让我们做一个简单的测试:
public class testCreator{ @Test public void testInstallTables(){ InstallTables install = new InstallTables(); try { String[] operation = {"CREATE TABLE","DROP TABLE"}; install.install("3306", "jackdemo", "root", "jack",operation, "F:\\tables.sql"); } catch (Exception e) { e.printStackTrace(); } } }
下面是tables.sql文件的内容:
DROP TABLE IF EXISTS jackdemo1; CREATE TABLE jackdemo1 ( id int primary key auto_increment, name varchar(50), age int, address varchar(1000) );
以上就是全部的内容,当然还可以进行表内容的添加,只要你写的Sql语句正确。
有时候看一些开源的东西,特别是看别人的代码的时候觉得自己的代码写的好不严谨呀,以后还要多多学习开源框架的源码,养成好的代码风格和习惯。