MybatisPlus:可以跟Mybatis一起使用而不互相影响,而且与之相较更为简单,使用时
1》引入MyBatis Plus依赖,替代MyBatis。
2》定义Mapper接口并继承baseMapper(继承时要指定泛行为是实体类的类型)
3》使用时直接调用增删改查即可
实体类中注解规则
要与表中实际名称相同
@TableName指定表名
主键字段
@TableId(value=“id”,type=IdType.AUTO)除AUTO【自增】还有INPUT【键入】、ASSIGN_ID【分配ID,默认为雪花算法(不添加注解默认分配,默认可以在application.yaml中更改MybatisPlus配置)】
普通字段
@TableField
要与表中实际名称相同,
关键字为名称的要转译注解,
字段前是is要加注解
字段不是表内容@TableField(exist=false)注解
MybatisPlus配置
在application.yaml中更改
MybatisPlus配置项可在官网查询,如别名扫描包、xml文件地址、下划线驼峰映射的开启、id自动更新的方式、更新策略等
条件构造器Wrapper
基于QueryWraaper构建查询条件
@Test
void testQueryWraaper(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.select("id","username","info","balance");
wrapper.like("username","o");
wrapper.ge("balance",1000);
List<User> users=userMapper.selectList(wrapper);
users.forEach(System.out::println);
}
@Test
void testUpdateByQueryWraaper(){
//要更新的数据
User user = new User();
user.setBalance(2000);
//更新条件
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("username","jack");
//执行更新
userMapper.update(user,wrapper);
}
set语句特殊的情况
使用UpdateWraaper<User>可以UpdateWraaper<User> user=UpdateWraaper<User>().select(”baln=baln+200“)使用sql语句
@Test
void testUpdateWraaper(){
List<Long> ids = List.of(1L, 2L, 3L);
UpdateWrapper<User> wrapper = new UpdateWrapper<User>()
.setSql("balance = balance+200")
.in("id",ids);
userMapper.update(null,wrapper);
}
避免硬编码
使用LambdaQueryWraaper<User>将.select(" id "," "," ") 变成 .select(User::getId," "," ")形式
@Test
void testlambdaQueryWraaper(){
//构造查询条件
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>()
.select(User::getId,User::getUsername,User::getInfo,User::getBalance)
.like(User::getUsername,"o")
.ge(User::getBalance,1000);
//查询
List<User> users=userMapper.selectList(wrapper);
users.forEach(System.out::println);
}
尽量使用LambdaQueryWraaper<User>、LambdaUpdateWraaper<User>避免硬编码
自定义SQL
利用MyBatisPlus的Wrapper来构建复杂的where条件,然后自己定义SQL剩下的部分
@Test
void testCustomSqlUpdate(){
//更新条件
List<Long> ids = List.of(1L, 2L, 3L);
int amount=200;
//定义条件
QueryWrapper<User> wrapper = new QueryWrapper<User>().in("id",ids);
//调用自定义sql方法
userMapper.updateBalanceByIds(wrapper,amount);
}
接口层声明参数@Param注解声明wraaper变量必须是@Param(Constants.WRAPPER) ”ew“
void updateBalanceByIds(@Param(Constants.WRAPPER) QueryWrapper<User> wrapper, @Param("amount") int amount);
//void updateBalanceByIds(@Param("ew") QueryWraaper<User> wraaper,int amount);
在其xml实现类中插入用于代替的where操作
$(ew.customSqlSegment)替代where
<update id="updateBalanceByIds">
UPDATE user SET balance = balance - #{amount} ${ew.customSqlSegment}
</update>
IService接口
本地接口继承IService接口+本地方法继承ServiceImpl方法
三步走
1>建立接口继承
public interface UserIService extends IService<User> {}
2>建立方法继承
@Service
public class IUserIServiceImpl extends ServiceImpl<UserMapper,User> implements UserIService {
}
3>方法实现
@SpringBootTest
class UserIServiceTest {
@Autowired
private UserIService userIService;
@Test
void testInsert() {
User user = new User();
user.setId(5L);
user.setUsername("Lucy");
user.setPassword("123");
user.setPhone("18688990011");
user.setBalance(200);
user.setInfo("{\"age\": 24, \"intro\": \"英文老师\", \"gender\": \"female\"}");
user.setCreateTime(LocalDateTime.now());
user.setUpdateTime(LocalDateTime.now());
userIService.save(user);
}