json文件导入数据库
使用Navicat的客户端工具也可以实现json文件导入数据库,但是数据量大了之后,字段的值过于冗长可能会导致数据的截取,是的数据导入不是完整的。
所以另辟蹊径使用其他方法
创建一个新的工程用原始的jdbc实现数据的导入
一、创建完项目后导入依赖
<dependencies><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.73</version></dependency><dependency><groupId>commons-beanutils</groupId><artifactId>commons-beanutils</artifactId><version>1.8.3</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.24</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>RELEASE</version><scope>compile</scope></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>RELEASE</version><scope>compile</scope></dependency></dependencies>
#####二、JDBCUtil工具类
package org.utils;import org.apache.commons.beanutils.BeanUtils;import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;public class JDBCUtil {static Connection conn = null;//1.加载驱动static {try {Class.forName("com.mysql.cj.jdbc.Driver");try {conn = DriverManager.getConnection("jdbc:mysql://202.107.83.133:23306/datacenter_lingyuan", "clesun", "clesun@123456");} catch (SQLException e) {e.printStackTrace();}} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//2.获取连接public static Connection getConnection() {return conn;}//3.关闭连接public static void close(Connection conn, Statement st, ResultSet rs) {//关闭连接/*if (conn != null) {try {conn.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}*///关闭statementif (st != null) {try {st.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//关闭结果集if (rs != null) {try {rs.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}//-------------------------------封装sql操作------------------------------
//查询返回List集合public static <T> List<T> getList(Class<T> cls, String sql, Object... obj) {Connection conn = null;PreparedStatement ps = null;ResultSet rs = null;try {//1.获取连接conn = getConnection();//2.获取预处理对象ps = conn.prepareStatement(sql);//循环参数,如果没有就不走这里for (int i = 1; i <= obj.length; i++) {//注意:数组下标从0开始,预处理参数设置从1开始ps.setObject(i, obj[i - 1]);}//3.执行SQL语句System.out.println(sql);rs = ps.executeQuery();//4.遍历结果集//遍历之前准备:因为封装不知道未来会查询多少列,所以我们需要指定有多少列ResultSetMetaData date = rs.getMetaData();//获取ResultSet对象的列编号、类型和属性int column = date.getColumnCount();//获取列数Field[] fields = cls.getDeclaredFields();//获取本类所有的属性//创建一个list集合对象来存储查询数据List<T> list = new ArrayList<T>();//开始遍历结果集while (rs.next()) {//创建类类型实例T t = cls.newInstance();for (int i = 1; i <= column; i++) {Object value = rs.getObject(i);//每一列的值/***String columnName = date.getColumnName(i);//获取每一列名称* 关于获取每一列名称,如果列取了别名的话,则不能用上面的方法取列的名称* 用下面的方法*/String columnName = date.getColumnLabel(i);//获取每一列名称(别名)//遍历所有属性对象for (Field field : fields) {//获取属性名String name = field.getName();field.setAccessible(true);//打破封装,忽略对封装修饰符的检测/*if (name.equals(columnName)) {String string = date.getColumnTypeName(i);//获取列类型名称//如果列类型是Date类型,转换成字符串表现形式SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");String d = sdf.format(value);//赋值:将数据库中查询的字段赋值给对应名称的属性field.set(t, d);}else{field.set(t, value);}*/if (name.equals(columnName)) {BeanUtils.copyProperty(t, name, value);break;//增加效率,避免不必要的循环}}}list.add(t);}return list;//5.关闭连接} catch (Exception e) {e.printStackTrace();} finally {JDBCUtil.close(conn, ps, rs);}return null;}/*** 增加、删除、修改** @param sql sql语句* @param obj 参数* @return*/public static boolean getDML(String sql, Object... obj) {Connection conn = null;PreparedStatement ps = null;try {conn = getConnection();ps = conn.prepareStatement(sql);for (int i = 1; i <= obj.length; i++) {ps.setObject(i, obj[i - 1]);}System.out.println(sql);int update = ps.executeUpdate();if (update > 0) {return true;}} catch (Exception e) {e.printStackTrace();} finally {close(conn, ps, null);}return false;}//查询返回单个对象public static <T> T getOneObject(Class<T> cls, String sql, Object... obj) {Connection conn = null;PreparedStatement ps = null;ResultSet rs = null;try {//1.获取连接conn = getConnection();//2.获取预处理对象ps = conn.prepareStatement(sql);//循环参数,如果没有就不走这里for (int i = 1; i <= obj.length; i++) {//注意:数组下标从0开始,预处理参数设置从1开始ps.setObject(i, obj[i - 1]);}//3.执行SQL语句System.out.println(sql);rs = ps.executeQuery();//4.遍历结果集//遍历之前准备:因为封装不知道未来会查询多少列,所以我们需要指定有多少列ResultSetMetaData date = rs.getMetaData();//获取ResultSet对象的列编号、类型和属性int column = date.getColumnCount();//获取列数Field[] fields = cls.getDeclaredFields();//获取本类所有的属性//开始遍历结果集if (rs.next()) {//创建类类型实例T t = cls.newInstance();for (int i = 1; i <= column; i++) {Object value = rs.getObject(i);//每一列的值String columnName = date.getColumnName(i);//获取每一列名称//遍历所有属性对象for (Field field : fields) {//获取属性名String name = field.getName();field.setAccessible(true);//打破封装,忽略对封装修饰符的检测if (name.equals(columnName)) {BeanUtils.copyProperty(t, name, value);}}}return t;}//5.关闭连接} catch (Exception e) {e.printStackTrace();} finally {JDBCUtil.close(conn, ps, rs);}return null;}//查询总记录数public static Integer getCount(String sql, Object... obj) {Connection conn = null;PreparedStatement ps = null;ResultSet rs = null;try {//1.获取连接conn = getConnection();//2.获取预处理对象ps = conn.prepareStatement(sql);//循环参数,如果没有就不走这里for (int i = 1; i <= obj.length; i++) {//注意:数组下标从0开始,预处理参数设置从1开始ps.setObject(i, obj[i - 1]);}//3.执行SQL语句System.out.println(sql);rs = ps.executeQuery();//开始遍历结果集if (rs.next()) {return rs.getInt(1);}//5.关闭连接} catch (Exception e) {e.printStackTrace();} finally {JDBCUtil.close(conn, ps, rs);}return null;}
}
三、执行程序
package org.example;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONReader;
import org.entity.MapLqdk;
import org.junit.jupiter.api.Test;
import org.utils.JDBCUtil;import java.io.FileNotFoundException;
import java.io.FileReader;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** 示例JSON格式: [{"xxx":{"yyy":"",...},"zzz":""},...]* @author Administrator*/
public class JsonTest {public static void main(String[] args) throws FileNotFoundException {//sql插入语句String sql = "INSERT INTO map_lqdk (BSM,YSDM,LQPKDM,QYHFLX,LQDKDM,LQDKMC,LQDKMJ,LQDKMJM,SFGBZNT,ZLDJDM,JYZTMC,JYZTLX,BZ,LQLX,FRDBS,QSDWDM,QSDWMC,PDJB,coordinates) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";//需要读取的json文件JSONReader reader = new JSONReader(new FileReader("D:\\个人工作\\工作数据\\地图数据\\两区\\lqdk_new.geojson"));//List dataList = new ArrayList<>();// 开始读取数组reader.startArray();int i = 0;while (reader.hasNext()) {i++;if (i > 0) {//开始读取对象reader.startObject();MapLqdk mapLqdk = new MapLqdk();while (reader.hasNext()) {String key = reader.readString();if ("properties".equals(key)) {// 开始读取对象reader.startObject();Map<String, Object> map = new HashMap<>(16);while (reader.hasNext()) {key = reader.readString();//是键也是字段名//System.out.println("key="+key);String value = reader.readString();//是值//System.out.println("value="+value);map.put(key,value);//dataList.add(map);}String s = JSON.toJSONString(map);mapLqdk = JSON.parseObject(s, MapLqdk.class);// 结束读取reader.endObject();} else {reader.readString();}}// 结束读取reader.endObject();//19个参数JDBCUtil.getDML(sql,mapLqdk.getBSM(),mapLqdk.getYSDM(),mapLqdk.getLQPKDM(),mapLqdk.getQYHFLX(),mapLqdk.getLQDKDM(),mapLqdk.getLQDKMC(),mapLqdk.getLQDKMJ(),mapLqdk.getLQDKMJM(),mapLqdk.getSFGBZNT(),mapLqdk.getZLDJDM(),mapLqdk.getJYZTMC(),mapLqdk.getJYZTLX(),mapLqdk.getBZ(),mapLqdk.getLQLX(),mapLqdk.getFRDBS(),mapLqdk.getQSDWDM(),mapLqdk.getQSDWMC(),mapLqdk.getPDJB(),mapLqdk.getCoordinates());}else{reader.readString();}}// 反序列化完毕后调用reader.endArray();reader.close();}}