一厘灼、mybatis-plus概念
官方文檔:https://baomidou.com/guide/
mybatis使用方式是直接在xml中通過SQL語句操作數(shù)據(jù)庫鸯屿,包括簡單的CRUD操作都必須
要寫SQL語句星立,而mybatis-plus在Mybatis基礎(chǔ)上擴(kuò)展了許多功能晴竞,對CRUD的封裝勾拉、代碼
生成器等粘姜,很好的提高基于MyBatis 的項(xiàng)目開發(fā)效率鞠苟。
二乞榨、mybatis-plus的安裝配置
Spring Boot中快速使用
1,引入pom.xml依賴
1 <!-- mybatis-plus-->
2 <dependency>
3 <groupId>com.baomidou</groupId>
4 <artifactId>mybatis-plus-boot-starter</artifactId>
5 <version>3.0.3</version>
6 </dependency>
2当娱,配置application-test.yml
1 mybatis-plus:
2 configuration:
3 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
4 mapper-locations: classpath:mapping/*Mapping.xml #配置自定義sql時Mapping.xml掃描的路徑
5 type-aliases-package: com.example.demo.*.entity #配置三掃碼的實(shí)體類路徑
6 global-config:
7 db-config:
8 logic-delete-value: 1 # 邏輯已刪除值(默認(rèn)為 1)
9 logic-not-delete-value: 0 # 邏輯未刪除值(默認(rèn)為 0)
10 id-type: none
3吃既,Application 配置 MapperScan 注解
1 @MapperScan("com.example.demo.*.mapper")
2 @SpringBootApplication
3 public class DemoApplication {
4 public static void main(String[] args) {
5 SpringApplication.run(DemoApplication.class, args);
6 }
7 }三、mybatis-plus的代碼生成器
AutoGenerator 是 MyBatis-Plus 的代碼生成器跨细,通過 AutoGenerator 可以快速生成
Entity鹦倚、Mapper、Mapper XML冀惭、Service震叙、Controller 等各個模塊的代碼,極大的提升
了開發(fā)效率散休。
1媒楼,引入pom.xml依賴
1 <!-- mp自動代碼生成-->
2 <dependency>
3 <groupId>com.baomidou</groupId>
4 <artifactId>mybatis-plus-generator</artifactId>
5 <version>3.0.3</version>
6 </dependency>
7 <!-- velocity 模板引擎, 默認(rèn) -->
8 <dependency>
9 <groupId>org.apache.velocity</groupId>
10 <artifactId>velocity-engine-core</artifactId>
11 <version>2.0</version>
12 </dependency>
13
14 <!-- freemarker 模板引擎 -->
15 <dependency>
16 <groupId>org.freemarker</groupId>
17 <artifactId>freemarker</artifactId>
18 <version>2.3.23</version>
19 </dependency>
20
21 <!-- beetl 模板引擎 -->
22 <dependency>
23 <groupId>com.ibeetl</groupId>
24 <artifactId>beetl</artifactId>
25 <version>2.2.5</version>
26 </dependency>
2,引入代碼生成器模板類 MysqlGenerator.java
3戚丸,配置數(shù)據(jù)源地址划址、生成路徑和表名及其他自定義屬性3.1:配置生成路徑
1 //當(dāng)前路徑
2 String projectPath = System.getProperty("user.dir");
3 //輸出路徑
4 gc.setOutputDir(projectPath + "/src/main/java");
3.2: 數(shù)據(jù)源配置
1 // 數(shù)據(jù)源配置
2 DataSourceConfig dsc = new DataSourceConfig();
3 dsc.setUrl("jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8&useUnicode=true&useJ
4 // dsc.setSchemaName("public");
5 dsc.setDriverName("com.mysql.cj.jdbc.Driver");
6 dsc.setUsername("root");
7 dsc.setPassword("123456");
8 dsc.setDbType(DbType.MYSQL); //指定數(shù)據(jù)庫的類型
9 mpg.setDataSource(dsc);
3.3:包配置
1 // 包配置
2 PackageConfig pc = new PackageConfig();
3 pc.setParent("com.example.demo.test"); //自定義包的路徑
4 //pc.setModuleName("module"); //模塊名稱 設(shè)置后,會生成com.cxyxs.test.module,里面存放之前設(shè)
5 pc.setEntity("entity");
6 pc.setMapper("mapper");
7 pc.setService("service");
8 pc.setController("controller");
9 mpg.setPackageInfo(pc);
3.4:設(shè)置要生成的表
1 // 策略配置
2 StrategyConfig strategy = new StrategyConfig();
3 strategy.setInclude("t_test"); //設(shè)置映射的表名,可以設(shè)置多個表4:運(yùn)行main方法生成代碼文件
四昏滴、mybatis-plus的使用示例(單表猴鲫,一對多,多對多谣殊,條件
構(gòu)造語句)
示例暫用三張表做演示:(t_user用戶表拂共、t_role角色表、t_user_role用戶角色表)
以t_user表為例
(1)新建一個User表對應(yīng)實(shí)體類:
使用@TableName("t_user")進(jìn)行表名注解;
使用lombok插件的@Data注解在類上, 為類提供讀寫get/set屬性, 此外還提供了
equals()姻几、hashCode()宜狐、toString() 方法;
補(bǔ)充: lombok插件使用:
1):在pom.xml添加依賴
1 <dependency>
2 <groupId>org.projectlombok</groupId>
3 <artifactId>lombok</artifactId>
4 <version>1.18.2</version>
5 </dependency>
2):添加IDE工具對Lombok的支持
IDEA中引入Lombok支持如下: 點(diǎn)擊File-- Settings設(shè)置界面,搜索安裝
Lombok插件蛇捌;實(shí)體類繼承extends Model<User>抚恒,Model已經(jīng)實(shí)現(xiàn)了序列化,不用再手動實(shí)現(xiàn)序列化;
1 /**
2 * 用戶實(shí)體類
3 * @Author fansongsong
4 */
5 @Data
6 @TableName("t_user")
7 public class User extends Model<User> {
8 /**
9 * 主鍵
10 */
11 private String id;
12 /**
13 * 用戶名
14 */
15 private String name;
16 /**
17 * 手機(jī)
18 */
19 private String mobile;
20 ...
21 /**
22 * 用戶地址
23 */24 @TableField(exist = false)
25 @JsonProperty("address_name")
26 private String addressName;
27 }
這里幾個注解需要注意,第一是@tableName("t_user"),它是指定與數(shù)據(jù)庫表的關(guān)聯(lián),這里
的注解意味著你的數(shù)據(jù)庫里應(yīng)該有一個名為user的表與之對應(yīng),并且數(shù)據(jù)表的列名應(yīng)該就是
User類的屬性络拌;
如果有需要俭驮,對于User類中有而user表中沒有的屬性需要加注解@TableField(exist =
false),表示排除User類中的屬性;
如果有需要,把實(shí)體類字段名在以JSON形式返回前端時需要把該屬性的名稱序列化為另
外一個名稱@JsonProperty("address_name")注解 混萝;
(2) 新建Dao層接口UserMapper:
dao接口即UserMapper需要繼承mybatis-plus的Basemapper<User>接口,這樣就能夠使
用封裝好的很多通用方法,
使用@Repository注明dao層遗遵,在Spring中配置掃描包地址,然后生成dao層的bean逸嘀,之
后被注入到ServiceImpl中
1
2 /**
3 * 用戶數(shù)據(jù)庫控制層接口Mapper
4 * @Author fansongsong
5 */
6 @Repository
7 public interface UserMapper extends BaseMapper<User> {
8
9 /**
10 * 根據(jù)用戶id獲取用戶角色組信息
11 * @param id 用戶id
12 * @return UserRoleVO
13 */
14 UserRoleVO getUserRole(String id);
15 }
(3)新建UserMapping.xml配置文件:使用<mapper namespace="com.example.demo.user.mapper.UserMapper">與第二
步的UserMapper接口唯一綁定
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/myba
3 <mapper namespace="com.example.demo.user.mapper.UserMapper">
4
5 <resultMap id="BaseResultMap" type="com.example.demo.user.entity.User">
6 <result column="id" jdbcType="VARCHAR" property="id" />
7 <result column="name" jdbcType="VARCHAR" property="name" />
8 <result column="mobile" jdbcType="VARCHAR" property="mobile" />
9 <result column="create_time" property="createTime" />
10 <result column="modify_time" property="modifyTime" />
11 <result column="deleted" property="deleted" />
12 <result column="status" property="status" />
13 </resultMap>
14
15 <!-- 通用查詢結(jié)果列 -->
16 <sql id="Base_Column_List">
17 id, name , mobile, create_time, modify_time, deleted, status
18 </sql>
19
20 </mapper>
(4)新建Service層類UserService:
繼承mybatis-plus的 IService<User>接口
1 /**
2 * 用戶服務(wù)類
3 * @author fansongsong
4 */
5 public interface IUserService extends IService<User> {
6 }
(5)新建ServiceImpl層類UserServiceImpl:UserServiceImpl類需要繼承mybatis-plus的ServiceImpl<對應(yīng)user實(shí)體Mapper, 對應(yīng)user
實(shí)體> 并實(shí)現(xiàn)mybatis-plus的IUserService接口
使用@Service注明該類為服務(wù)實(shí)現(xiàn)層
使用@Resource注解將指定Bean默認(rèn)按照ByName自動注入
使用@Override加在實(shí)現(xiàn)方法上是覆蓋(override)或者重寫(因?yàn)橐獙?shí)現(xiàn)這個接口里面
的所有方法)车要,不加編譯器也可以識別炮捧,加上增強(qiáng)代碼的可讀性
使用lombok的@Sl4j注解,進(jìn)行l(wèi)og打印日志;
1 **
2 * 用戶服務(wù)實(shí)現(xiàn)類
3 * @Author fansongsong
4 */
5 @Service
6 @Slf4j
7 public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserServic
8
9 @Resource
10 UserMapper userMapper;
11
12 @Resource
13 IUserService userService;
14
15 @Resource
16 TUserRoleService userRoleService;
17
18 /**
19 * 查詢用戶角色v1(自定義sql)
20 * @param id 用戶id
21 * @return UserRoleVO
22 */
23 @Override
24 public UserRoleVO userRoleV1(String id) {
25 //自定義sql根據(jù)用戶id獲取用戶角色組信息
26 UserRoleVO result = userMapper.getUserRole(id);
27 log.info("UserRoleVO result msg:"+ result.getName());
28 return result;
29 }
30 }(6)新建Controller層類UserController:
使用@RestController注解標(biāo)識該類為控制層;
使用@RequestMapping("/user")注解標(biāo)識控制層的映射請求谅海,也就是通過它來指定控制
器可以處理哪些URL請求;
使用@Resource沈善、@Autowired注解將指定Bean默認(rèn)按照ByName自動注入
使用@GetMapping("/get_user/{id}")支持請求類型為get的請求乓搬,一般用于獲取資源請
求晴玖,值為請求路徑;
使用@PostMapping("/create")支持請求類型為post的請求千埃,一般用于向服務(wù)器提交資
源春叫,值為請求路徑;
使用@PutMapping("/update")支持請求類型為put的請求亭螟,一般用于向服務(wù)器更新資源残家,
值為請求路徑;
使用@DeleteMapping("/delete_user/{id}")支持請求類型為delete的請求脑蠕,一般用于向服
務(wù)器刪除資源,值為請求路徑;
使用@PathVariable(value = "id")注解跪削,獲取路徑參數(shù)谴仙,如
@GetMapping("/get_user/{id}")請求獲取路徑中的{id}占位符的值;
使用@RequestBody注解,將JSON形式請求參數(shù)轉(zhuǎn)化為相應(yīng)的實(shí)體類
使用@RequestParam(value = "page_no", required = false, defaultValue = "1")注解碾盐,獲
取請求體中的參數(shù);
1 /**
2 * 用戶控制層
3 * @Author fansongsong
4 */
5
6 @RestController
7 @RequestMapping("/user")
8 public class UserController {
9
10 @Resource
11 private IUserService userService;
12
13 //一對一
14 /**
15 * 根據(jù)用戶id查詢用戶信息
16 * @param id 用戶id
17 * @return ApiResponse
18 */19 @GetMapping("/get_user/{id}")
20 public ApiResponse getUser(@PathVariable(value = "id") String id) {
21 User user = userService.getUser(id);
22 return ApiResponse.success(user);
23 }
24 }
1:單表(CRUD)
1.1: 新增晃跺, UserServiceImpl.createUser()
1 userMapper.insert(user);或者
2 userService.save(user);
1.2: 修改, UserServiceImpl.updateUser()
1 userMapper.updateById(user);或者
2 userService.updateById(user);
1.3: 刪除毫玖, UserServiceImpl.deleteUser()
1 userMapper.deleteById(id);或者
2 userService.removeById(id);
注意:mybatis-plus的刪除默認(rèn)是物理刪除掀虎,如果需要邏輯刪除要進(jìn)行相關(guān)配置
1.3.1:application-test.yml配置,指定刪除的value設(shè)為1付枫,恢復(fù)的設(shè)為0
1 mybatis-plus:
2 global-config:
3 db-config:
4 logic-delete-value: 1 # 邏輯已刪除值(默認(rèn)為 1)
5 logic-not-delete-value: 0 # 邏輯未刪除值(默認(rèn)為 0)
1.3.2:在mybatis-plus-3.1.1版本之前需要在自己寫的配置類中配置烹玉,后續(xù)版本直接跳
過,spring已經(jīng)配好了
1 @Configuration2 public class MyConfig {
3 @Bean
4 public ISqlInjector SqlInjector(){
5 return new LogicSqlInjector();
6 }
7 }
1.3.3:先在數(shù)據(jù)庫加deleted字段阐滩,對應(yīng)的實(shí)體類deleted字段上加@TableLogic 注解標(biāo)
識(對應(yīng)字段類型推薦使用 Integer,Boolean,LocalDateTime)二打,這就是告訴spring,我
要把這字段設(shè)為刪除標(biāo)志
1 /**
2 * 是否刪除(0:未刪,1:已刪)
3 */
4 @TableLogic//邏輯刪除
5 private Integer deleted;
1.4:查詢
1.4.1: 單數(shù)據(jù)查詢掂榔, UserServiceImpl.getUser()
1 // 一继效,Service提供的CRUD
2 // 1,根據(jù) ID 查詢
3 User user1 = userService.getById(id);
4
5 // 2装获,根據(jù) Wrapper瑞信,查詢一條記錄。結(jié)果集穴豫,如果是多個會拋出異常凡简,隨機(jī)取一條加上限制條件 wrapper.
6 QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
7 userQueryWrapper.lambda().eq(User::getId,id);
8 User user2 = userService.getOne(userQueryWrapper);
9
10 // 3,根據(jù) Wrapper,查詢一條記錄,throwEx(boolean),有多個 result 是否拋出異常
11 User user3 = userService.getOne(userQueryWrapper,false);
12
13 // 4秤涩,根據(jù) Wrapper翁逞,查詢一條記錄,返回Map<String,Object>
14 Map<String,Object> user4 = userService.getMap(userQueryWrapper);
15
16 // 二,Mapper提供的CRUD
17
18 // 1溉仑,根據(jù) entity 條件,查詢一條記錄19 QueryWrapper<User> queryWrapper = new QueryWrapper<>();
20 queryWrapper.lambda().eq(User::getId,id);
21 queryWrapper.lambda().eq(User::getDeleted, 0);
22 User user6 = userMapper.selectOne(queryWrapper);
23 // 2状植,根據(jù) ID 查詢
24 User user7 = userMapper.selectById(id);
1.4.2: 列表數(shù)據(jù)查詢浊竟,UserServiceImpl.getListUser()
1 QueryWrapper<User> queryWrapper = new QueryWrapper<>();
2 List<User> result1 = userService.list(queryWrapper);
3 List<User> result2 = userMapper.selectList(queryWrapper);
2: 一對多查詢
2.1: 使用自定義sql, UserServiceImpl.getUserRoleV1()
2.2: 使用mybatis-plus單表查詢數(shù)據(jù)組裝津畸,UserServiceImpl.getUserRoleV2()
3. 多對多查詢
3.1: 使用自定義sql振定,UserServiceImpl.getListUserRoleV2()
3.2: 使用mybatis-plus單表查詢數(shù)據(jù)組裝, UserServiceImpl.getListUserRoleV1()
4肉拓,分頁插件PageHelper
官方文檔:https://pagehelper.github.io/docs/howtouse/
配置:引入分頁插件
在 pom.xml 中添加如下依賴:
1 <!-- 分頁插件 -->
2 <dependency>
3 <groupId>com.github.pagehelper</groupId>
4 <artifactId>pagehelper</artifactId>
5 <version>5.1.0</version>
6 </dependency>
如何在代碼中使用
在實(shí)現(xiàn)類使用PageHelper.startPage(pageNo, pageSize);進(jìn)行分頁
1 //每頁的大小為pageSize后频,查詢第pageNo頁的結(jié)果
2 PageHelper.startPage(pageNo, pageSize);3 //執(zhí)行查詢語句
4 List<User> result = userService.list(queryWrapper);
在Controller使用new PageInfo<>(userList)進(jìn)行包裝返回前端
1 /**
2 * 根據(jù)篩選條件查詢用戶列表
3 * @param pageNo 當(dāng)前第幾頁
4 * @param pageSize 每頁顯示條數(shù)
5 * @param mobile 手機(jī)號
6 * @param name 用戶名
7 * @return List<User>
8 */
9 @GetMapping("/list_user")
10 public ApiResponse listUser(
11 @RequestParam(value = "page_no", required = false, defaultValue = "1") int pageNo
12 @RequestParam(value = "page_size", required = false, defaultValue = "5") int page
13 @RequestParam(value = "mobile", required = false) String mobile,
14 @RequestParam(value = "name", required = false) String name) {
15 List<User> userList = userService.listUser(pageNo,pageSize,mobile,name);
16 return ApiResponse.success(new PageInfo<>(userList));
17 }
五、MyBatis XML映射文件
學(xué)習(xí)文檔:https://www.w3cschool.cn/mybatis/f4uw1ilx.html
MyBatis 的真正強(qiáng)大在于它的映射語句暖途,也是它的魔力所在卑惜。由于它的異常強(qiáng)大,映射器的 XML 文件
就顯得相對簡單驻售。如果拿它跟具有相同功能的 JDBC 代碼進(jìn)行對比露久,你會立即發(fā)現(xiàn)省掉了將近 95% 的
代碼。MyBatis 就是針對 SQL 構(gòu)建的欺栗,并且比普通的方法做的更好毫痕。
1 resultMap – 是最復(fù)雜也是最強(qiáng)大的元素,用來描述如何從數(shù)據(jù)庫結(jié)果集中來加載對象迟几。
2 sql – 可被其他語句引用的可重用語句塊消请。
3 insert – 映射插入語句
4 update – 映射更新語句
5 delete – 映射刪除語句
6 select – 映射查詢語句select 查詢語句是 MyBatis 中最常用的元素之一:
1 <select id="selectPerson" parameterType="int" resultType="hashmap">
2 SELECT * FROM PERSON WHERE ID = #{id}
3 </select>
Select 常用屬性描述:
1,XML映射文件和Mapper.java文件的綁定是通過xml中的
<mapper namespace = "Mapper類的完全限定名">
1 <mapper namespace="com.example.demo.user.mapper.UserMapper">
屬性
描述
id
在命名空間中唯一的標(biāo)識符类腮,可以被用來引用這條語句臊泰。
parameterTyp
e
將會傳入這條語句的參數(shù)類的完全限定名或別名。這個屬性是可選的蚜枢,因?yàn)?MyBatis 可以通過 Typ
默認(rèn)值為 unset因宇。
resultType
從這條語句中返回的期望類型的類的完全限定名或別名。注意如果是集合情形祟偷,那應(yīng)該是集合可以包
resultType 或 resultMap察滑,但不能同時使用。
resultMap
外部 resultMap 的命名引用修肠。結(jié)果集的映射是 MyBatis 最強(qiáng)大的特性贺辰,對其有一個很好的理解的話
使用 resultMap 或 resultType,但不能同時使用。2. xml中sql通過標(biāo)簽的屬性id="getUserRole"和映射的Mapper.java進(jìn)行唯一綁定
insert饲化,update 和 delete 語句的示例:
1
2 <insert id="insertAuthor">
3 insert into Author (id,username,password,email,bio)
4 values (#{id},#{username},#{password},#{email},#{bio})
5 </insert>
6
7 <update id="updateAuthor">
8 update Author set
9 username = #{username},10 password = #{password},
11 email = #{email},
12 bio = #{bio}
13 where id = #{id}
14 </update>
15
16 <delete id="deleteAuthor">
17 delete from Author where id = #{id}
18 </delete>
19
六莽鸭,MyBatis 動態(tài)SQL
使用MyBatis動態(tài)SQL進(jìn)行不同條件拼接 SQL 語句,拼接的時候要確保不能忘了必要的空
格吃靠,還要注意省掉列名列表最后的逗號等硫眨。
常用的動態(tài) SQL 元素:
if
choose (when, otherwise)
trim (where, set)
foreach
1,if
動態(tài) SQL 通常要做的事情是有條件地包含 where 子句的一部分巢块。比如:
1 <select id="getUserRoleList" resultMap="roleList" >
2 select
3 <include refid="Get_User_Role_List"/>
4 from t_user tu
5 left join t_user_role tur on tur.user_id = tu.id
6 left join t_role tr on tr.id = tur.role_id
7 <where>
8 tu.deleted = 0
9 <if test="roleId != null and roleId != ''">
10 and tr.id = #{roleId}11 </if>
12 <if test="mobile != null and mobile != ''">
13 and tu.mobile = #{mobile}
14 </if>
15 </where>
16 </select>
動態(tài)的通過"roleId"和"mobile"兩個條件進(jìn)行數(shù)據(jù)篩選礁阁,那個參數(shù)不為空就執(zhí)行那個條件語句
2,choose (when, otherwise)
有些時候族奢,我們不想用到所有的條件語句姥闭,而只想從中擇其一二。針對這種情況越走,MyBatis
提供了 choose 元素棚品,例如這次變?yōu)樘峁┝?title"就按"title"查找,提供了"author"就
按"author"查找廊敌,若兩者都沒有提供铜跑,就返回所有符合條件的結(jié)果
1 <select id="findActiveBlogLike"
2 resultType="Blog">
3 SELECT * FROM BLOG WHERE state = ‘ACTIVE’
4 <choose>
5 <when test="title != null">
6 AND title like #{title}
7 </when>
8 <when test="author != null and author.name != null">
9 AND author_name like #{author.name}
10 </when>
11 <otherwise>
12 AND featured = 1
13 </otherwise>
14 </choose>
15 </select>
4,trim (where, set)
一般常用在update 語句骡澈,set 元素可以被用于動態(tài)包含需要更新的列疼进,而舍去其他的。比
如:
1 <update id="updateAuthorIfNecessary">
2 update Author3 <set>
4 <if test="username != null">username=#{username},</if>
5 <if test="password != null">password=#{password},</if>
6 <if test="email != null">email=#{email},</if>
7 <if test="bio != null">bio=#{bio}</if>
8 </set>
9 where id=#{id}
10 </update>
5秧廉,foreach
動態(tài) SQL 的另外一個常用的必要操作是需要對一個集合進(jìn)行遍歷伞广,通常是在構(gòu)建 IN 條件語句的時候。比
如:
1 <select id="selectPostIn" resultType="domain.blog.Post">
2 SELECT *
3 FROM POST P
4 WHERE ID in
5 <foreach item="item" index="index" collection="list"
6 open="(" separator="," close=")">
7 #{item}
8 </foreach>
9 </select>
同時也可以使用foreach來進(jìn)行批量插入數(shù)據(jù)(注意:雖然Mybatis 對動態(tài)語句沒有數(shù)量上
的限制疼电,由于Mysql 對語句的長度有限制嚼锄,默認(rèn)是 4M,如果要進(jìn)行大數(shù)據(jù)量批處理時蔽豺,
盡量先把數(shù)據(jù)進(jìn)行l(wèi)ist切分区丑,在進(jìn)行批量插入操作)
代碼示例:UserServiceImpl.createBatchSaveUser()
1 <!-- 批量保存sql -->
2 <insert id="batchSave" parameterType="java.util.List" >
3 INSERT INTO t_user (
4 `id`,
5 `name`,
6 `mobile`,
7 `create_time`,
8 `modify_time`,
9 `deleted`,
10 `status`,11 `age`
12 )
13 VALUES
14 <foreach collection="list" index="index" item="item" separator=",">
15 (
16 #{item.id},
17 #{item.name},
18 #{item.mobile},
19 #{item.createTime},
20 #{item.modifyTime},
21 #{item.deleted},
22 #{item.status},
23 #{item.age}
24 )
25 </foreach>
26 </insert>
對于批量數(shù)據(jù)操作mybatis-plus也有相關(guān)支持
1 userService.saveBatch(userList);
2 userService.saveOrUpdateBatch(userList);