mybatis 实现动态参数批量插入

在实际业务开发中,为了减少代码量,实现万变不离其宗的思想,像批量插入、查询、删除等数据库操作以动态参数的方式实现,本文将阐述动态参数实现mybatis批量插入核心代码

1.mapper文件写法

    <sql id="values">
        <foreach item="item" collection="list" separator=",">
            <foreach collection="item" item="detailItem" index="index" open="("
                     close=")" separator=",">
                #{detailItem}
            </foreach>
        </foreach>
    </sql>
    <!-- 批量新增单位信息表信息 -->
    <insert id="addSalAgencys" parameterType="list">
        INSERT INTO ${tableName} (
        <foreach collection="columns" item="columnItem" separator=",">
            ${columnItem}
        </foreach>)
         VALUES
        <include refid="values"></include>
    </insert>

2.持久化层函数

    /**
     * basic sql
     * @param tableName 表名
     * @param columns 列字段集合
     * @param list 值集合
     */
    void addSalAgencys(@Param("tableName") String tableName,
                       @Param("columns") List<String> columns,
                       @Param("list") List<List<Object>> list);

3.参数tableName是表名,这个没什么特别注意的,通过配置表的方式或者别的方式传入都可以,和数据库表名对应即可

columns列字段集合,直接用工具类ReflectionUtil获取就可以,工具类代码

import com.boss.bis.common.exception.BusinessException;
import com.google.common.collect.Lists;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.ObjectUtils;

import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

public class ReflectionUtil {
    public static final char UNDERLINE = '_';
    private static final Logger log = LoggerFactory.getLogger(ReflectionUtil.class);

    public static List<Field> getFields(Class<?> clazz) {
        List<Field> fieldList = new ArrayList<>();
        fieldList.addAll(Lists.newArrayList(clazz.getDeclaredFields()));
        if (!(clazz.getSuperclass().isAssignableFrom(Object.class))) {
            fieldList.addAll(getFields(clazz.getSuperclass()));
        }
        return fieldList;
    }

    public static Field getField(String fieldName, Class<?> cls) {
        try {
            return cls.getDeclaredField(underlineToCamel(fieldName));
        } catch (NoSuchFieldException e) {
            Class<?> parentCls = cls.getSuperclass();
            if (ObjectUtils.isEmpty(parentCls)) {
                log.error(e.getMessage(), e);
                throw new BusinessException(e.getMessage());
            }
            return getField(fieldName, parentCls);
        }
    }

    public static void setValueByField(String fieldName, Object object, Object value) {
        Field field;
        try{
            field = getField(fieldName, object.getClass());
            field.setAccessible(true);
        }catch (Exception e){
            log.error("字段不存在", e);
            return;
        }

        try {
            if (BigDecimal.class.equals(field.getType())) {
                field.set(object, new BigDecimal(String.valueOf(value)));
            } else if (String.class.equals(field.getType())) {
                field.set(object, value);
            }
        } catch (IllegalAccessException e) {
            log.error(e.getMessage(), e);
            throw new BusinessException(e.getMessage());
        }
    }

    /**
     * 下划线格式字符串转换为驼峰格式字符串
     *
     * @param param
     * @return
     */
    public static String underlineToCamel(String param) {
        if (param == null || "".equals(param.trim())) {
            return "";
        }
        if (param.indexOf(UNDERLINE) < 0) {
            return param;
        }
        String paramTmp = param.toLowerCase();
        int len = paramTmp.length();
        StringBuilder sb = new StringBuilder(len);
        for (int i = 0; i < len; i++) {
            char c = paramTmp.charAt(i);
            if (c == UNDERLINE) {
                if (++i < len) {
                    sb.append(Character.toUpperCase(paramTmp.charAt(i)));
                }
            } else {
                sb.append(c);
            }
        }
        return sb.toString();
    }

    public static Object getValueByField(String fieldName, Object object) {
        Field field;
        try{
            field = getField(fieldName, object.getClass());
            field.setAccessible(true);
        }catch (Exception e){
            log.error("字段不存在", e);
            throw new BusinessException(e.getMessage());
        }
        try {
            if (BigDecimal.class.equals(field.getType())) {
                return new BigDecimal(String.valueOf(field.get(object)));
            }
            return field.get(object);
        } catch (IllegalAccessException e) {
            log.error(e.getMessage(), e);
            throw new BusinessException(e.getMessage());
        }
    }
}

通过ReflectionUtil.getFields获取实体类的映射字段

// 数据库字段生成
        List<Field> fields = ReflectionUtil.getFields(cls);
        List<String> underList = new ArrayList<>();
        List<String> camelList = new ArrayList<>();
        StringBuilder colsql = new StringBuilder(200);
        for (Field field : fields) {
            if(Modifier.isStatic(field.getModifiers())){
                continue;
            }
            String name = field.getName();
            String underName = BisBeanUtils.camelToUnderline(name).toUpperCase();
            if(camelList.indexOf(name) > -1){
                continue;
            }
            underList.add(underName);
            camelList.add(name);
            colsql.append(underName + " as " + name).append(", ");
        }
        colsql.delete(colsql.length() - 2, colsql.length() - 1);

这样就获取到了带下划线的字段集合underList,即columns
camelList驼峰法的字段集合,用于第4点组装值集合
colsql查询字段并起驼峰法别名,类似于stu_name as stuName, stu_age as stuAge

这样查询出来的数据用map接收,得出来的map就会是以下这样,maps
在这里插入图片描述
4.组装插入的值集合list

private List<List<Object>> buildSaveData(List<Map> maps, List<String> camelList) {
        List<List<Object>> dataList = maps.stream().map(t -> {
            List<Object> list = new ArrayList<>();
            camelList.stream().forEach(field -> {
                list.add(t.get(field));
            });
            return list;
        }).collect(Collectors.toList());
        return dataList;
    }

以上就是mybatis实现动态参数批量插入的核心代码,描述上可能比较欠缺,毕竟是一只不太会表达的程序猿,有不明白的铁子可以给我留言。
在这里插入图片描述

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
4, &log_length, log); LOGE("Failed to link program: %s", log); abort(); } glUseProgram(program); glUniform1i(glGetUniformLocation(program, "texture"), 0); // 创建 OpenGL ES 纹理 glGenMyBatis中可以使用批量操作来提高数据插入的效率,下面介绍一下如何实现Textures(1, &texture_id); glBindTexture(GL_TEXTURE_EXTERNAL_OES, texture_id); glTexParameterf(GL_TEXTURE_EXTERNAL_O批量插入。 1. 使用foreach标签 MyBatis中可以使用foreach标签来遍历一个集合,对ES, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 集合中的每个元素执行SQL语句。可以将需要插入的数据封装到一个List或者数组中 glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_EXTERNAL_O,然后使用foreach标签遍历集合,对每个元素执行插入操作。例如: ```xml <insertES, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); // 创建 ANativeWindow 的 EGLDisplay、EGLSurface 和 EGLContext id="batchInsert" parameterType="java.util.List"> insert into user (id, name, age) values <foreach collection display = eglGetDisplay(EGL_DEFAULT_DISPLAY); eglInitialize(display, 0, 0); EGLint config_attributes="list" item="item" separator=","> (#{item.id}, #{item.name}, #{item.age}) </foreach> </[] = { EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, EGL_NONE }; EGLint config_count; EGLConfig config; eglChooseConfig(display, config_attributes, &config, 1,insert> ``` 在Java代码中,可以将需要插入的数据封装到一个List中,然后调用batchInsert &config_count); int format; ANativeWindow_setBuffersGeometry(window, 0, 0, format); surface = e方法即可: ```java List<User> userList = new ArrayList<>(); // ... 封装需要插入的数据到userList中 glCreateWindowSurface(display, config, window, NULL); EGLint context_attributes[] = { EGL_CONTEXT_CLIENT_VERSION, 2SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); try { , EGL_NONE }; context = eglCreateContext(display, config, EGL_NO_CONTEXT, context_attributes); egl for (User user : userList) { userMapper.insert(user); } sqlSession.commit(); } catch (Exception e) { MakeCurrent(display, surface, surface, context); } // 渲染 YUV 数据 void render_yuv_data() { // 绑定 sqlSession.rollback(); } finally { sqlSession.close(); } ``` 2. 使用batch批量操作 MyBatis提供了batch批 OpenGL ES 纹理和 SurfaceTexture glBindTexture(GL_TEXTURE_EXTERNAL_OES, texture_id); glTexImage2D(GL_TEXTURE_EXTERNAL量操作的方法,可以将多条SQL语句一起提交到数据库执行,从而提高效率。例如: ```_OES, 0, GL_RGBA, texture_width, texture_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glViewport(0, 0, texture_width, texture_height); glClearColor(0.0f, 0.0f, java List<User> userList = new ArrayList<>(); // ... 封装需要插入的数据到userList中 SqlSession sqlSession = sql0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glUseProgram(program); GLfloat vertices[] =SessionFactory.openSession(ExecutorType.BATCH); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); try { for (User user : { -1.0f, -1.0f, 1.0f, -1.0f, - userList) { userMapper.insert(user); } sqlSession.flushStatements(); sqlSession.commit(); } catch (Exception e) { sqlSession1.0f, 1.0f, 1.0f, 1.0f, }; GLfloat tex.rollback(); } finally { sqlSession.close(); } ``` 使用batch批量操作时,需要在执行完所有插入操作后调coords[] = { 0.0f, 1.0f, 1.0f, 1.0f用flushStatements方法,将所有批量操作提交到数据库执行,然后再执行commit操作。注意,如果要使用batch批, 0.0f, 0.0f, 1.0f, 0.0f, }; 量操作,需要在MyBatis的配置文件中配置批量操作的相关参数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值