【全网最新最全】MybatisPlus面试题

目录

一、MybatisPlus是什么?

二、BaseMapper有哪些你常用的方法?

三、Service有哪些自带常用方法?

四、用过MybatisPlus的哪些注解?分别解释下都是什么作用?

五、如何带条件组装一条查询语句?

六、如何带条件拼接一条update语句?

七、MybatisPlus如何实现子查询?

八、MybatisPlus如何实现分页功能?

8.1 分页插件方式

8.2 xml自定义分页

九、MybatisPlus如何实现乐观锁?


一、MybatisPlus是什么?

只需简单配置,即可快速进行单表CRUD操作,从而节省大量时间。并且支持大量数据库,包括国产达梦、人大金仓等数据库。

二、BaseMapper有哪些你常用的方法?

插入:insert(user);

删除:

  • 根据id删除单条:deleteById(id);
  • 批量删除:deleteBatchIds(idList);

修改:updateById(user);

查询:

  • 根据id查询:selectById(id);
  • 查询全部:selectList(null);

三、Service有哪些自带常用方法?

  • 查询记录数:count();
  • 批量插入:saveBatch(List<User> users);

四、用过MybatisPlus的哪些注解?分别解释下都是什么作用?

(1)@TableName

MybatisPlus默认表名与实体类名对应,但如果你实体类名与表名不一样,则要用到此注解。比如实体类名为User,数据库表名为t_user,则默认不会对应,你需要在实体类中加入@TableName("t_user")注解。

(2)@TableId

MybatisPlus默认对应的主键名为id,也就是说如果你实体类名为id,数据库表主键名也是id,则默认可以对应,但如果你实体类名和数据库主键名都为uid,则对应失败报错,所以这时候用到@TableId(value="uid")注解。

(3)@TableField

MyBatis-Plus在执行SQL语句时,要保证实体类中的属性名和表中的字段名一致。如果实体类中的属性名和字段名不一致则用到此注解。

(4)@TableLogic

用做逻辑删除,将此注解置于逻辑删除列上。

五、如何带条件组装一条查询语句?

使用QueryWrapper,QueryWrapper有很多方法,如like、between、isNotNull、orderByDesc等方法。

@Test
public void test01(){
	//查询用户名包含a,年龄在20到30之间,并且邮箱不为null的用户信息
	//SELECT id,username AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0 AND (username LIKE ? AND age BETWEEN ? AND ? AND email IS NOT NULL)
	QueryWrapper<User> queryWrapper = new QueryWrapper<>();
	queryWrapper.like("username", "a")
			.between("age", 20, 30)
			.isNotNull("email");
	List<User> list = userMapper.selectList(queryWrapper);
	list.forEach(System.out::println);
}

六、如何带条件拼接一条update语句?

@Test
public void test07() {
	// 将(年龄大于20或邮箱为null)并且用户名中包含有a的用户信息修改
	// 组装set子句以及修改条件
	UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
	// lambda表达式内的逻辑优先运算
	updateWrapper
			.set("age", 18)
			.set("email", "user@atguigu.com")
			.like("username", "a")
			.and(i -> i.gt("age", 20).or().isNull("email"));

	int result = userMapper.update(null, updateWrapper);
	System.out.println(result);
}

七、MybatisPlus如何实现子查询?

@Test
public void test06() {
	//  查询id小于等于3的用户信息
	//  SELECT id,username AS name,age,email,is_deleted FROM t_user WHERE (id IN (select id from t_user where id <= 3))
	QueryWrapper<User> queryWrapper = new QueryWrapper<>();
	queryWrapper.inSql("id", "select id from t_user where id <= 3");
	List<User> list = userMapper.selectList(queryWrapper);
	list.forEach(System.out::println);
}

八、MybatisPlus如何实现分页功能?

两种方式可以实现。

8.1 分页插件方式

(1)添加配置类

@Configuration
@MapperScan("com.oracle.mapper")
public class MybatisPlusConfig {
 
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
 
}

(2)使用selectPage方法查询

@Test
public void testPage(){
	// 设置分页参数
	Page<User> page = new Page<>(1, 5);
	userMapper.selectPage(page, null);
	// 获取分页数据
	List<User> list = page.getRecords();
	list.forEach(System.out::println);
	System.out.println("当前页:"+page.getCurrent());
	System.out.println("每页显示的条数:"+page.getSize());
	System.out.println("总记录数:"+page.getTotal());
	System.out.println("总页数:"+page.getPages());
	System.out.println("是否有上一页:"+page.hasPrevious());
	System.out.println("是否有下一页:"+page.hasNext());
}

8.2 xml自定义分页

(1)mapper中定义接口

/**
 * 根据年龄查询用户列表,分页显示
 * @param page 分页对象,xml中可以从里面进行取值,传递参数 Page 即自动分页,必须放在第一位
 * @param age 年龄
 * @return
 */
IPage<User> selectPageVo(@Param("page") Page<User> page, @Param("age") Integer age);

(2)mapper.xml实现

<!--SQL片段,记录基础字段-->
<sql id="BaseColumns">id,username,age,email</sql>
 
<select id="selectPageVo" resultType="com.oracle.pojo.User">
	SELECT <include refid="BaseColumns"></include> FROM t_user WHERE age > #{age}
</select>

(3)调用接口

@Test
public void testSelectPageVo(){
	// 设置分页参数
	Page<User> page = new Page<>(1, 5);
	userMapper.selectPageVo(page, 20);
	// 获取分页数据
	List<User> list = page.getRecords();
	list.forEach(System.out::println);
	System.out.println("当前页:"+page.getCurrent());
	System.out.println("每页显示的条数:"+page.getSize());
	System.out.println("总记录数:"+page.getTotal());
	System.out.println("总页数:"+page.getPages());
	System.out.println("是否有上一页:"+page.hasPrevious());
	System.out.println("是否有下一页:"+page.hasNext());
}

九、MybatisPlus如何实现乐观锁?

我们都知道乐观锁是通过一个版本号字段来实现的,首先你的数据库要有个version字段。

然后实体类要在version属性上添加注解@Version。

@Data
public class Product {
    private Long id;
    private String name;
    private Integer price;
    @Version // 标识乐观锁版本号
    private Integer version;
}

添加乐观锁插件配置:

package com.oracle.config;
 
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
@Configuration
@MapperScan("com.oracle.mapper")
public class MybatisPlusConfig {
 
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        // 添加乐观锁插件
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return interceptor;
    }
 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

思想和宇宙同频

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值