入门:
依赖:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>{version}</version>
</dependency>
配置:
## 去除logo
mybatis-plus:
global-config:
banner: false
## 日志输出sql语句
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {private Long id;private String name;private Integer age;private String email;
}@Mapper
public interface UserMapper extends BaseMapper<User> {
}public interface UserService {List<User> selectList();
}@Service
public class UserServiceImpl implements UserService {@AutowiredUserMapper userMapper;public List<User> selectList(){return userMapper.selectList(null);}
}
简单定义对象,dao,以及service
继承BaseMapper后可使用一些简单的操作
userMapper.insert(user);userMapper.deleteById(10L);userMapper.updateById(user);userMapper.selectById(user);userMapper.selectList(Wrapper<T> queryWrapper);
除了Mapper接口,MybatisPlus还提供了IService接口和对应的实现类ServiceImpl,该实现类已经提供好了一些对应的Service相关的方法,在某些场景下,我们可以直接使用ServiceImpl提供的方法,实现对应的功能。此时Service接口可以继承IService<T>,Service实现类可以继承ServiceImpl<TMapper,T>
public interface UserService extends IService<User> {}@Service
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements UserService {@Autowiredprivate UserMapper userMapper;@Overridepublic List<User> selectList() {return userMapper.selectList(null);}
}
可以使用ServiceImpl类中的各种接口,还可以自定义xml文件,配置sql,与Mybstis一致
进阶:
1、表名和实体类名映射 -> 表名user 实体类名User
若是表名不一致,可以使用@TableName("user")注解
或若有前缀,则可以设置全局配置;例如:表名为:t_vip_user,其他表也都以t_vip为前缀
mybatis-plus:
global-config:
db-config:
table-prefix: t_vip_
2、字段名和实体类属性名映射 -> 字段名name 实体类属性名name (get属性)
2.1 支持注解映射
当数据库字段和表实体类的属性不一致时,我们可以使用@TableField()注解改变字段和属性
的映射,让注解中的名称和表字段保持一致
如:此时将数据库字段的名称我们改为username,在根据实体类的属性拼接SQL的使用,就会使
用@TableField("username")中指定的名称username进行拼接,完成查询
SELECT id,username AS name,email FROM user
2.2 关键字注解映射
比如:desc @TableField("‘desc ’") 需要在双引号中加个单引号
3、字段名下划线命名方式和实体类属性小驼峰命名方式映射
字段名 user_email 实体类属性名 userEmail
MybatisPlus支持这种映射规则,可以通过配置来设置
mybatis-plus:
configuration:
map-underscore-to-camel-case: true 表示支持下划线到驼峰的映射
map-underscore-to-camel-case: false 表示不支持下划线到驼峰的映射
4、特殊注解:
当数据库中有字段不希望被查询,可以通过@TableField(select = false)来隐藏这个字段,那在拼接SQL语句的时候,select后就不会拼接这个字段,
在实际开发中,有些字段不需要数据库存储,但是却需要展示,需要展示也就是意味着实体类中需要存在这个字段,我们称这些实体类中存在但是数据库中不存在的字段,叫做视图字段。通过@TableField(exist = false)来去掉这个字段,不让它作为查询字段。
5、条件构造器
5.1 Wrapper
抽象类,条件类的顶层Wrapper,提供了一些获取和判断相关的方法
public abstract class Wrapper<T> implements ISqlSegment {public Wrapper() {}.....//各种方法
}
5.2 AbstractWrapper
抽象类,Wrapper的子类,提供了所有的条件相关方法
public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T, R, Children>> extends Wrapper<T> implements Compare<Children, R>, Nested<Children, Children>, Join<Children>, Func<Children, R> {}
5.3 AbstractLambdaWrapper
抽象类,AbstractWrapper的子类,确定字段参数为方法引用类型
5.4 QueryWrapper
类,AbstractWrapper的子类,如果我们需要传递String类型的字段信息,创建该对象
5.5 LambdaQueryWrapper
类,AbstractLambdaWrapper的子类,如果我们需要传递方法引用方式的字段信息,创建该对象
需要重点掌握QueryWrapper和LambdaQueryWrapper这两个类,在一般情况下,大多选择LambdaQueryWrapper,因为选择这种方式传递参数,不用担心拼写错误问题。
6、查询
6.1 eq 等值查询
QueryWrapper<User> queryWrapper = new QueryWrapper<>();//2.设置条件,指定String字段名称和值queryWrapper.eq("name","Jack");//3.使用条件完成查询User user = userMapper.selectOne(queryWrapper);//1.创建QueryWrapper对象LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();//2.设置条件,指定String字段名称和值lambdaQueryWrapper.eq(User::getName,"Jack");//3.使用条件完成查询User user = userMapper.selectOne(lambdaQueryWrapper);//使用QueryWrapper<T>容易拼错字段名称 需注意//存在多条件查询或单条件查询时,前端传过来的值为null的情况下,如果直接查询,会将查询条件=null进行查询
//因此,可以使用
String name = null;
lambdaQueryWrapper.eq(name != null,User::getName,name);String email = null;
queryWrapper.eq(email != null,"email",email);
6.2 allEq 多条件查询
//eq演示多条件 LambdaQueryWrapper
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();lambdaQueryWrapper.eq(User::getName,"Jone");lambdaQueryWrapper.eq(User::getAge,18);User user = userMapper.selectOne(lambdaQueryWrapper);//allEq QueryWrapper//1.创建QueryWrapper对象QueryWrapper<User> queryWrapper = new QueryWrapper<>();//2.构建条件MapHashMap<String, Object> hashMap = new HashMap<>();hashMap.put("name","Jone");hashMap.put("age",null);//3.使用条件完成查询// 参数params:表示传递的Map集合
//参数null2IsNull:表示对于为null的条件是否判断isNullqueryWrapper.allEq(hashMap,false);User user = userMapper.selectOne(queryWrapper);//allEq LambdaQueryWrapper
Map<SFunction<User,?>, Object> map = new HashMap<>();
map.put(User::getName,"三沙");
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.allEq(map,false);User user = userMapper.selectOne(lambdaQueryWrapper);
6.3 ne 不等查询
//1.创建QueryWrapper对象LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();//2.设置条件,指定String字段名称和值String name = "Jone";lambdaQueryWrapper.ne(User::getName,name);//3.使用条件完成查询List<User> users = userMapper.selectList(lambdaQueryWrapper);
6.4 范围查询
6.4.1 gt 大于
6.4.2 ge 大于等于
6.4.3 lt小于 (<)
6.4.4 le小于等于 (<=)
6.4.5 between 范围查询 (between ? and ?)
6.4.6 notBetween 范围查询 (not between ? and ?)
// gt//1.创建QueryWrapper对象LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();//2.设置条件,指定字段名称和值Integer age = 18;lambdaQueryWrapper.gt(User::getAge,age);//3.使用条件完成查询List<User> users = userMapper.selectList(lambdaQueryWrapper);
6.5 模糊查询
6.5.1 like (like %?%)
6.5.2 notLike (not like %?%)
6.5.3 likeLeft (like %?)
6.5.4 likeRight (like ?%)