目录
四、用过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", "[email protected]")
.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;
}
}