首页 > 其他分享 >MybatisPlus

MybatisPlus

时间:2024-11-28 20:01:13浏览次数:8  
标签:MybatisPlus List wrapper public user id User

MybatisPlus

MybatisPlus入门案例

官方网站:https://baomidou.com/

只做增强,引入不会对现有工程产生影响

操作步骤
  1. 引入依赖

    依赖中集成了Mybatis和mybatisPlus中的所有功能。

    <!--MybatisPlus-->
    <dependency>
    	<groupId>com.baomidou</groupId>
    	<artifactId>mybatis-plus-boot-starter</artifactId>
    	<version>3.5.3.1</version>
    </dependency>
    
  2. 定义Mapper接口并继承BaseMapper

    userMapper

    public interface UserMapper extends BaseMapper<User> {
    
    }
    

    testMapper

    userMapper.insert(user) //新增
    userMapper.selectById(5L) //查询
    userMapper.updateById(user) //更改
    userMapper.deleteById(user) //删除
    
常见注解

在这里插入图片描述

  • @TableName->用来指定表名
  • @TableId->用来指定表中的主键Id
  • @TableField->用来指定表中的普通字段信息
常见配置
mybatis-plus:  
	type-aliases-package: com.itheima.mp.domain.po # 别名扫描包  
	mapper-locations: "classpath*:/mapper/**/*.xml" # Mapper.xml文件地址,默认值  			         configuration:    map-underscore-to-camel-case: true # 是否开启下划线和驼峰的映射   
    cache-enabled: false # 是否开启二级缓存
    global-config:    
    db-config:      id-type: assign_id # id为雪花算法生成      
    update-strategy: not_null # 更新策略:只更新非空字段
    id-type: auto //主键自增

具体操作文档:使用配置 | MyBatis-Plus(baomidou.com)

核心功能

条件构造器条件构造器 | MyBatis-Plus (baomidou.com)
基于QueryWrapper条件
  • 查询
@Test
    void testQueryList() {
        //构建查询条件
        QueryWrapper<User> wrapper = new QueryWrapper<User>()
                .select("id","username","info","balance")
                .like("username","o")
                .ge("balance",1000);
        //查询
        List<User> mapper=userMapper.selectList(wrapper);
        mapper.forEach(System.out::println);
    }
  • 更改
    @Test
    void testQueryUpdate(){
        //要更新的数据
        User user=new User();
        user.setBalance(5000);
        //
        QueryWrapper<User> wrapper = new QueryWrapper<User>()
                .eq("username","Jack");
        //更新
        userMapper.update(user,wrapper);
    }
基于updateWrapper更改
    @Test
    void testUpdateWrapper(){
        List<Long> ids=List.of(1L,2L,4L);
        //更新条件
        UpdateWrapper<User> wrapper=new UpdateWrapper<User>()
                .setSql("balance=balance-200")
                .in("id",ids);

        userMapper.update(null,wrapper);
    }
基于lambdaQueryWrapper

在这里插入图片描述

自定义SQL
步骤
  • 基于Wrapper构建where条件
List<Long> ids = List.of(1L, 2L, 4L);
int amount = 200;
// 1.构建条件
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>().in(User::getId, ids);
// 2.自定义SQL方法调用
userMapper.updateBalanceByIds(wrapper, amount);
  • 在mapper方法参数中用Param注解声明wrapper变量名称,必须是ew
void updateBalanceByIds(@Param("ew") LambdaQueryWrapper<User> wrapper, @Param("amount") int amount);
  • 自定义SQL,并使用Wrapper条件

xml文件

<update id="updateBalanceByIds">
	UPDATE tb_user SET balance = balance - #{amount} ${ew.customSqlSegment}
</update>

Iservice接口基本用法

在这里插入图片描述

自定义Service接口继承Service接口
public interface UserService extends IService<User> {
}
自定义实现类并继承ServiceImpl类
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements UserService {

}

测试

    void testPrint(){
        List<User> users=userService.listByIds(List.of(1L,2L,4L));
        users.forEach(System.out::println);
    }
Iservice开发基本业务

引入依赖

<!--swagger-->
<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-openapi2-spring-boot-starter</artifactId>
    <version>4.1.0</version>
</dependency>
<!--web-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
  • 用户新增
    @ApiOperation("用户新增")
    @PostMapping
    public void saveUser(@RequestBody UserFormDTO userDto) {
        log.info("用户新增:{}",userDto);
        User user = BeanUtil.copyProperties(userDto, User.class);
        userService.save(user);
    }
  • 用户删除
    @ApiOperation("用户删除")
    @DeleteMapping("{id}")
    public void deleteUser(@PathVariable("id") Long id) {
        log.info("用户删除id:{}",id);
        userService.removeById(id);
    }
  • 用户查询–当前获取类型为po类型,需返回为Vo类型
    @ApiOperation("用户查询")
    @DeleteMapping("{id}")
    public UserVO selectUser(@PathVariable("id") Long id) {
        log.info("用户查询id:{}",id);
        User byId = userService.getById(id);
        UserVO userVO = BeanUtil.copyProperties(byId, UserVO.class);
        return userVO;
    }

Iservice的lambda
查询
controller

@ApiOperation("根据复杂条件查询")
@GetMapping("list")
public List<UserVO> queryUser(UserQuery userQuery) {
     //查询用户
    List<User> user=userService.queryList
            (userQuery.getName(),userQuery.getStatus(),userQuery.getMinBalance(),userQuery.getMaxBalance());

    return BeanUtil.copyToList(user, UserVO.class);
}

serviceImpl

public List<User> queryList(String name, Integer status, Integer minBalance, Integer maxBalance) {
        List<User> users = lambdaQuery()
                .like(name != null, User::getUsername, name)
                .eq(status != null, User::getStatus, status)
                .ge(minBalance != null, User::getBalance, minBalance)
                .le(maxBalance != null, User::getBalance, maxBalance)
                .list();
        return users;
    }

……page()–分页查询

……one()–查询单个

……list()–查询多个

更新

public void deductaction(Long id, Integer money) {
……
int remain=user.getBalance()-money;
lambdaUpdate()
        .set(User::getBalance,remain) 
        .set(remain==0,User::getStatus,2) //判断当前用户余额,如果为0;则将状态改位冻结
        .eq(User::getId,id)
        .eq(User::getBalance,user.getBalance()) //添加乐观锁
        .update();
}

&rewriteBatchedStatements=true

在ClientPreparedStatement的executeBatchInternal中,有判断rewriteBatchedStatements值是否为true并重写SQL的功能,将多条SQL语句转换为一条语句,将执行效率大大提升。

标签:MybatisPlus,List,wrapper,public,user,id,User
From: https://blog.csdn.net/2301_79927388/article/details/144119325

相关文章

  • 在开源项目中写自己的服务,被mybatisplus里面一个拦截报错
    错误信息如下##Errorqueryingdatabase.Cause:java.lang.IllegalStateException:Nothread-boundrequestfound:Areyoureferringtorequestattributesoutsideofanactualwebrequest,orprocessingarequestoutsideoftheoriginallyreceivingthread?Ify......
  • MybatisPlus入门(十二)Mybatis-Plus 代码生成器
    一、代码生成器代码生成器:代码由定义的模版、读取数据库和开发者自定义部分组成。-模板:MyBatisPlus提供,Mabatis-Plus收集了大量开发者写的标准代码,定义了模版,也可以开发者自定义模版。-数据库相关配置:读取数据库获取信息-开发者自定义配置:手工配置实体对象类:代码如下pa......
  • MybatisPlus入门(十一)MybatisPlus-乐观锁
    一、乐观锁修改操作中的问题;乐观锁,琐是用来解决并发问题的。例如秒杀业务,上了100个秒杀单子,如果到了最后一个,8个人一起买,会出现问题,卖出第0号-1号-2号,小型并发解决方案:乐观锁。二、Mybatis-Plus乐观锁实现步骤Mybatis-Plus乐观锁实现步骤:步骤一......
  • MybatisPlus入门(十)MybatisPlus-逻辑删除和多记录操作
    一、Mybatis-Plus多记录操作按照主键删除多条记录List<Long>ids=Arrays.asList(newLong[]{2,3})userDao.deleteBatchIds(ids);示例代码如下:@TestvoidtestDelete(){//删除指定多条数据List<Long>list=newArrayList<>();......
  • MybatisPlus入门(九)MybatisPlus-DML编程控制
    增删改InsertDeleteUpdate操作中的一些问题。一、主键生成策略增加的时候主键生成的问题,不同的环境、不同的场景对应的主键生成策略可能是不一样的,比如日志表、购物订单表、外卖单。  主键生成策略设置方法:  示例代码:packagecom.it.domain;importco......
  • MybatisPlus入门(八)MybatisPlus-DQL编程控制(下)
    一、字段映射与表名映射数据库表和实体类名称一样自动关联,数据库表和实体类有部分情况不一样。问题一:表名与编码开发设计不同步,表名和实体类名称不一致。  解决办法:在模型类上方,使用@TableName注解,通过value属性,设置当前类对应的数据库表名称。  示例代......
  • MybatisPlus入门(七)MybatisPlus-DQL编程控制(上)
     一、查询条件设置查询条件如下图:  用户登录(eq匹配),代码示例:LambdaQueryWrapper<User>lqw=newLambdaQueryWrapper<User>();//等同于=lqw.eq(User::getName,"Jerry").eq(User::getPassword,"jerry");UserloginUser=userDao.selectOne(lqw);System.o......
  • MybatisPlus入门(五)MybatisPlus条件查询
    一、MybatisPlus条件查询MyBatisPlus将书写复杂的SQL查询条件进行了封装,使用编程的形式完成查询条件的组合  方式一:按条件查询查询年龄小于18的用户,代码示例:@SpringBootTestclassMybatisplusDqlApplicationTests{@AutowiredprivateUserDaouserDao;......
  • MybatisPlus入门(六)MybatisPlus-空值处理
    一、MybatisPlus-空值处理1.1)问题引入:在查询中遇到如下情况,有部分筛选条件没有值,如商品价格有最大值和最小值,商品价格部分时候没有值。  1.2)解决办法:步骤一:新建查询实体类UserQuery继承自Userpackagecom.it.domain.query;importcom.it.domain.User;importlombok.Da......
  • MyBatisPlus快速入门
    MyBatisPlus需要的基础:MyBatisSpringSpringMVC一. MyBatisPlus概述1.介绍 MyBatis-Plus(简称MP)是一个 MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生2.特性无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑损耗......