GVKun编程网logo

tk.mybatis 不需要主键自增实现批量新增(mybatisplus设置自增主键)

10

本篇文章给大家谈谈tk.mybatis不需要主键自增实现批量新增,以及mybatisplus设置自增主键的知识点,同时本文还将给你拓展125.mybaties批量操作批量新增批量更新批量删除批量根据i

本篇文章给大家谈谈tk.mybatis 不需要主键自增实现批量新增,以及mybatisplus设置自增主键的知识点,同时本文还将给你拓展125.mybaties 批量操作 批量新增 批量更新 批量删除 批量根据 id 查询、ibatis批量新增-自增长序列、mybatis oracle 批量新增、Mybatis Plus 实现批量插入等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

tk.mybatis 不需要主键自增实现批量新增(mybatisplus设置自增主键)

tk.mybatis 不需要主键自增实现批量新增(mybatisplus设置自增主键)

 

让所有Mapper继承我写的 InsertListPlusMapper 即可

 

 

 

125.mybaties 批量操作 批量新增 批量更新 批量删除 批量根据 id 查询

125.mybaties 批量操作 批量新增 批量更新 批量删除 批量根据 id 查询

1. 效果

 

 

 

 

 

2. 代码 sql

 

<!--1.批量新增-->
<insert id="batchInsert" parameterType="java.util.List">
    insert into t_user (username,hobby,workage)
    values
    <foreach collection ="list" item="user" index= "index"
             separator =",">
        (#{user.username},#{user.hobby},#{user.workage})
    </foreach >
</insert>

 

 

<!-- 2.1 批量更新单个字段    优化方法 https://www.cnblogs.com/javalanger/p/10899088.html  -->
<update id="updateSingleData" parameterType="java.util.List">
      <foreach collection="list" item="user" index="index" separator=";">
          update t_user
          <set>
              <if test="user.hobby != null and user.hobby != ''''" >
                   hobby = #{user.hobby}
              </if>
          </set>
          where username = #{user.username}
      </foreach>
  </update>

  <!--3.批量更新多个字段 -->
  <update id="updateMoreData" parameterType="java.util.List">
      update t_user
      <trim prefix="set" suffixOverrides=",">

          <trim prefix="hobby =case" suffix="end,">
              <foreach collection="list" item="i" index="index">
                  <if test="i.hobby!=null">
                      when username=#{i.username} then #{i.hobby}
                  </if>
              </foreach>
          </trim>

          <trim prefix="workage =case" suffix="end,">
              <foreach collection="list" item="i" index="index">
                  <if test="i.workage!=null">
                      when username=#{i.username} then #{i.workage}
                  </if>
              </foreach>
          </trim>

      </trim>
      where

      <foreach collection="list" separator="or" item="i" index="index" >
          username=#{i.username}
      </foreach>


  </update>

 

<!-- 批量查询 -->
<select id="batchSelect"
        resultType="cn.ma.ddddd.domain.User2">
    select
    *
    from t_user where  username in
    <foreach collection="list" item="username" open="(" close=")" separator=",">
        #{username}
    </foreach>

</select>

 

 

<!-- 批量删除 -->
<delete id="batchDel">
    delete
    from t_user where  username in
    <foreach collection="list" item="username" open="(" close=")" separator=",">
        #{username}
    </foreach>

</delete>

 

3. mapper 接口类 及实体类

 

 

 

 

 

 

 

ibatis批量新增-自增长序列

ibatis批量新增-自增长序列

第一种解决思路:使用存储过程批量生成序列并返回集合。

存储过程:

CREATE OR REPLACE PROCEDURE proce_seq(V_SEQ IN VARCHAR2,
                                   NUM   IN INTEGER,
                                   P_CUR OUT SYS_REFCURSOR) AS
                                   
 /*********************************************************************
   名称: proce_seq
   功能描述: 获取制定序列集合
   创建人: 张驰
   处理逻辑:传入序列名称和所需数量返回序列集合
   修改记录:
   创建日期: 2015-11-10
   备注:
  **********************************************************************/
                                   
  V_SQL VARCHAR2(500);
  I    NUMBER;
BEGIN
 EXECUTE immediate ''truncate table  T_SEQ_TEMP'';
  FOR I IN 1 .. NUM LOOP
    V_SQL := ''INSERT INTO T_SEQ_TEMP SELECT '' || V_SEQ || ''.nextval from dual'';
    EXECUTE IMMEDIATE V_SQL;
	COMMIT;
  END LOOP;
  OPEN P_CUR FOR
    SELECT * FROM T_SEQ_TEMP;
END proce_seq;

ibatis调用存储过程:

  <parameterMap id="hasAuthParam"  >  
    <parameter property="V_SEQ" jdbcType="VARCHAR" mode="IN"/>  
    <parameter property="NUM" jdbcType="INTEGER"  mode="IN"/>  
    <parameter property="P_CUR" jdbcType="ORACLECURSOR"  
            javaType="java.sql.ResultSet" mode="OUT"/>
  </parameterMap>  
  

  <procedure id="callSeqList" parameter result>
  	{ call PROCE_SEQ(?,?,?)}
  </procedure>

这种方式需动态的把序列名称和所要获取的序列数量传给存储过程,然后已游标的形式返回结果集。但是这种方式有一个致命的确定就是再存储过程执行中需要向临时表中存放序列,这要再数据模型上会多出一张临时表同事会执行commit动作。一旦commit,那么在我们的Java代码里对事物的控制就会受到影响    

第二种解决思路:使用 CONNECT BY循环(推荐使用)。

StringBuffer sql = new StringBuffer();
sql.append("select ").append(seqName).append(".NEXTVAL AS SEQ FROM DUAL CONNECT BY ROWNUM <= ").append(number);
map.put("PROCE_SEQ", sql);
List<Map<String,Object>> mapList =  this.getDao().find("OtherEntity.callSeqList", map);
 <select id="callSeqList" parameter result>
  	<![CDATA[ $PROCE_SEQ$ ]]>
  </select>

 

mybatis oracle 批量新增

mybatis oracle 批量新增

 

 

假定场景:批量导入用户信息

一般批量新增使用 SELECT … INSERT INTO 和 INSERT INTO … SELECT

我们这次使用第二种

 

一、先建一张用户信息表模拟批量导入用户信息

create table u_info{
    id           NUMBER not null,
    info_no      VARCHAR2(32) not null,
    name         VARCHAR2(32) not null,
    birthday     DATE,
    age          NUMBER,
    create_date  DATE not null
}
-- 自动按天数分区
-- tablespace TBS_DATA 
--partition by range (create_date) interval (numtodsinterval(1, ''DAY''))
--(partition P20190101 values less than (TO_DATE(''2019-01-01 00:00:00'', ''SYYYY-MM-DD HH24:MI:SS'', ''NLS_CALENDAR=GREGORIAN'')))
;

--create unique index IU_INFO_NO_DATE on u_info (info_no,create_date) tablespace TBS_IDX online local;

-- Add comments
comment on table u_info is ''用户信息表'';
comment on column u_info.id is ''主键'';
comment on column u_info.info_no is ''用户编号'';
comment on column u_info.name is ''姓名'';
comment on column u_info.birthday is ''生日'';
comment on column u_info.age is ''年龄'';
comment on column u_info.create_date is ''创建时间'';

 

二、mybatis xml(传入集合参数,建议批量数量控制在3000以内)

<insert id="insertBatch" parameterType="java.util.List">
    /**UserInfoMapper.insertBatch*/
    INSERT INTO u_info(
        id,
        info_no,
        name,
        birthday,
        age,
        create_date
    )
    SELECT
    S.*,
    SYSDATE
    FROM(
    <foreach item="bean" index="index" collection="list" separator="UNION ALL">
        SELECT
        #{bean.id,              jdbcType=DECIMAL},
        #{bean.infoNo,          jdbcType=VARCHAR},
        #{bean.name,            jdbcType=VARCHAR},
        #{bean.birthday,        jdbcType=TIMESTAMP},
        #{bean.age,             jdbcType=DECIMAL}
        FROM DUAL
    </foreach>
    ) S
</insert>

 

Mybatis Plus 实现批量插入

Mybatis Plus 实现批量插入

Mybatis PlusIService 接口中提供了批量插入的方法,然而,它的内部实现逻辑竟然是这样的:

在这里插入图片描述


居然是循环单条插入?!逗人玩嘛,好吧,自己动手,丰衣足食。

一. 添加依赖

<!--mybatis plus extension,包含了mybatis plus core-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-extension</artifactId>
    <version>3.4.0</version>
</dependency>

二. 继承默认方法注入

在 injector 包下新建 EasysqlInjector.java

在这里插入图片描述


EasysqlInjector.java

import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.injector.DefaultsqlInjector;
import com.baomidou.mybatisplus.extension.injector.methods.InsertBatchSomeColumn;
import java.util.List;

/**
 * @author: jichunyang
 * @description: 自定义数据方法注入
 * @date: 2020/12/18 14:15
 **/
public class EasysqlInjector extends DefaultsqlInjector {

    @Override
    public List<AbstractMethod> getmethodList(Class<?> mapperClass) {
        List<AbstractMethod> methodList = super.getmethodList(mapperClass);
        methodList.add(new InsertBatchSomeColumn());
        return methodList;
    }
}

三. 在 MybatisPlusConfig 配置文件中注入 Bean

//开启事务
@EnableTransactionManagement
@Configuration
@MapperScan("扫描的mapper包路径")
public class MybatisPlusConfig {
	
	//需要注入的Bean
	@Bean
    public EasysqlInjector easysqlInjector() {
        return new EasysqlInjector();
    }
    
	@Bean("sqlSessionFactory")
    public sqlSessionFactory sqlSessionFactory() throws Exception {
        MybatissqlSessionfactorybean sqlSessionFactory = new MybatissqlSessionfactorybean();
        // 其他配置项
        ......
        sqlSessionFactory.setGlobalConfig(globalConfiguration());
        return sqlSessionFactory.getobject();
    }

    @Bean
    public GlobalConfig globalConfiguration() {
        GlobalConfig conf = new GlobalConfig();
        // 自定义的注入需要在这里进行配置
        conf.setsqlInjector(easysqlInjector());
        return conf;
    }
}

四. 扩展自带 BaseMapper

在 mapper 包下新建 EasyBaseMapper 接口,扩展自带 BaseMapper

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.List;

public interface EasyBaseMapper<T> extends BaseMapper<T> {

    /**
     * 批量插入 仅适用于MysqL
     * @param entityList 实体列表
     * @return 影响行数
     */
    Integer insertBatchSomeColumn(List<T> entityList);
}

五. 业务层面实现

修改业务 mapper 接口 UserMapper,继承刚刚扩展的 EasyBaseMapper

import org.apache.ibatis.annotations.Mapper;

/**
 * @author jichunyang
 * @description 用户Mapper
 */
@Mapper
public interface UserMapper extends EasyBaseMapper<User> {

}

service实现层的使用

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
	
    @Override
    @Transactional
    public void insertUsers(List<User> users) {
	    // 这里使用了自定义的批量插入,baseMapper可以直接使用,不需要声明
	    baseMapper.insertBatchSomeColumn(users);
	}
}

IUserService 是定义的业务逻辑接口,和批量插入配置无关;

参考博客:https://www.cnblogs.com/thinkYi/p/13723035.html

Mybatis Plus关联博客:

SpringBoot + Mybatis Plus + Druid 实现多数据源切换和动态事务

MyBatis Plus 的自动填充数据功能

欢迎关注我的公众号,用讲故事的方式学技术。

这里有脑洞大开的奇葩故事,也有温暖文艺的心灵感悟。

技术知识,也可以很有趣。

在这里插入图片描述

关于tk.mybatis 不需要主键自增实现批量新增mybatisplus设置自增主键的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于125.mybaties 批量操作 批量新增 批量更新 批量删除 批量根据 id 查询、ibatis批量新增-自增长序列、mybatis oracle 批量新增、Mybatis Plus 实现批量插入等相关内容,可以在本站寻找。

本文标签: