一、这样做的原因
出于一些业务的需要,比如一个招聘网站,有很多公司在上面注册招人,每一个公司的信息储存量都是很大,如果只用一个数据库的话,可能无法精确查询,运行和响应的性能方面也不是很好!特别是在高并发的情况下。效果可能不是很好。
这个时候,就会想到每一个公司注册的时候同时也给它创建一个属于自己的数据库,这样的话,管理起来也是非常的方面,性能方面也得到了很大的提升!
我这里主要是分享一下自己的经验:(不足之处欢迎留言)
二、怎么做
1.创建一个springboot项目(我用的是idea)
2.在项目src/main/resource目录下创建一个sql文件夹(名字可以自己取),然后找一个你准备好的sql文件放进去。如下图:
3.接下来就是代码部分了
@Value():这个注解是拿你配置文件里的值
@Value("${spring.datasource.driver-class-name}")
private String driverClassName;
@Value("${spring.datasource.url}")
private String datasourceUrl;
@Value("${spring.datasource.username}")
private String datasourceUserName;
@Value("${spring.datasource.password}")
private String datasourcePassword;
String ClassName=driverClassName;
String database="sceo_erp_2020_";//这个是数据库的名字,可以自己取
String url=datasourceUrl;
int datasourceId = us.getDatasourceId();
if(datasourceId >=1 && datasourceId <= 9){
database=database+"00"+datasourceId;
}else if(datasourceId>=10 && datasourceId <= 99){
database=database+"0"+datasourceId;
}else{
database=database+datasourceId;
}
String username=datasourceUserName;
String password=datasourcePassword;
String str=url.substring(url.lastIndexOf("/")+1,url.lastIndexOf("?"));
System.out.println("以前的url中的数据库:"+str);
String newUrl=url.replace(str,database);//替换成新生成的
Datasource datasource = new Datasource();
datasource.setUsername(username);
datasource.setPassword(password);
datasource.setUrl(newUrl);
datasource.setDatasourceId(datasourceId);
datasource.setDatabaseName(database);
datasource.setDriverClassName(ClassName);
dm.insert(datasource);
//准备连接语句
String databaseSql = "create database " + database + " default character set utf8 collate utf8_general_ci;";
// 建立连接
Connection conn = DriverManager.getConnection(url, username, password);
Statement smt = conn.createStatement();
smt.executeUpdate(databaseSql);
conn = DriverManager.getConnection(newUrl, username, password);
// 创建ScriptRunner,用于执行SQL脚本
ScriptRunner runner = new ScriptRunner(conn);
runner.setErrorLogWriter(null);
runner.setLogWriter(null);
// 执行SQL脚本
runner.runScript(Resources.getResourceAsReader("sql/sys_menu.sql"));
// 关闭连接
conn.close();
提示:以上代码并不能直接复制运行,但是关键代码都在,要看你自己如何运用了,不懂可以留言私信!