这篇文章主要介绍了MyBatis的批量查询方法有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MyBatis的批量查询方法有哪些文章都会有所收获,下面我们一起来看看吧。
@RestController
@RequestMapping("/mybatis3/user")
@RequiredArgsConstructor
public class UserController {
private final IUserService iUserService;
@GetMapping("/one")
public Long one(){
return iUserService.add();
}
}
Long add();
@Service
@RequiredArgsConstructor
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
private final UserMapper userMapper;
@Override
public Long add() {
long start = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
User user = new User();
user.setUsername("name"+i);
user.setPassword("password"+i);
userMapper.insertUsers(user);
}
long end = System.currentTimeMillis();
System.out.println("耗时:"+( end - start ) + "ms");
return (end-start);
}
}
Integer insertUsers(User user);
<insert id="insertUsers" >
insert into user(username,password)
values (#{username}, #{password})
</insert>
最终耗时:14s多
@RestController
@RequestMapping("/mybatis3/user")
@RequiredArgsConstructor
public class UserController {
private final IUserService iUserService;
@GetMapping("/one")
public Long one(){
return iUserService.add();
}
}
Long add2();
@Service
@RequiredArgsConstructor
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
private final UserMapper userMapper;
// 手动开启sql的批量提交
private final SqlSessionTemplate sqlSessionTemplate;
@Override
public Long add2(){
//关闭自动提交
SqlSession sqlSession = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH, false);
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
long start = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
User user = new User();
user.setUsername("name"+i);
user.setPassword("password"+i);
mapper.insertUsers(user);
}
//自动提交SQL
sqlSession.commit();
long end = System.currentTimeMillis();
System.out.println("耗时:"+( end - start ) + "ms");
return (end-start);
}
}
平均:0.12s
@RestController
@RequestMapping("/mybatis3/user")
@RequiredArgsConstructor
public class UserController {
private final IUserService iUserService;
@GetMapping("/one3")
public Long one3(){
return iUserService.add3();
}
}
Long add3();
@Service
@RequiredArgsConstructor
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
private final UserMapper userMapper;
@Override
public Long add3(){
long start = System.currentTimeMillis();
List<User> userList = new ArrayList<>();
User user;
for (int i = 0; i < 10000; i++) {
user = new User();
user.setUsername("name"+i);
user.setPassword("password"+i);
userList.add(user);
}
userMapper.insertUsersThree(userList);
long end = System.currentTimeMillis();
System.out.println("耗时:"+( end - start ) + "ms");
return (end-start);
}
}
Integer insertUsersThree(List<User> userList);
<insert id="insertUsersThree">
insert into user(username,password)
values
<foreach collection="userList" item="user" separator=",">
(#{user.username},#{user.password})
</foreach>
</insert>
@RestController
@RequestMapping("/mybatis3/user")
@RequiredArgsConstructor
public class UserController {
private final IUserService iUserService;
@GetMapping("/one4")
public Long one4(){
return iUserService.add4();
}
}
Long add4();
@Service
@RequiredArgsConstructor
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
private final UserMapper userMapper;
@Override
public Long add4() {
long start = System.currentTimeMillis();
List<User> userList= new ArrayList<>();
User user ;
for (int i = 0; i < 10000; i++) {
user = new User();
user.setUsername("name"+i);
user.setPassword("password"+i);
userList.add(user);
}
saveBatch(userList);
long end = System.currentTimeMillis();
System.out.println("耗时:"+( end - start ) + "ms");
return (end-start);
}
}
直接报错:
看报错信息:
长串:Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: com.huang.mybatis3.mapper.UserMapper.insert (batch index #1) failed. Cause: java.sql.BatchUpdateException: Data truncation: Out of range value for column ‘id’ at row 1
; Data truncation: Out of range value for column ‘id’ at row 1; nested exception is java.sql.BatchUpdateException: Data truncation: Out of range value for column ‘id’ at row 1] with root cause短串:Data truncation: Out of range value for column ‘id’ at row 1
翻译一下:
可以发现就是我们的id超出范围:
int类型改为bigint即可
故此我们可以得出一个结论:设置数据库id的时候设置为bigint还是蛮好的哈
平均时间:0.2s
InsertBatchSomeColumn方法了解
这个类的注解就写的很明白
扩展这个InsertBatchSomeColumn方法
@Slf4j
public class EasySqlInjector extends DefaultSqlInjector {
@Override
public List<AbstractMethod> getMethodList(Class<?> mapperClass, TableInfo tableInfo) {
// 注意:此SQL注入器继承了DefaultSqlInjector(默认注入器),调用了DefaultSqlInjector的getMethodList方法,保留了mybatis-plus的自带方法
List<AbstractMethod> methodList = super.getMethodList(mapperClass, tableInfo);
methodList.add(new InsertBatchSomeColumn(i -> i.getFieldFill() != FieldFill.UPDATE));
log.info("扩展的getMethodList方法被框架调用了");
return methodList;
}
}
扩展的方法注入bean容器
/**
* @author Stone
* @date 2023/1/3
* @apiNote
*/
@Configuration
public class MybatisPlusConfig {
@Bean
public EasySqlInjector sqlInjector(){
return new EasySqlInjector();
}
}
创建一个Mapper去实现我们的扩展的飞方法
public interface EasySqlInjectMapper<T> extends BaseMapper<T> {
/**
* 批量插入 仅适用于mysql
*
* @param entityList 实体列表
* @return 影响行数
*/
Integer insertBatchSomeColumn(Collection<T> entityList);
}
业务层
@Override
public Long add5() {
long start = System.currentTimeMillis();
List<User> userList= new ArrayList<>();
User user ;
for (int i = 0; i < 10000; i++) {
user = new User();
user.setUsername("name"+i);
user.setPassword("password"+i);
userList.add(user);
}
userMapper.insertBatchSomeColumn(userList);
long end = System.currentTimeMillis();
System.out.println("耗时:"+( end - start ) + "ms");
return (end-start);
}
耗时: 0.2 s
关于“MyBatis的批量查询方法有哪些”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“MyBatis的批量查询方法有哪些”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注亿速云行业资讯频道。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。