Mybatis foeach性能问题解析
1. POM文件的配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.2.RELEASE</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>web</artifactId>
<properties>
<mybatisplus-spring-boot-starter.version>1.0.5</mybatisplus-spring-boot-starter.version>
<mybatis-plus.version>2.1.9</mybatis-plus.version>
<mysql-connector-java.version>5.1.45</mysql-connector-java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--数据库-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-connector-java.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatisplus-spring-boot-starter</artifactId>
<version>${mybatisplus-spring-boot-starter.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
</dependencies>
</project>
2. application.xml文件配置
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=UTC
userName: root
password: 123456
mybatis-plus:
typeAliasesPackage: sedin.mybatis.entity
mapper-locations: classpath*:**/mapping/*.xml # 这里一定要配置, 不然无法扫描到mapper, 无法自动注入。
global-config:
refresh-mapper: true
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
3. Entity
@TableName("user")
public class User implements Serializable {
@TableField("id")
private Integer id;
@TableField("name") private String name;
@TableField("age") private Integer age;
@TableField("del_flag") private Integer delFlag;
public Integer getId() { return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getDelFlag() {
return delFlag;
}
public void setDelFlag(Integer delFlag) {
this.delFlag = delFlag;
}
@Override
public String toString() { return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", delFlag=" + delFlag +
'}';
}}
4. UserMapper
public interface UserMapper extends BaseMapper<User> {
List<Map<String, Object>> findAllUser(@Param("ids") String ids);
List<Map<String, Object>> findAllUserList(@Param("ids") List<String> ids);
List<String> findAllUserId();
}
5. UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="sedin.mybatis.mapper.UserMapper"> #这里对应上方的userMapper
<select id="findAllUser" parameterType="java.lang.String" resultType="java.util.Map">
select id, name, age FROM USER
WHERE id IN (#{ids})
</select>
<select id="findAllUserList" parameterType="java.lang.String" resultType="java.util.Map">
select id, name, age FROM USER
WHERE id IN
<foreach collection="ids" item="id" open="(" close=")" separator=",">
#{id} </foreach>
</select>
<select id="findAllUserId" resultType="java.lang.String">
select id FROM USER
</select>
</mapper>
6. 测试
@RestController
@RequestMapping(value = "/mybatis/user")public class UserController {
@Autowired
private UserMapper userMapper;
// 插入1000条数据。
@PostMapping(value = "/add")
public void add() {
int successCount = 0;
for (int i = 1, length = 1000; i <= length; i++) { User user = new User();
user.setId(i);
user.setAge(12 + i);
user.setDelFlag(0);
user.setName("Alex&" + i);
Integer insertSuccess = userMapper.insert(user);
if (insertSuccess == 1) { successCount++;
} }
System.out.println("success count: " + successCount);
}
@GetMapping(value = "/all")
public void findAll() {
List<String> allUserId = userMapper.findAllUserId();
String ids = getIds(allUserId);
Long startDate = System.currentTimeMillis();
List<Map<String, Object>> allUser = userMapper.findAllUser(ids);
Long endDate = System.currentTimeMillis();
System.out.println("ids: " + (endDate - startDate));
Long startDate1 = System.currentTimeMillis();
List<Map<String, Object>> allUser1 = userMapper.findAllUserList(allUserId);
Long endDate1 = System.currentTimeMillis();
System.out.println("List: " + (endDate1 - startDate1));
}
// 得到数据表中的所有id
private String getIds(List<String> ids) {
StringBuilder builder = new StringBuilder();
for (String id : ids) { builder.append(id);
builder.append(",");
}
builder.deleteCharAt(builder.length() - 1);
return builder.toString();
}}
结果如下。相差几十毫秒, 所以,数据量小的时候,不需要过于在意。