자바 반사 메커니즘 을 이용 하여 동적 생 성 Sql 실현

장면
데이터 이전 을 위 한 작은 도 구 를 만 들 려 면 대량의 정 리 된 대상 데 이 터 를 다른 표 에 삽입 해 야 합 니 다. 기 존의 방식 에 따라 작업량 이 많 기 때문에 반사 메커니즘 동적 + my baits 를 이용 하여 동적 으로 Sql 을 생 성하 고 대량으로 입고 하 는 것 을 고려 합 니 다.
코드
mybatis 주해 @ InsertProvider 지정 방법 으로 SQL 문장 생 성
package com.company.cutover.provider.mapper.jydp;

import org.apache.ibatis.annotations.InsertProvider;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * @author ryzhang5
 * @Package com.company.cutover.provider.mapper.jydp
 * @date 2020/7/19 17:30
 * @Copyright
 */
public interface InsertDataMapper {
    @InsertProvider(type = DynamicSqlProvider.class, method = "genCreateTableSql")
    Integer insertData(@Param("list") List> list, @Param("bean") Class bean);
}

 
package com.company.cutover.provider.mapper.jydp;

import org.springframework.util.ReflectionUtils;

import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.List;
import java.util.Map;

/**
 * @author ryzhang5
 * @Package com.company.cutover.provider.mapper.jydp
 * @date 2020/7/19 16:41
 * @Copyright
 */
public class DynamicSqlProvider {

    /**
     *     sql
     * @param data
     * @return
     */
    public static String genCreateTableSql(Map data){
        Class bean = (Class) data.get("bean");
        List list = (List) data.get("list");
        String filesList =  getBeanFilesList(bean);
        String valueList = getBeanValueList(bean, list);
        String sql =  "insert into " + getBeanName(bean)+" ("+filesList+") values "+ valueList;
        return sql;
    }

    /**
     *     
     * @param bean
     * @return
     */
    public static String getBeanName(Class bean){
        try {
            String clzStr = bean.toString();
            //     (     )
            String beanName = clzStr.substring(clzStr.lastIndexOf(".")+1);
            return beanName;
        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }
    }

    /**
     *     
     * @param bean
     * @return
     */
    public static String getBeanFilesList(Class bean){
        try {
            Field[] strs = bean.getDeclaredFields();
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < strs.length; i++) {
                if (!strs[i].getName().equals("tableName")&&!strs[i].getType().equals("List")) {
                    String str = strs[i].getName().substring(0,1).toUpperCase() + strs[i].getName().substring(1);
                    sb.append("`" + str +"`,");
                }
            }
            sb.deleteCharAt(sb.toString().lastIndexOf(","));
            return sb.toString();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public static String getBeanValueList(Class bean, List objList){
        StringBuilder sb = new StringBuilder();
        try {
            Field[] tableFields = bean.getDeclaredFields();

            for (Object obj : objList) {
                sb.append("(");
                for (int i = 0; i < tableFields.length; i++) {
                    PropertyDescriptor pd = new PropertyDescriptor(tableFields[i].getName(), bean);
                    Method getMethod = pd.getReadMethod();//  get  
                    Object fieldValue = ReflectionUtils.invokeMethod(getMethod, obj);
                    if(fieldValue == null){
                        continue;
                    }
                    if(fieldValue instanceof String){
                        //           '
                        if(((String) fieldValue).contains("'")){
                            fieldValue = ((String) fieldValue).replaceAll("'","\\\\'");
                        }
                    }
                    sb.append("'" + fieldValue.toString() + "',");
                }
                sb.deleteCharAt(sb.toString().lastIndexOf(","));
                sb.append(")");
                sb.append(",");
            }
            sb.deleteCharAt(sb.toString().lastIndexOf(","));
            return sb.toString();

        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

}

주의 하 다.
들 어 오 는 클래스 이름, 필드 이름 은 일치 함 을 표시 해 야 합 니 다.
보충:
대량의 데이터 삽입 문 제 를 고려 하여 데이터 분할 삽입 이 가능 합 니 다.
public void insertData(List> list, Class bean){
        //         ,     
        int pageSize = 1000;
        int pageIndex = 0;

        while(pageIndex * pageSize < list.size()){
            int startIndex = pageIndex * pageSize;
            int endIndex = (pageIndex + 1) * pageSize;
            endIndex = endIndex > list.size() ? list.size() : endIndex;
            List> subList = list.subList(startIndex, endIndex);
            insertDataMapper.insertData(subList, bean);
            try {
                Thread.sleep(1);
            }catch (Exception e){
                e.printStackTrace();
            }
            pageIndex++;
        }
    }

좋은 웹페이지 즐겨찾기