浏览 3076 次
锁定老帖子 主题:以编程方式创建数据库表
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-08-04
研究了一下,现把具体的代码分离一下,感兴趣的朋友可以看看,以后可能会用到的。 下面是解析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语句正确。 有时候看一些开源的东西,特别是看别人的代码的时候觉得自己的代码写的好不严谨呀,以后还要多多学习开源框架的源码,养成好的代码风格和习惯。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |