mybatis plus insertselect
时间: 2023-06-05 10:47:39 浏览: 410
Mybatis Plus是一款优秀的Mybatis增强工具,它提供了一系列方便实用的封装,其中insertselect就是其中之一。
insertselect可以实现将一个查询结果作为数据源,将数据批量插入到目标表中。在实际开发中,如果需要将一个表中的部分数据重新插入到同一表或者其他表中,此时就可以使用insertselect。此外,insertselect还可以用于数据迁移的场景,将数据从一个数据库迁移到另一个数据库中,减少手动操作带来的出错率和工作量。
使用insertselect需要指定源表和目标表,以及要插入的字段和查询使用的字段。Mybatis Plus会将查询到的数据与目标表的字段一一对应,将符合条件的数据批量插入到目标表中。在执行过程中,还可以使用自定义SQL注入,对数据进行处理和过滤,满足不同场景的需求。
总而言之,insertselect是Mybatis Plus中非常实用的一项功能。它能够极大地提高开发效率,减少手动操作的出错率,使代码更加简洁易懂。如果您还没有尝试过Mybatis Plus的insertselect功能,建议您在实际开发中应用一下,并结合其他功能一同使用,相信会让您的开发变得更加高效。
相关问题
mybatis plus @select
@select是MyBatis-Plus框架中的注解,用于编写SQL查询语句。[3] MyBatis-Plus是在MyBatis基础之上进行的扩展,提供了更多的便利功能,包括注解方式编写SQL语句。使用@select注解可以在DAO层中直接编写查询语句,省去了编写mapper.xml文件的步骤。 这种注解方式简化了代码的编写,提高了开发效率。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* [Mybatis](https://blog.csdn.net/yuanlcj/article/details/115113642)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
- *3* [在mybatis-plus项目中自带要编写sql语句,@select注解的使用](https://blog.csdn.net/qq_49249150/article/details/127578898)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]
mybatis plus mapper.insert没有返回主键id
### 回答1:
Mybatis plus是一款基于Mybatis的增强工具,它在Mybatis的基础上进行了扩展,提供了更加便捷的使用方式。在使用mybatis plus的mapper.insert方法时,如果没有返回主键id,这可能是由于数据源连接池未配置正确导致的。常见设置方式是在application.yml或application.properties文件中增加如下配置:
```
# datasource
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.initialSize=1
spring.datasource.maxActive=10
spring.datasource.minIdle=1
spring.datasource.maxWait=60000
spring.datasource.timeBetweenEvictionRunsMillis=60000
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=SELECT 1
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false
```
如果以上配置项设置正确,但仍然无法返回主键id,则可以考虑通过在实体类中使用@TableId注解指定主键生成策略来解决问题。例如:
```
@TableId(value = "id", type = IdType.AUTO)
private Long id;
```
通过指定type属性值为IdType.AUTO,可以让Mybatis plus自动根据数据库自增长生成主键id。
当然,如果以上解决方法均无效,则可以考虑在mapper.xml文件中使用<selectKey>标签手动获取主键id。
总的来说,使用Mybatis plus时如果mapper.insert无法返回主键id要检查数据源连接池配置是否正确,并注意实体类中主键的生成策略设置。
### 回答2:
Mybatis Plus是一个基于Mybatis的增强工具库,提供了很多便捷的方法和功能。Mapper.insert方法是其中一个经常被使用的方法,它可以将一个实体类对象插入到数据库中。但是,在使用Mapper.insert方法插入数据的时候,有的时候我们会遇到一个问题,即没有返回主键id。
造成这种情况的原因是,当我们使用Mapper.insert方法插入数据时,如果实体类中没有主键id属性或者主键id属性的值为null,则Mybatis Plus默认使用数据库自增插入主键id。而这时,插入操作是通过SQL语句完成的,数据库返回的主键id并不会映射到实体类的主键id属性上,因此Mapper.insert方法无法返回主键id值。
为了解决这个问题,我们可以使用Mybatis Plus提供的两种方法:
1.使用注解@TableId(type= IdType.AUTO)标注实体类的主键id属性,表示主键id是自增的,默认类型为雪花算法(63位随机自增的唯一ID),这样Mybatis Plus会在插入成功后将主键id赋值到实体类的主键id属性上。
2.在Mapper.insert操作后,通过实体类对象获取主键id值,可以使用Mybatis Plus提供的两种方法:
(1)实体类主键id属性用@TableId注解,并指定id生成策略,如自增:
User user = new User();
user.setName("test");
user.setAge(20);
user.setSex(1);
user.setAddress("test");
mapper.insert(user);
Long id = user.getId();
(2)实体类主键id属性不用@TableId注解,Mapper.insert方法后使用数据库的CURRVAL或NEXTVAL获取主键id:
User user = new User();
user.setName("test");
user.setAge(20);
user.setSex(1);
user.setAddress("test");
mapper.insert(user);
Long id = (Long)SqlHelper.getObject(user, MetaObject.forObject(user), "id");
综上所述,Mybatis Plus Mapper.insert方法没有返回主键id,是因为实体类主键id属性没有映射到返回值里。我们可以使用@TableId注解或者getObject方法获取实体类主键id属性的值来解决这个问题。
### 回答3:
MyBatis Plus作为一个流行的ORM框架,大大简化了Java应用程序与数据库的交互。在使用MyBatis Plus中的Mapper接口进行数据插入时,如果使用Mapper.insert方法,可能会遇到无法返回主键id的情况。
造成该现象的主要原因在于Mapper.insert方法使用了另一个名为SqlMethod.INSERT_ONE的私有静态方法,该方法会忽略对主键id的处理。实际上,该方法的insert语句并没有包含主键列,所以也就无法返回主键id了。
在这种情况下,我们可以使用Mapper.insert方法的重载版本,即Mapper.insert(T entity, boolean selective)。其中,第二个参数为一个布尔值,表示是否选择只插入非空字段。通过将该参数置为false,我们可以强制Mapper插入所有字段,包括主键列,从而获得正确的主键id。例如:
```
User user = new User();
user.setName("张三");
user.setAge(20);
user.setEmail("zhangsan@qq.com");
mapper.insert(user, false); //将第二个参数置为false
System.out.println("新增用户id:" + user.getId());
```
除了使用重载方法之外,我们还可以在实体类的主键字段上添加一个注解,指示该字段为自增主键。这样,MyBatis Plus就会自动处理主键id,在插入数据后将主键id赋值给实体对象的主键字段。例如:
```
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
//...省略getter和setter方法
}
```
在实际开发中,我们可以根据具体场景选择使用哪种方式获取插入数据的主键id,以便更好地处理业务逻辑。
阅读全文