我们项目是这样提供用户上传数据功能的:用户上传json数据,系统验证该json数据格式是否符合管理员定义的标准,如果符合,则将其插入数据中心数据库的相关表中。实现这个功能共包含以下几个难点:解析json数据,配置多个数据源,多个数据源的使用,将解析好的JSONObject对象转化成操作数据库的sql语句。
一、解析json数据
我采用了FastJson提供的对象JSONObject进行json解析。
1.1配置
在pom.xml中添加
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.3</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>net.sf.ezmorph</groupId>
<artifactId>ezmorph</artifactId>
<version>1.0.6</version>
</dependency>
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.2.3</version>
<classifier>jdk15</classifier>
<!-- jdk版本 -->
</dependency>
<!-- Json依赖架包下载结束 -->
这里我遇到了一个问题我的jdk的版本为11,但jdk9以上的版本不兼容,所以我将jdk的版本改为了jdk1.8.
1.2.使用
解析String为定义好的UserJson对象。
text = "{\"dbname\": \"student\",\"chartsname\": [\"tijian\", \"jibenxinxi\"],
\"metas\": [{\"tijian\": {\"des\": \"我的天哪\"},\"jibenxinxi\":
{\"id\": \"1\",\"tid\": \"1\",\"wage\": \"1.5\",\"des\": \"我的天哪!!\"}},
{\"tijian\": {\"des\": \"学生xxx\"},\"jibenxinxi\": {\"id\": \"2\",\"tid\": \"1\",
\"wage\": \"8.9\",\"des\": \"xueshengxxxx\"}}]}";
UserJson userJson = JSONObject.parseObject(text,UserJson.class);
调用getJSONObject()方法可以得到嵌套的json对象,调用get()方法可以得到value。
二、配置多个数据源
因为我们的系统涉及多个数据库,所以需要在springboot项目中对这些数据源进行配置。
在application.properties文件中
spring.datasource.dynamic.datasource.master.url=jdbc:mysql://localhost:3306/sdudatamanagement?useSSL=false&serverTimezone=UTC
spring.datasource.dynamic.datasource.master.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.dynamic.datasource.master.username=root
spring.datasource.dynamic.datasource.master.password=。。。。
spring.datasource.dynamic.primary=master//主数据库,必须
spring.datasource.dynamic.strict=true
//从数据库,student为数据库名
spring.datasource.dynamic.datasource.student.url=jdbc:mysql://localhost:3306/student?useSSL=false&serverTimezone=UTC
spring.datasource.dynamic.datasource.student.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.dynamic.datasource.student.username=root
spring.datasource.dynamic.datasource.student.password=。。。。。。。
三、使用多个数据源
@DS("student")
public boolean uploadData(String text){}
在使用student数据库的方法前加上@DS注释即可,这里需要注意这个方法中的所有sql语句,以及这个方法调用的所有操作数据库的方法,操作的都是student数据库。
为了初始化我们系统数据库中保存的验证用户上传json正确性的数据,我分开写了一个初始化方法,先对需要的来自系统数据库中的数据进行初始化。
四、将解析好的JSONObject对象转化成操作数据库的sql语句
@Override
@DS("student")
public boolean uploadData(String text) {
text = "{\"dbname\": \"student\",\"chartsname\": [\"tijian\", \"jibenxinxi\"],
\"metas\": [{\"tijian\": {\"des\": \"我的天哪\"},\"jibenxinxi\":
{\"id\": \"1\",\"tid\": \"1\",\"wage\": \"1.5\",\"des\": \"我的天哪!!\"}},
{\"tijian\": {\"des\": \"学生xxx\"},\"jibenxinxi\": {\"id\": \"2\",\"tid\": \"1\",
\"wage\": \"8.9\",\"des\": \"xueshengxxxx\"}}]}";
UserJson userJson = JSONObject.parseObject(text,UserJson.class);
//字段相关
for (JSON meta : userJson.getMetas()) {
JSONObject jsonObject = JSONObject.parseObject(String.valueOf(meta));
for (List<PDetail> chartname : this.chartnames2) {
String metas = "";
String values = "";
String cname = "";
for (PDetail pDetail : chartname) {
cname = pDetail.getChartname();
metas+=pDetail.getMeta()+",";
String str = String.valueOf(jsonObject.getJSONObject(pDetail.getChartname()).get(pDetail.getMeta()));
switch (pDetail.getMetatype()){
case "int":
case "float":
values+=str+",";
break;
default:
values+="'"+str+"'"+",";
break;
}
}
metas = metas.substring(0,metas.length()-1);
values = values.substring(0,values.length()-1);
insertData(cname,metas,values);
}
}
return true;
}