核心功能
约定大于配置
- 类名驼峰转下划线作为表名
- 名为id的字段作为主键
- 变量名驼峰转下划线作为表的字段名
- 根据变量类型推断数据库字段类型
常用注解
常见配置
https://baomidou.com/pages/56bac0/#%E5%9F%BA%E6%9C%AC%E9%85%8D%E7%BD%AE
条件构造器
自定义SQL
案例1
@Test
void testCustomSql() {
List<Long> ids = List.of(1L, 2L, 3L);
int amount = 200;
// 1.定义条件
QueryWrapper<User> wrapper = new QueryWrapper<User>()
.in("id", ids);
// 2.执行更新
userMapper.updateBalanceByWrapper(amount,wrapper);
}
UserMapper.java
@Update("update t_user set balance = balance - #{amount} ${ew.customSqlSegment}")
void updateBalanceByWrapper(@Param("amount") int amount, @Param("ew") QueryWrapper<User> wrapper);
案例2
@Test
void testMultiTableQuery() {
List<Long> ids = List.of(1L, 2L, 3L);
String city = "北京";
QueryWrapper<User> wrapper = new QueryWrapper<User>()
.in("u.id", ids)
.eq("a.city", city);
List<User> userList = userMapper.queryUsersByWrapper();
userList.forEach(System.out::println);
}
UserMapper.java
List<User> queryUsersByWrapper(@Param("ew") QueryWrapper<User> wrapper);
UserMapper.xml
<select id="queryUsersByWrapper" resultType="user">
select u.*
from user u
inner join address a on u.id = a.user_id
${ew.customSqlSegment}
</select>
Service接口
批量新增
public User builderUser(int i) {
return User.builder().name("" + i).build();
}
@Test
void testSaveBatch() {
List<User> list = new ArrayList<>(1000);
long b = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
list.add(builderUser(i));
if (i % 1000 == 0) {
userService.saveBatch(list);
list.clear();
}
}
}
LambdaQuery
@Test
void testLambdaQuery() {
User user = userService.lambdaQuery()
.eq(User::getName, "Rose")
.one();
List<User> userList = userService.lambdaQuery()
.like(User::getName, "o")
.list();
Long count = userService.lambdaQuery()
.like(User::getName, "o")
.count();
}
public List<User> queryUsers(String username,Integer status,Long min, Long max) {
return userService.lambdaQuery()
.like(username != null,User::getName,username)
.eq(status != null,User::getStatus,status)
.gt(min != null,User::getBalance,min)
.lt(max != null,User::getBalance,max)
.list();
}
LambdaUpdate
public void updateBalance(Long balance, Long id, String username) {
if (id == null && username == null) {
// 不符合条件,至少有一个更新条件
throw new RuntimeException("更新条件不能为空");
}
// update user set balance = ? , status = 2 where id = ? and username = ?
userService.lambdaUpdate()
.set(User::getBalace, balance)
.set(balance == 0, User::getStatus, 2)