java 程序插入oracle数据库 clob Nclob大字段数据 代码

java 程序插入oracle数据库 clob Nclob大字段数据 代码

懒得说直接贴出来

package cn.com.oceansoft.osc.ms.service.impl;

import cn.com.oceansoft.osc.ms.config.YmlConfig;
import cn.com.oceansoft.osc.ms.domain.SwapTempData;
import cn.com.oceansoft.osc.ms.persistence.datasource.IDataMachineMapper;
import cn.com.oceansoft.osc.ms.persistence.datasource2.IDataServerMapper;
import cn.com.oceansoft.osc.ms.service.IDataService;
import oracle.sql.CLOB;
import oracle.sql.NCLOB;
import org.springframework.stereotype.Service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.sql.*;

import javax.annotation.Resource;
import java.util.*;
import oracle.sql.TIMESTAMP;
import java.text.SimpleDateFormat;
import java.util.Date;

@Service
public class DataServiceImpl implements IDataService{

    private static final Logger logger = LoggerFactory.getLogger(DataServiceImpl.class);

    @Resource
    private IDataMachineMapper iDataMachineMapper;

    @Resource
    private IDataServerMapper iDataServerMapper;

    @Resource
    private YmlConfig ymlConfig;

    @Override
    public void synchroData() {

        // 获取待同步表信息
        List<SwapTempData> swapTempDataList = iDataMachineMapper.getSwapTempData();

        StringBuilder stringSql = new StringBuilder();
        for(SwapTempData swapTempData : swapTempDataList) {
            // 查询数据sql 拼接
            stringSql.append("select * from ").append(swapTempData.getTablename())
                    .append(" where ").append("guid = '").append(swapTempData.getRefguid()).append("'");
            //执行查询
            Map<String, Object> map = iDataMachineMapper.selectSql(stringSql);

            // 清空stringSql
            stringSql.delete(0, stringSql.length());
            int res = 0;

            if ("INSERT".equals(swapTempData.getAction().toUpperCase()) && map != null) {
                // 拼接sql
                try {
                    res = splitSqlInsert(swapTempData.getTablename(), map);
                } catch (Exception e) {
                    e.printStackTrace();
                }

            } else if ("DELETE".equals(swapTempData.getAction().toUpperCase()) && map == null) {
                // 拼接sql
                stringSql = splitSqlDelete(swapTempData.getTablename(), swapTempData.getRefguid());
                logger.info("springSql delete :  {}",stringSql);
                // 执行
                res = iDataServerMapper.deleteSql(stringSql);

            } else if ("UPDATE".equals(swapTempData.getAction().toUpperCase()) && map != null) {
                // 拼接sql
                try {
                    res = splitSqlUpdate(swapTempData.getTablename(), map, swapTempData.getRefguid());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            stringSql.delete(0, stringSql.length());

            // 成功后更新临时数据表数据状态
            if (res > 0) {
                this.iDataMachineMapper.updateStatus(swapTempData.getGuid());
            }
        }

    }

    /**
     * 数据插入
     * @param tablename 表名
     * @param map 待插入表信息
     * @return
     */
    public int splitSqlInsert(String tablename, Map<String, Object> map) throws SQLException, IOException {
        // 获取当前表字段类型
        Map<String,String> columnTypes = getColumnType(tablename);
        // Nclob、clob参数map
        Map<String, String> mapNclob = new HashMap<>();
        // 时间格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        // 插入语句key
        StringBuilder stringBuilderSql = new StringBuilder();
        // 插入语句value
        StringBuilder stringSqlValue = new StringBuilder();
        Set set = map.keySet();
        Iterator iter = set.iterator();

        String key = "";
        String str = "";
        StringReader reader = null;
        int res = 1 ;
        stringBuilderSql.append("insert into ").append(tablename).append(" (");

            Connection conn = DriverManager.getConnection(ymlConfig.getUrl(), ymlConfig.getUsername(), ymlConfig.getPassword());
logger.info("getUsername :{}",ymlConfig.getUsername());
            conn.setAutoCommit(false);
            // 拼sql
            while (iter.hasNext()) {
                key = (String) iter.next();
                stringBuilderSql.append(key);

                // 判断是否为时间类型
                if("DATE".equals(columnTypes.get(key).toUpperCase()) || columnTypes.get(key).toUpperCase().indexOf("TIMESTAMP")!=-1) {
                    try {
                        TIMESTAMP timestamp = (TIMESTAMP) map.get(key);
                        str = timestamp.toString().substring(0, timestamp.toString().indexOf("."));
                    } catch (Exception e) {
                        Date date = (Date) map.get(key);
                        str = sdf.format(date);
                    }

                    stringSqlValue.append("TO_DATE('").append(str).append("', 'SYYYY-MM-DD HH24:MI:SS')");
                } else if( "NCLOB".equals(columnTypes.get(key).toUpperCase())){

                    NCLOB nclob = (NCLOB) map.get(key);
                    long longLen = nclob.length();
                    str = nclob.getSubString(1L, (int) longLen);
                    mapNclob.put(res+"",str);
                    stringSqlValue.append("?");
                    res++;
                } else if( "CLOB".equals(columnTypes.get(key).toUpperCase())){

                    CLOB clob = (CLOB) map.get(key);
                    long longLen = clob.length();
                    str = clob.getSubString(1L, (int) longLen);
                    mapNclob.put(res+"",str);
                    stringSqlValue.append("?");
                    res++;
                } else {
                    stringSqlValue.append("'").append(map.get(key)).append("'");
                }

                if (iter.hasNext()) {
                    stringBuilderSql.append(", ");
                    stringSqlValue.append(", ");
                }
            }
            stringBuilderSql.append(") values (").append(stringSqlValue).append(")");
            // 1.这种方法写入CLOB字段可以。
            logger.info("stringBuilderSql insert:   {}", stringBuilderSql);
            PreparedStatement stat = conn.prepareStatement(stringBuilderSql+"");

            Set setClob = mapNclob.keySet();
            Iterator iterNclob = setClob.iterator();
            while (iterNclob.hasNext()) {
                key = (String) iterNclob.next();
                str = mapNclob.get(key);
                reader = new StringReader(str);
                stat.setCharacterStream(Integer.parseInt(key), reader, str.length());
            }

            stat.executeUpdate();
            conn.commit();
            stat.close();
            reader.close();
            conn.close();
        res = 1 ;
        return res;
    }

    /**
     * 拼接删除sql
     * @param tablename 待删除表名
     * @param guid 待删除表主键
     * @return
     */
    public StringBuilder splitSqlDelete(String tablename, String guid) {
        StringBuilder stringSql = new StringBuilder();
        stringSql.append("delete from ").append(tablename).append(" where guid = '").append(guid).append("'");
        return stringSql;
    }

    /**
     * 数据更新 先删除再插入
     * @param tablename 待更新表名
     * @param map 待更新数据
     * @param guid 待更新表主键
     * @return
     */
    public int splitSqlUpdate(String tablename, Map<String, Object> map, String guid) throws SQLException, IOException {
        // 先删除 再插入
        StringBuilder stringSql = splitSqlDelete(tablename, guid);
        iDataServerMapper.deleteSql(stringSql);
        logger.info("-------------------------  更新先删除再插入   -----------------------------");
        splitSqlInsert(tablename, map);
        int res = 1;
        return res;
    }

    /**
     * 处理查询结果
     * @param tablename
     * @return
     */
    public Map<String, String> getColumnType (String tablename) {
        // 获取当前表字段类型
        List<Map<String,String>> columnTypeList = iDataMachineMapper.selectTableType(tablename);

        Map<String, String> columnTypes = new HashMap<>();
        for(Map<String, String> columnType : columnTypeList){
            columnTypes.put(columnType.get("key"),columnType.get("value"));
        }
        return columnTypes;
    }

}

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值