天道酬勤,学无止境

使用mybatiplus和mybatis进行批量插入及值回传

概述

如下图,有两张表specification和specification_option
在这里插入图片描述
在这里插入图片描述
specification为规格表,specification_option为规格选项表,两者的关系是1对多的关系,其中specification_option的spec_id对应specification的id。写在如规格的时候,需要将规格选项选项写入到规格选项表中。表中id是自增的,那么有这么一个问题,规格选项表的写入必须要有规格的id。那么如何既能写入规格,又能获取写入后的规格id来给规格选项表使用呐?

实现

首先说说前端:
前端会传一个类似下面格式的对象过来,
{
specification:{},
specificationOptionList:[{}]—集合
}
这个对象包含了specification规格对象和一个specificationOptionList规格选项集合对象

前端数据示例:
{
“tbSpecification”:{“specName”:“test1”},
“tbSpecificationOptionList”:
[
{“optionName”:“test11”,“orders”:“111”},
{“optionName”:“test66”,“orders”:“666”}
]

}

接收对象这样设计:

@Data
public class SpecificationAndOptionVo {

    private TbSpecification tbSpecification;

    private List<TbSpecificationOption> tbSpecificationOptionList;


}

来看使用mybatis-plus如何实现,写入specification后回传id

 @RequestMapping("/insertSpecificationAndOption")
    @Transactional
    public void insertSpecificationAndOption(@RequestBody SpecificationAndOptionVo specificationAndOptionVo){

        //使用mybatis-plus批量写入数据
        iTbSpecificationService.save(specificationAndOptionVo.getTbSpecification());

        Long id = specificationAndOptionVo.getTbSpecification().getId();

        System.out.println(id);


        for (TbSpecificationOption  specification:specificationAndOptionVo.getTbSpecificationOptionList()) {

            specification.setSpecId(id);
            //使用iTbSpecificationOptionService.save()也可以对数据进行写入,but是在for寻找中写入,可能会有性能损耗,如果不考虑性能此种方法也可以
            //iTbSpecificationOptionService.save(specification);
        }

        iTbSpecificationOptionService.saveBatch(specificationAndOptionVo.getTbSpecificationOptionList());


    }

在这里插入图片描述

看到了嘛,使用mybatis-plus写入对象后,是会自动回传id的,无需做任何配置,这样,使用specificationOption.setSpecId(id);就可以将规格id写入到规格选项表的specId中。

使用mybatis该如何做呐?

有两个问题需要解决,一个是我插入规格之后,如何得到插入规格的id值,然后在写入到规格选项对象中,然后插入数据库。另一个问题是使用mybatis如何批量写入规格选项对象?

在mybatis中,是有回传id的标签的,设置一下就可以使用。

<selectKey resultType="java.lang.Long" order="AFTER" keyProperty="id">
            SELECT LAST_INSERT_ID() AS id
</selectKey>

这个就是id回传标签,我们暂且不考虑分布式和多线程下id回传错误问题。

说一下它的参数,resultType为id类型,你要指明回传id的类型,order为在某个select、insert、update、delete操作前还是后,keyProperty指明回传对象字段名。

<insert id="insertSpecificationWithMybatis" parameterType="com.pinyougou.specification.entity.TbSpecification">
        <selectKey resultType="java.lang.Long" order="AFTER" keyProperty="id">
            SELECT LAST_INSERT_ID() AS id
        </selectKey>
        insert into tb_specification (id, spec_name)
        values (#{id,jdbcType=BIGINT}, #{specName,jdbcType=VARCHAR})
    </insert>

第二个问题:另一个问题是使用mybatis如何批量写入规格选项对象?
其实有两种办法一种是,使用mybatis的foreach标签进行批量写入,另一种是在Java端使用循环+insert写入

使用循环写入

 @RequestMapping("/insertSpecificationAndOptionWithMybatis")
    public void insertSpecificationWithMybatis(@RequestBody SpecificationAndOptionVo specificationAndOptionVo){

        iTbSpecificationService.insertSpecificationWithMybatis(specificationAndOptionVo.getTbSpecification());

        for (TbSpecificationOption specificationOption : specificationAndOptionVo.getTbSpecificationOptionList()){

            Long id = specificationAndOptionVo.getTbSpecification().getId();
            specificationOption.setSpecId(id);
            iTbSpecificationOptionService.insertSpecificationOptionWithMybatis(specificationOption);

        }

在这里插入图片描述

可以看到id确实是回传了的,当前也是可以写入成功的

这里放弃了使用foreach进行写入,为何,因为我需要使用规格回传的id,为每个规格选项设置specId,然后写入规格选项表中,如果在java层面使用了循环设置为每个规格选项设置specId,然后在使用foreach批量写入数据,就用了两次循环,对性能不是很友好,就没有用了,不过记录一下

使用foreach进行写入

<insert id="insertSpecificationOptionWithMybatisForeach" parameterType="java.util.List">

    insert into tb_specification_option (id, option_name, spec_id,
      orders) values
        <foreach collection="list" item="item" open="(" close=")">
        #{item.id,jdbcType=BIGINT}, #{item.optionName,jdbcType=VARCHAR}, #{item.specId,jdbcType=BIGINT},
        #{item.orders,jdbcType=INTEGER}
        </foreach>

    </insert>

ps,另附一句,mybatis-plus中有一句话,只做增强不做改变,引入它不会对现有工程产生影响,它的意思是什么呐?就是你引入了mybatis-plus的jar包后是可以直接mybatis在xml中写sql特性的,无需再做其他配置

附一下pom文件吧

<dependencies>
        <!--<dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.0.0</version>
        </dependency>-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>2.3.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <version>2.3.0.RELEASE</version>
        </dependency>
        <!--简化代码的工具包-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
            <version>1.18.12</version>
        </dependency>
        <!--mybatis-plus的springboot支持-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.1.1</version>
        </dependency>
        <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.49</version>
        </dependency>
    </dependencies>

    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </resources>
    </build>

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • MyBatis适用于Oracle的批量插入/更新(MyBatis Batch Insert/Update For Oracle)
    问题 我最近开始学习使用myBatis。现在面对这样的情况,我需要通过WebService不断获取新的对象列表,然后对于该列表,我需要通过以下方式将每个对象插入/更新到oracle DB表中: myBatis。 棘手的是,我不能每次都简单地进行批量插入,因为某些对象可能已经存在于数据库中,对于这些记录,我需要更新它们的字段而不是新插入。 我当前的解决方案可能非常愚蠢,使用Java,从Web服务构建对象列表,遍历每个对象,执行myBatis选择(如果它不为null(数据库中已经存在)),然后执行myBatis更新; 否则,请为此新对象进行myBatis插入。 功能已实现。 但是我的技术主管说这效率很低,因为使用Java进行for循环并逐个插入/更新会消耗很多系统资源。 他建议我通过传入对象列表来使用myBatis进行批量插入。 在myBatis中批量插入很简单,但是,由于我并不是纯粹地插入(对于现有记录,我需要进行更新),因此我认为批量插入在这里不合适。 我已经为此搜索了一段时间,并且意识到也许我将需要使用“合并”而不是“插入”(对于Oracle)。 我在myBatis中搜索要合并的示例仅适用于一个对象,而不适用于批处理。 因此,我想了解专家是否可以为我提供一些示例,说明如何在MyBatis中进行批处理合并(编写Mapper的正确方法)? 回答1 就我而言,也存在相同的情况。
  • 为啥:使用mybatis-plus的批量插入接口特别慢?
    本人Java实习生,做项目时遇到困难如题。团队项目代码用的是mybatis-plus的IService接口的saveBatch方法,但速度特别慢。 我在网上搜关于saveBatch的资料,很少,只知道batchSize是分批处理时一次性处理的数据条数,它的本质是为了让开发者选取一个小于数据库支持的size值,以便碰到异常时可以针对提交的数据进行回滚。 下图是我项目运行时插入的数据条数和对应耗时。 可以通过配置什么的优化它吗?有使用Mybatis-plus遇到同样问题的吗?可以解决吗?求大神帮忙,万分感谢 上面的图二三是Mybatis-plus的IService接口的源码 1190条数据 java 要通过网络传输1190条sql,1190条网络请求 你还想多快.. 但是批量传输不应该这么慢的呀,而且我这数据量算小的了吧,看网上有对比批量传输和循环单条传输,也就是几秒几千条就完成了。 那就是你们那个公用方法有问题,你自己在mapper里面写一个,然后自己调lrc ,就好了 你的根本就不是批量执行,批量执行底层是调用的JDBC的batchExecute方法,一次提交大量数据,效率贼J8块。 参见preparedstatement的batchexecute 公用方法是Mybatis-Plus自己的,这么优秀的开源框架,按理来说应该不会有问题的呀,网上也没有人问类似的问题,好神奇
  • mybatis 批量插入mysql数据并根据唯一索引做自动去重判断的插入语句
    前言 此处为mybatis 操作mysql数据库实现批量插入。再根据表的唯一索引来判断数据是否重复,如果重复则更新,如果不重复则新增的写法 情景 对大量的数据进行写入数据库操作时,会出现这样的问题: 完全不一样一部分不一样 MySQL 中可以使用 REPLACE 和INSERT … ON DUPLICATE KEY UPDATE语法实现如上的思路。我使用的是第2个。 INSERT … ON DUPLICATE KEY UPDATE 简介 ON DUPLICATE KEY UPDATE 只需要在 INSERT 语句后面声明 ON DUPLICATE KEY UPDATE 子句,插入数据时 MySQL 就会根据唯一索引和主键进行判断,如果有唯一索引和主键有重复,则会跟新数据,否则会插入数据。用法 service层 public void insertUserResource(List<UserResourceEntity> userResourceEntitieList){ resourceDao.insertUserResource(userResourceEntitieList); } mapper层 <insert id="insertUserResource" parameterType="com.tfjybj.integral.entity
  • 使用MyBatis向MySql数据库批量insert插入100万条数据
    目录 1 场景2 MySQL数据库user表3 创建实体4 批量插入接口5 Mapper配置SQL语句6 `max_allowed_packet`数据库参数设置7 测试(根据不同的需求编写) 1 场景 有时候在创建数据库之后,有一些已经存在的数据需要插入到数据库,这就涉及到了数据的大规模批量插入了,如果循环使用insert into table values(a,b,c)插入,速度将会比较慢,应该大部分时间都在事务的提交创建上了,mysql提供了批量插入的功能,可以使用insert into table values(a1,b1,c1),(a2,b2,c2),(a3,b3,c3)……;当然可以使用mysql的存储过程,我这里使用了mybatis进行批量插入; 2 MySQL数据库user表 +---------+------------------+--------+-------+-----------+---------+ | Field | Type | Null | Key | Default | Extra | |---------+------------------+--------+-------+-----------+---------| | id | int(10) unsigned | NO | | <null> | | | name | varchar(4
  • MyBatis-Plus(CRUD的使用)
    MyBatis-Plus(CRUD的使用) 1.在控制层的调用(controller) 说明: mybatis-plus封装了业务(IService)接口方法,来给控制层调用。其中,封装 CRUD 采用 get 查询单行 remove 删除 list 查询集合 page 分页mybatis-plus里面的泛型 T 为任意实体对象mybatis-plus里面的对象 Wrapper 为 条件构造器插入,修改的事务mybatis-plus已经帮我们写好了,无需担心事务 1.插入(存储数据) save方法 // 插入一条记录(选择字段,策略插入) boolean save(T entity); // 插入(批量) boolean saveBatch(Collection<T> entityList); // 插入(批量插入,其中batchSize为插入批次数量) boolean saveBatch(Collection<T> entityList, int batchSize); 例子: 1.//插入user对象数据 userService.save(User); 2.//批量插入user对象 List<User> list = new ArrayList<>(); userService.saveBatch(user); 3.//批量插入10次user对象 List<User> list
  • 【MyBatis】MyBatis之实用场景
    目录 一、PageHelper 1. 导入依赖 2. mybatis-config.xml加上分页插件 二、 批量插入 三、 自定义类型处理器处理枚举 1. 写一个枚举类 2. mybatis-config.xml配置类型处理器 一、PageHelper PageHelper是MyBatis中非常方便的第三方分页 插件 1. 导入依赖 <dependency> <groupId>com.github.jsqlparser</groupId> <artifactId>jsqlparser</artifactId> <version>3.0</version> </dependency> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.1.10</version> </dependency> 2. mybatis-config.xml加上分页插件 <plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin> </plugins> @Controller public class EmployeeController {
  • Mybatis代码自动生成工具,生成批量插入和批量更新方法
    mybatis-generator-gui-plus 本来一直用 IDEA 中的「MyBatisCodeHelperPro」插件来生成批量插入和更新方法方法来着,没想到后面改成订阅收费,使用也不是特别频繁,就不是很想购买。本想找找其他生成批量插入更新的工具,找了一圈,发现都不是特别好用,索性自己基于「mybatis-generator-core」写一套代码生成工具来生成批量插入和更新方法。图形界面完全基于「mybatis generator-gui」,这个工具非常不错,之前一直用的这个工具,可惜就是没有批量插入和更新方法,提了Issues也长久不更新,索性自己扩展一下吧。在「mybatis-generator-core」官方提供的基础方法之上扩展出了批量插入和更新方法,还有平时常用的查询方法。因此取名为「mybatis-generator-gui-plus」,后面生成代码就快速多了,自己够用了。运行前一定先看文档。 Github 项目地址:mybatis-generator-gui-plus Gitee 项目地址:mybatis-generator-gui-plus mybatis-generator-gui-plus是基于 mybatis-generator-gui 扩展的工具,区别在于只在基础功能上扩展了批量操作的方法和常用的方法,其他几乎没有差别。 增加的方法说明:
  • MyBatis-plus+达梦数据库出现的坑
    学海无涯,旅“途”漫漫,“途”中小记,如有错误,敬请指出,在此拜谢! 前情提要 今日,公司的项目使用的是达梦数据库7+jdk1.8+麒麟系统+SpringBoot+Mybatis-plus。走过了很多坑,特此记录,供给同胞们警醒。 问题汇总 1.Mybatis-plus的支持性 根据官网上的提供,mybatis-plus的generator自动生成器,在3.3.0以上的版本才能支持,所以如果想使用自动生成器的小伙伴,建议使用3.3.0以上的版本。 3.3.0以上的版本对达梦的支持性更强,建议直接使用3.3.0 2.Mybatis-plus的save&saveBatch 作为超级好用的Mybatis-plus,里面封装了好多方法供开发人员使用。但是有些方法是不兼容达梦数据库的。比如博主现在发现的save和saveBatch方法。所以此处建议使用自己手写的insert的sql来实现。 save和saveBatch方法,经过排查,发现是因为mp的save和saveBatch方法,生成的sql是有换行符的,这个换行符达梦数据库的部分版本是无法解析的。(可能是因为部分配置原因,也可能是因为版本原因。跟mp的研发人员交流说是达梦的问题,询问达梦的支持人员,没有解决,所以不了了之了。) 3.保存方法返回数据库id 一般在保存的方法的xml中,会加入一下语句,来确保方法会返回id。
  • 使用foreach与mybatis进行批量插入(using foreach to do batch insert with mybatis)
    问题 我正在使用 mybatis,我想在某个表中插入一个 ArrayList。 好吧,在映射器中使用 foreach ,这最终会导致 oracle 异常 ORA_00933 。 这是 mybatis 映射器: <insert id="batchInsert" parameterType="java.util.List"> insert into SYS_ROLES_PERMISSIONGROUP (role_id, permissiongroup_id) values <foreach collection="list" item="model" index="index" separator=","> (#{model.role_id}, #{model.permissiongroup_id}) </foreach> </insert> org.springframework.jdbc.BadSqlGrammarException: ### Error updating database. Cause: java.sql.SQLSyntaxErrorException: ORA-00933: SQL 命令未正确结束### The error may involve com.gaotime.platform.system.mapper
  • MyBatis动态SQL(认真看看, 以后写SQL就爽多了)
    MyBatis 令人喜欢的一大特性就是动态 SQL。在使用 JDBC 的过程中, 根据条件进行 SQL 的拼接是很麻烦且很容易出错的。MyBatis 动态 SQL 的出现, 解决了这个麻烦。MyBatis通过 OGNL 来进行动态 SQL 的使用的。目前, 动态 SQL 支持以下几种标签:1 数据准备为了后面的演示, 创建了一个 Maven 项目 mybatis-dynamic, 创建了对应的数据库和表DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `student_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '编号', `name` varchar(20) DEFAULT NULL COMMENT '姓名', `phone` varchar(20) DEFAULT NULL COMMENT '电话', `email` varchar(50) DEFAULT NULL COMMENT '邮箱', `sex` tinyint(4) DEFAULT NULL COMMENT '性别', `locked` tinyint(4) DEFAULT NULL COMMENT '状态(0:正常,1:锁定)', `gmt_created` datetime DEFAULT
  • MyBatis 框架中动态 SQL 应用分析,之后写 SQL 就爽很多了
    MyBatis 令人喜欢的一大特性就是动态 SQL。在使用 JDBC 的过程中, 根据条件进行 SQL 的拼接是很麻烦且很容易出错的。MyBatis 动态 SQL 的出现, 解决了这个麻烦。MyBatis通过 OGNL 来进行动态 SQL 的使用的。目前, 动态 SQL 支持以下几种标签:1 数据准备为了后面的演示, 创建了一个 Maven 项目 mybatis-dynamic, 创建了对应的数据库和表DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `student_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '编号', `name` varchar(20) DEFAULT NULL COMMENT '姓名', `phone` varchar(20) DEFAULT NULL COMMENT '电话', `email` varchar(50) DEFAULT NULL COMMENT '邮箱', `sex` tinyint(4) DEFAULT NULL COMMENT '性别', `locked` tinyint(4) DEFAULT NULL COMMENT '状态(0:正常,1:锁定)', `gmt_created` datetime DEFAULT
  • MyBatis 框架中动态 SQL 应用分析,之后写 SQL 就爽很多了
    MyBatis 令人喜欢的一大特性就是动态 SQL。在使用 JDBC 的过程中, 根据条件进行 SQL 的拼接是很麻烦且很容易出错的。MyBatis 动态 SQL 的出现, 解决了这个麻烦。MyBatis通过 OGNL 来进行动态 SQL 的使用的。目前, 动态 SQL 支持以下几种标签:1 数据准备为了后面的演示, 创建了一个 Maven 项目 mybatis-dynamic, 创建了对应的数据库和表DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `student_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '编号', `name` varchar(20) DEFAULT NULL COMMENT '姓名', `phone` varchar(20) DEFAULT NULL COMMENT '电话', `email` varchar(50) DEFAULT NULL COMMENT '邮箱', `sex` tinyint(4) DEFAULT NULL COMMENT '性别', `locked` tinyint(4) DEFAULT NULL COMMENT '状态(0:正常,1:锁定)', `gmt_created` datetime DEFAULT
  • 使用mybatis plus批量插入数据
    之前用mybaits插入数据时,需要在sql语句中作特殊的处理,然后才能够批量插入数据。 今天试验了一下mybatis plus的批量插入方式,简直太简单了,太爽了,真真切切的体会到了科技就是生产力。。 直接上代码,一条语句就搞定,太爽了!!! @Autowired private OrderDetailsService orderDetailsService; // 进行订单细节插入 List<OrderDetails> orderDetailsList = order.getOrderDetailsList(); for (OrderDetails orderDetails : orderDetailsList) { orderDetails.setOrderid(order.getId()); orderDetails.setCreatTime(Integer.valueOf(DateUtils.getCurrDateTimeStamp())); orderDetails.setUpdTime(Integer.valueOf(DateUtils.getCurrDateTimeStamp())); } orderDetailsService.insertBatch(orderDetailsList); 来源:https://blog.csdn.net/yhj_911
  • mybatis、mybatisPlus批量插入问题
    项目场景: 根据业务使用mybatisPlus,数据库使用postgresql,将原先旧的数据删除后,再计算后将新的数据添加 问题描述: 先删除数据后,从其他数据表中获取数据,进行逻辑计算后,使用mybatisPlus saveBatch方法插入。控制台打印插入sql,但是表中没数据,删除的数据也没删除掉,控制台也没有异常 this.saveBatch(list) 原因分析: 1、删除的数据没有成功删除,插入的数据也没有成功插入 2、数据库默认是自动事务提交 3、可能是有异常,导致事务回滚l。而且控制台打印的sql也不全 4、mybatisPlus 批量插入,只要有一条插入失败就会全部数据回滚 https://my.oschina.net/zjllovecode/blog/1818716 解决方案: debug后,在批量插入的时候提示:java.lang.reflect.InvocationTargetException 但是这个异常没有抛出,看了下报错的插入数据。有个字段内容 为 255.20000000000002 超出数据库长度 修改好数据,就能插入成功了 来源:https://blog.csdn.net/qq_35852248/article/details/115350951
  • SpringBoot-2:多个案例带你玩转Mybatis
    Mybatis使用详解和入门案例 1 MyBatis快速入门1.1 依赖引入1.2 配置文件 2 基于注解使用MyBatis2.1 基础使用2.2 参数传递2.3 字段映射 3 基于XML使用MyBatis3.1 基础使用3.2 高级操作3.2.1 复用SQL3.2.2 if标签实现参数校验3.2.3 foreach实现批量操作 3.3 总结JdbcType对应关系parameterType 4 附件5.1 测试数据5.2 完整pom.xml5.3 完整mapper.xml MyBatis 是一款标准的 ORM 框架,支持普通的 SQL 查询、存储过程和高级映射,它消除了几乎所有的 JDBC 代码和参数的手工设置,并实现对结果集的检索封装,让我们可以在程序中极简地操作数据库。 对象关系映射(Object Relational Mapping)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。 学完本文,你将掌握: MyBatis的基本使用xml中有哪些常用标签如何实现动态SQL如何实现批量更新和插入parameterType作用是什么?可选项有哪些? 1 MyBatis快速入门 接下来,我们开始使用MyBatis体验一下吧。 1.1 依赖引入 SpringBoot
  • mybatis常见问题汇总
    这里写目录标题 1. 什么是Mybatis?2. mybatis的优点:3. MyBatis框架的缺点:4.MyBatis与Hibernate有哪些不同:5.#{}和${}的区别是什么?6.当实体类中的属性名和表中的字段名不一样 ,怎么办 ?7.模糊查询like语句该怎么写?8.通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?9.Mybatis是如何进行分页的?分页插件的原理是什么?10.Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?11.如何执行批量插入?12.如何获取自动生成的(主)键值?13.Mybatis 动态 sql 有什么用?执行原理?有哪些动态 sql?14.MyBatis实现一对多有几种方式,怎么操作的?15.Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?16.Mybatis的一级、二级缓存:17.什么是MyBatis的接口绑定?有哪些实现方式?18.使用MyBatis的mapper接口调用时有哪些要求?19. Mybatis 执行批量插入,能返回数据库主键列表吗?20.Mybatis 是如何进行分页的?分页插件的原理是什么?21.简述 Mybatis 的插件运行原理,以及如何编写一个插件?22.讲下 MyBatis 的缓存23
  • mybatis-plus/mybatis的组件们——拦截器、字段填充器、类型处理器、表名替换、SqlInjector
    最近有个练手的小例子,大概就是配置两个数据源,从一个数据源读取数据写到另一个数据源,虽然最后做了出来,但是不支持事务。。。就当是对mybatis-plus/mybatis组件使用方式的记录吧,本次例子使用的仍是mybatis-plus 回忆一下mybatis核心对象: Configuration 初始化基础配置,比如MyBatis的别名等,一些重要的类型对象,如,插件,映射器,ObjectFactory和typeHandler对象,MyBatis所有的配置信息都维持在Configuration对象之中SqlSessionFactory SqlSession工厂SqlSession 作为MyBatis工作的主要顶层API,表示和数据库交互的会话,完成必要数据库增删改查功能Executor MyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护StatementHandler 封装了JDBC Statement操作,负责对JDBC statement 的操作,如设置参数、将Statement结果集转换成List集合。ParameterHandler 负责对用户传递的参数转换成JDBC Statement 所需要的参数,ResultSetHandler 负责将JDBC返回的ResultSet结果集对象转换成List类型的集合;TypeHandler
  • 给你的MyBatis-Plus装上批量插入的翅膀
    写在前面:2020年面试必备的Java后端进阶面试题总结了一份复习指南在Github上,内容详细,图文并茂,有需要学习的朋友可以Star一下! GitHub地址:https://github.com/abel-max/Java-Study-Note/tree/master 前言 大家有用过MyBatis-Plus(简称MP)的都知道它是一个MyBatis的增强工具,旨在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。 特点 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作支持自定义全局通用操作:支持全局通用方法注入( Write once, use
  • Vue前端上传EXCEL文件,后端(springBoot+MyBatis+MySQL)解析EXCEL并批量插入/更新数据库
    文章目录 Vue前端后端controller层service层:如何解析Excel文件MyBatis:实现批量插入在mysql中设置唯一索引Unique IndexMySQL中的insert ignore into, replace into等的一些用法总结 Vue前端 前端主要用了element-ui的upload组件。 <el-upload class="filter-item" name="excelFile" :action="uploadUrl()" :on-error="uploadFalse" :on-success="uploadSuccess" :before-upload="beforeAvatarUpload" :limit="1" accept=".xlsx,.xls" :show-file-list="false" :file-list="fileList"> <el-button style="margin-left: 10px;" icon="el-icon-edit" type="primary">批量上架</el-button> </el-upload> 关于每个字段的意思: uploadUrl() 是后台接口(接受上传的文件并做后端的逻辑处理) 注意:uploadUrl方法中,直接return的是你的后端URL接口,可以是相对路径
  • Mybatis-plus的CURD操作详解
    基础知识 前情提要:这只是我个人的一个笔记,分享给大家是希望像我这样的初学者,能够更好的学习,如果有什么问题欢迎指出,谢谢大家!! 当然最重要的还是看文档 , CURD的文档🔗CURD 文档中有一些我截图下来放在了文章中,有一些希望大家自己去看噢! mybatis 在持久层框架比较火 , 一般项目都是基于ssm . (ssm : spring+springMVC+mybatis) mybatis-plus 称为增强mybatis ; mybatis-plus 对于mybatis只做增强,不做改变 . ----> 封装了一些 curd 方法 , 我们不需要再写 xml 了 . (CURD定义了数据库的基本原子操作 . 它代表创建(Create)、更新(Update)、读取(Retrieve)和删除(Delete)操作。) 使用pom.xml配置依赖的时候,集成mybatis-plus要把mybatis、mybatis-spring去掉,避免冲突; lombok工具,添加了它的依赖,开发工具再安装Lombok插件,就可以使用它了,最常用的用法就是在实体类中使用它的@Data注解,这样实体类就不用写set、get、toString等方法了。 一些参数 @Data是Lombok插件的一个注解,这样实体类就不用写set,get这些方法了 . @TableName("…") 入参value