MyBatisのforeachのパフォーマンスの問題

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();
    }}

結果は以下の通りです。数十ミリ秒の差が、そう、少量のデータは、およそあまりにも心配することはありません。
ここに画像を挿入説明

おすすめ

転載: blog.csdn.net/weixin_38608626/article/details/89416559