卿¥å¸¸çä¸å¡éæ±å¼åè¿ç¨ä¸ï¼æ¹éæå ¥å±äºé常常è§çcaseï¼å¨mybatisçåæ³ä¸ï¼ä¸è¬æä¸é¢ä¸ç§ä½¿ç¨å§¿å¿
- å个æå ¥ï¼ä¸å¡ä»£ç ä¸for循ç¯è°ç¨
- <foreach>æ ç¾æ¥æ¼æ¥æ¹éæå ¥sql
- å¤ç¨ä¼è¯ï¼æåå°æ¹éæå ¥æ¹å¼
I. ç¯å¢é ç½®
æä»¬ä½¿ç¨SpringBoot + Mybatis + MySqlæ¥æå»ºå®ä¾demo
- springboot: 2.2.0.RELEASE
- mysql: 5.7.22
1. 项ç®é ç½®
<dependencies>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
æ ¸å¿çä¾èµmybatis-spring-boot-starterï¼è³äºçæ¬éæ©ï¼å°mvnä»åºä¸ï¼æ¾ææ°ç
å¦å¤ä¸ä¸ªä¸å¯è·åçå°±æ¯dbé 置信æ¯ï¼appliaction.yml
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/story?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password:
2. æ°æ®åºè¡¨
ç¨äºæµè¯çæ°æ®åº
CREATE TABLE `money` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL DEFAULT '' COMMENT 'ç¨æ·å',
`money` int(26) NOT NULL DEFAULT '0' COMMENT 'é±',
`is_deleted` tinyint(1) NOT NULL DEFAULT '0',
`create_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´',
`update_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´',
PRIMARY KEY (`id`),
KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=551 DEFAULT CHARSET=utf8mb4;
II. æ¹éæå ¥
1. å个æå ¥ï¼æ¹éè°ç¨æ¹å¼
è¿ç§æ¹å¼çè§£èµ·æ¥æç®åï¼ä¸ä¸ªåç¬çæå ¥æ¥å£ï¼ä¸å¡ä¸å¾ªç¯è°ç¨å³å¯
@Mapper
public interface MoneyInsertMapper {
/**
* åå
¥
* @param po
* @return
*/
int save(@Param("po") MoneyPo po);
}
对åºçxmlå¦ä¸
<resultMap id="BaseResultMap" type="com.git.hui.boot.mybatis.entity.MoneyPo">
<id column="id" property="id" jdbcType="INTEGER"/>
<result column="name" property="name" jdbcType="VARCHAR"/>
<result column="money" property="money" jdbcType="INTEGER"/>
<result column="is_deleted" property="isDeleted" jdbcType="TINYINT"/>
<result column="create_at" property="createAt" jdbcType="TIMESTAMP"/>
<result column="update_at" property="updateAt" jdbcType="TIMESTAMP"/>
</resultMap>
<insert id="save" parameterType="com.git.hui.boot.mybatis.entity.MoneyPo" useGeneratedKeys="true" keyProperty="po.id">
INSERT INTO `money` (`name`, `money`, `is_deleted`)
VALUES
(#{po.name}, #{po.money}, #{po.isDeleted});
</insert>
使ç¨å§¿å¿å¦ä¸
private MoneyPo buildPo() {
MoneyPo po = new MoneyPo();
po.setName("mybatis user");
po.setMoney((long) random.nextInt(12343));
po.setIsDeleted(0);
return po;
}
public void testBatchInsert() {
for (int i = 0; i < 10; i++) {
moneyInsertMapper.save(buildPo());
}
}
å°ç»
ä¸é¢è¿ç§æ¹å¼çä¼ç¹å°±æ¯ç®åç´è§ï¼ç¼ºç¹å°±æ¯dbäº¤äºæ¬¡æ°å¤ï¼å¼é大
2. BATCHæ¹å¤ç模å¼
é对ä¸é¢åä¸ä¸ªç®åçä¼åï¼ä½¿ç¨BATCHæ¹å¤ç模å¼ï¼å®ç°ä¼è¯å¤ç¨ï¼é¿å æ¯æ¬¡è¯·æ±é½éæ°ç»´æ¤ä¸ä¸ªé¾æ¥ï¼å¯¼è´é¢å¤å¼éï¼å¯ä»¥å¦ä¸æä½
try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH)) {
MoneyInsertMapper moneyInsertMapper = sqlSession.getMapper(MoneyInsertMapper.class);
for (int i = 0; i < 10; i++) {
moneyInsertMapper.save(buildPo());
}
sqlSession.commit();
}
说æ
- sqlSession.commitè¥æ¾å¨for循ç¯å ï¼åæ¯ä¿åä¸ä¸ªå°±æäº¤ï¼dbä¸å°±å¯ä»¥æ¥è¯¢å°
- è¥å¦ä¸é¢æ¾å¨for循ç¯å¤ï¼åææçä¸èµ·æäº¤
3. foreachå®ç°sqlæ¼æ¥
å¦å¤ä¸ç§ç´è§çæ³æ³å°±æ¯ç»è£ æ¹éæå ¥sqlï¼è¿éä¸»è¦æ¯åå©foreachæ¥å¤ç
<insert id="batchSave" parameterType="com.git.hui.boot.mybatis.entity.MoneyPo" useGeneratedKeys="true" keyProperty="id">
insert ignore into `money` (`name`, `money`, `is_deleted`)
values
<foreach collection="list" item="item" index="index" separator=",">
(#{item.name}, #{item.money}, #{item.isDeleted})
</foreach>
</insert>
对åºçmapperæ¥å£å¦ä¸
/**
* æ¹éåå
¥
* @param list
* @return
*/
int batchSave(@Param("list") List<MoneyPo> list);
å®é 使ç¨caseå¦ä¸
List<MoneyPo> list = new ArrayList<>();
list.add(buildPo());
list.add(buildPo());
list.add(buildPo());
list.add(buildPo());
list.add(buildPo());
list.add(buildPo());
moneyInsertMapper.batchSave(list);
å°ç»
使ç¨sqlæ¹éæå ¥çæ¹å¼ï¼ä¼ç¹æ¯dbäº¤äºæ¬¡æ°å°ï¼å¨æå ¥æ°é坿§æ¶ï¼ç¸æ¯äºåè å¼éæ´å°
缺ç¹ä¹å¾ææ¾ï¼å½ä¸æ¬¡æå ¥çæ°éå¤ªå¤æ¶ï¼ç»è£ çsqlæ¢æå¯è½ç´æ¥è¶ è¿äºdbçéå¶ï¼æ æ³æ§è¡äº
4. åæ¹BATCH模å¼
æ¥ä¸æ¥çè¿ç§æ¹å¼å¨ä¸é¢çåºç¡ä¸è¿è¡å¤çï¼åºå«å¨äºå¯¹Listè¿è¡æåï¼é¿å 䏿¬¡æå ¥å¤ªå¤æ°æ®ï¼å ¶æ¬¡å°±æ¯ç个æä½å¤ç¨ä¸ä¸ªä¼è¯ï¼é¿å æ¯ä¸æ¬¡ç交äºé½éå¼ä¸ä¸ªä¼è¯ï¼å¯¼è´é¢å¤çå¼é
å ¶ä½¿ç¨å§¿å¿å¦ä¸
try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false)) {
MoneyInsertMapper moneyInsertMapper = sqlSession.getMapper(MoneyInsertMapper.class);
for (List<MoneyPo> subList : Lists.partition(list, 2)) {
moneyInsertMapper.batchSave(subList);
}
sqlSession.commit();
}
ä¸ç¬¬äºç§ä½¿ç¨å§¿å¿å·®ä¸å¤ï¼åºå«å¨äºç»åäºç¬¬ä¸ç§æ¹éçä¼å¿ï¼å¯¹å¤§å表è¿è¡æåï¼å®ç°å¤ç¨ä¼è¯ + æ¹éæå ¥
5. å¦ä½éæ©
ä¸é¢ä»ç»äºå ç§ä¸åçæ¹éæå ¥æ¹å¼ï¼é£æä»¬åºè¯¥éæ©åªç§å¢ï¼
å°±æä¸ªäººçè§ç¹æ¥è®²ï¼2ï¼3ï¼4è¿ä¸ä¸ªå¨ä¸è¬çä¸å¡åºæ¯ä¸å¹¶æ²¡æå¤ªå¤§çåºå«ï¼å¦æå·²ç¥æ¯æ¬¡æ¹éåå ¥çæ°æ®ä¸å¤ï¼æ¯å¦å åæ¡ï¼ï¼é£ä¹ä½¿ç¨3å°±æ¯æç®åçcaseäº
妿æ¹éæå ¥çæ°æ®é常å¤ï¼é£ä¹æ¹æ¡4å¯è½æ´å ä¼é
妿æä»¬å¸æå¼åä¸ä¸ªæ¹éå¯¼æ°æ®çåè½ï¼é£ä¹æ¹æ¡2æ çæ¯æ´å¥½çéæ©