目录
一:预备工作
1:pom依赖:
2:配置yml文件
3:公用的User类:
二、不同的实现方法
1:MyBatis利用For循环批量插入
(1)、编写UserService服务类,测试一万条数据耗时情况
(2)、编写UserMapper接口
(3)、编写UserMapper.xml文件
(4)、进行单元测试
(5)、结果输出
2:MyBatis的手动批量提交
(1)、其他保持不变,Service层作稍微的变化
(2)、结果输出
3:MyBatis以集合方式批量新增(推荐)
(1)、编写UserService服务类
(2)、编写UserMapper接口
(3)、编写UserMapper.xml文件
(4)、输出结果
4:MyBatis-Plus提供的SaveBatch方法
(1)、编写UserService服务
(2)、编写UserMapper接口
(3)、单元测试结果
5:MyBatis-Plus提供的InsertBatchSomeColumn方法(推荐)
(1)、编写EasySqlInjector 自定义类
(2)、定义核心配置类注入此Bean
(3)、编写UserService服务类
(4)、编写EasyBaseMapper接口
(5)、编写UserMapper接口
(6)、单元测试结果
myBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。
mybatis是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。
mybatis通过xml或注解的方式将要执行的各种statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。
MyBatis的主要设计目的就是让我们对执行SQL语句时对输入输出的数据管理更加方便,所以方便地写出SQL和方便地获取SQL的执行结果才是MyBatis的核心竞争力。
Mybatis的功能架构分为三层:
1、API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
2、数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
3、基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。
mysql
mysql-connector-java
runtime
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.2.2
com.baomidou
mybatis-plus-boot-starter
3.5.2
org.projectlombok
lombok
true
server:
port: 8080
spring:
datasource:
username: mysql用户名
password: mysql密码
url: jdbc:mysql://localhost:3306/数据库名字?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
mapper-locations: classpath:mapping/*.xml
@Data
public class User {
private int id;
private String username;
private String password;
}
@Service
public class UserService {
@Resource
private UserMapper userMapper;
public void InsertUsers(){
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" );
}
}
@Mapper
public interface UserMapper {
Integer insertUsers(User user);
}
INSERT INTO user (username, password)
VALUES(#{username}, #{password})
@SpringBootTest
class DemoApplicationTests {
@Resource
private UserService userService;
@Test
public void insert(){
userService.InsertUsers();
}
}
一万条数据总耗时:26348ms
@Service
public class UserService {
@Resource
private UserMapper userMapper;
@Resource
private SqlSessionTemplate sqlSessionTemplate;
public void InsertUsers(){
//关闭自动提交
SqlSession sqlSession = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH, false);
UserMapper userMapper = 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);
userMapper.insertUsers(user);
}
sqlSession.commit();
long end = System.currentTimeMillis();
System.out.println("一万条数据总耗时:" + (end-start) + "ms" );
}
}
一万条数据总耗时:24516ms
@Service
public class UserService {
@Resource
private UserMapper userMapper;
public void InsertUsers(){
long start = System.currentTimeMillis();
List 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.insertUsers(userList);
long end = System.currentTimeMillis();
System.out.println("一万条数据总耗时:" + (end-start) + "ms" );
}
}
@Mapper
public interface UserMapper {
Integer insertUsers(List userList);
}
INSERT INTO user (username, password)
VALUES
(#{user.username}, #{user.password})
一万条数据总耗时:521ms
@Service
public class UserService extends ServiceImpl implements IService {
public void InsertUsers(){
long start = System.currentTimeMillis();
List 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" );
}
}
@Mapper
public interface UserMapper extends BaseMapper {
}
一万条数据总耗时:24674ms
public class EasySqlInjector extends DefaultSqlInjector {
@Override
public List getMethodList(Class> mapperClass, TableInfo tableInfo) {
// 注意:此SQL注入器继承了DefaultSqlInjector(默认注入器),调用了DefaultSqlInjector的getMethodList方法,保留了mybatis-plus的自带方法
List methodList = super.getMethodList(mapperClass, tableInfo);
methodList.add(new InsertBatchSomeColumn(i -> i.getFieldFill() != FieldFill.UPDATE));
return methodList;
}
}
@Configuration
public class MybatisPlusConfig {
@Bean
public EasySqlInjector sqlInjector() {
return new EasySqlInjector();
}
}
public class UserService{
@Resource
private UserMapper userMapper;
public void InsertUsers(){
long start = System.currentTimeMillis();
List 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" );
}
}
public interface EasyBaseMapper extends BaseMapper {
/**
* 批量插入 仅适用于mysql
*
* @param entityList 实体列表
* @return 影响行数
*/
Integer insertBatchSomeColumn(Collection entityList);
}
@Mapper
public interface UserMapper extends EasyBaseMapper {
}
一万条数据总耗时:575ms