现在有个需求是做的这套系统要能实现多个公司使用,每个公司要有不同的数据库,之前从来没做过类似的,思路是:
后台管理页面输入新增公司信息,包括一下这些信息:
‘主键id’,‘企业名称’,企业logo’, ‘联系人’,‘联系电话’, ‘二级域名’,‘管理员账号’, ‘管理员密码’, 数据库名
在执行提交的时候,服务器以数据库名创建数据库,然后执行转储的sql文件来建立所有的表,这个sql文件是放在特定盘符下的,每次提交新增公司信息时候,会复制这个sql文件并且重命名,再执行这个sql,下面是service层的实现过程:
public boolean createDb(String dbName) throws IOException, ClassNotFoundException, SQLException {
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://xxxx:3306/"+dbName+"?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai";
String username = "root";
String password = "root";
boolean db = manageMapper.createDb(dbName);
//关联要复制的文件
File file = new File("D:/db6666.sql");
//建立输入流读取(这里的异常直接抛出去不处理)
FileInputStream fis = new FileInputStream(file);
//建立输出流用于复制出去,这里是要复制出去的地方以及文件名
//这里填写要到什么地方,什么名字,什么后缀名就是了
FileOutputStream fos = new FileOutputStream("D:/"+dbName+".sql");
//定义变量接收读进来的数据
byte[] temp = new byte[fis.available()];
//读进来
//定义变量接收
int b;
//循环接收数据
for (int i = 0; i < temp.length; i++) {
b = fis.read();
temp[i] = (byte)b;
}
//复制出去
fos.write(temp);
//关闭流
fis.close();
fos.close();
File sql = new File("D:/"+dbName+".sql");
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, username, password);
ScriptRunner runner = new ScriptRunner(conn);
try {
runner.setStopOnError(true);
runner.runScript(new FileReader(sql));
} catch (Exception e) {
e.printStackTrace();
}
conn.close();
return db;
}
数据库连接信息,在url里面一定要把数据库名改为传进来的需要新建的参数
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://xxxx:3306/"+dbName+"?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai";
String username = "root";
String password = "root";
先去创建数据库,
boolean db = manageMapper.createDb(dbName);
创建数据库的xml文件如下:
<update id="createDb">
create database ${
dbName};
</update>
注释很详细了,主要是把原文件复制并且重命名
//关联要复制的文件
File file = new File("D:/db6666.sql");
//建立输入流读取(这里的异常直接抛出去不处理)
FileInputStream fis = new FileInputStream(file);
//建立输出流用于复制出去,这里是要复制出去的地方以及文件名
//这里填写要到什么地方,什么名字,什么后缀名就是了
FileOutputStream fos = new FileOutputStream("D:/"+dbName+".sql");
//定义变量接收读进来的数据
byte[] temp = new byte[fis.available()];
//读进来
//定义变量接收
int b;
//循环接收数据
for (int i = 0; i < temp.length; i++) {
b = fis.read();
temp[i] = (byte)b;
}
//复制出去
fos.write(temp);
//关闭流
fis.close();
fos.close();
下面就是执行sql文件的操作:
File sql = new File("D:/"+dbName+".sql");
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, username, password);
ScriptRunner runner = new ScriptRunner(conn);
try {
runner.setStopOnError(true);
runner.runScript(new FileReader(sql));
} catch (Exception e) {
e.printStackTrace();
}
conn.close();
return db;
}
提交的数据库名为baidu,创建了对应的sql文件
.
sql文件创建了一张bus_clue表
再看数据库:成功创建
库是创建好了,后面的具体怎么做还没想好…