Mybatis-Plus是基于MyBatis开发的增强工具,所有Mybatis具有的功能,Mybatis-Plus全部都具有,并且帮助我们完成了基础的增删改查功能。
1.准备工作
根据spring-boot的版本引入依赖
例如spring-boot3:
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.5</version></dependency>
并且也需要引入mysql驱动:
<dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency>
配置数据库,以application.yml为例:
spring:datasource:url: jdbc:mysql://127.0.0.1:3307/mybatis_test2?characterEncoding=utf8&useSSL=falseusername: rootpassword: '123456'driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:configuration: # 配置打印 MyBatis⽇志log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mapper数据库层需要继承BaseMapper类,并且传入操作的表对应的实体类
@Mapper
public interface UserInfoMapper extends BaseMapper<UserInfo> {}
mybatis就会根据编码规范对我们的实体类的属性进行表的映射
2.简单测试CRUD介绍
@Testvoid insert() {//插入数据UserInfo userInfo=new UserInfo();userInfo.setAge(12);userInfo.setPassword("wh");userInfo.setUsername("wang");userInfoMapper.insert(userInfo);}@Testvoid select() {//根据id或者id集合进行查询UserInfo userInfo=userInfoMapper.selectById(5);System.out.println(userInfo);List<UserInfo> list=userInfoMapper.selectBatchIds(List.of(5,6,7));list.stream().forEach(System.out::println);}@Testvoid update() {//根据id进行更新UserInfo userInfo=new UserInfo();userInfo.setId(5);userInfo.setUsername("zhangsan");System.out.println(userInfoMapper.updateById(userInfo));}@Testvoid delete() {//根据id进行删除System.out.println(userInfoMapper.deleteById(6));}
3.注解介绍
@TableName(识别实体类对应的表)
@TableField(表明属性对应字段名)
@TableId(指定对应的主键)
@Data
@TableName("user_info")//指定表名
public class UserInfo {//设置主键为自增类型的,这样才能按照自增设置主键的值@TableId(type = IdType.AUTO)private Integer id;private String username;private String password;private Integer age;private Integer gender;private String phone;@TableField("delete_flag")//指定字段名private Integer deleteFlag;private Date createTime;private Date updateTime;
}
4.条件构造器
QueryWrapper
SELECT id,username,password,age FROM user_info WHERE age = 18 AND username
"%min%"
@Testvoid queryWapper() {QueryWrapper<UserInfo> queryWrapper=new QueryWrapper<>();queryWrapper.eq("age",18).like("username","min").select("id","username","password");List<UserInfo> list=userInfoMapper.selectList(queryWrapper);list.stream().forEach(System.out::println);}
UPDATE user_info SET delete_flag=? WHERE age < 20
@Testvoid queryWapper2() {QueryWrapper<UserInfo> queryWrapper=new QueryWrapper<>();queryWrapper.lt("age",20);UserInfo userInfo=new UserInfo();userInfo.setDeleteFlag(0);userInfoMapper.update(userInfo,queryWrapper);}
QueryWapper可以用来拼接where部分的SQL语句,但Wrapper的基础上添加了select的功能
UpdateWapper
UPDATE user_info SET delete_flag=0, age=5 WHERE id IN (5,7);
@Testvoid updateWapper() {UpdateWrapper<UserInfo> updateWrapper=new UpdateWrapper<UserInfo>().set("delete_flag",0).set("age",5).in("id",List.of(5,7));userInfoMapper.update(updateWrapper);
直接设置SQL语句
UPDATE user_info SET age = age+10 WHERE id IN (1,2,3)
@Testvoid updateWapper2() {UpdateWrapper<UserInfo> updateWrapper=new UpdateWrapper<UserInfo>().setSql("age=age+10").in("id",List.of(1,2,3));userInfoMapper.update(updateWrapper);}
LambdaQueryWrapper和LambdaUpdateWrapper
LambdaQueryWrapper
@Testvoid queryWapper3() {LambdaQueryWrapper<UserInfo> lambdaQueryWrapper=new LambdaQueryWrapper<UserInfo>().select(UserInfo::getId,UserInfo::getUsername,UserInfo::getPassword).lt(UserInfo::getAge,20);List<UserInfo> list = userInfoMapper.selectList(lambdaQueryWrapper);list.stream().forEach(System.out::println);}
LambdaUpdateWrapper
Testvoid updateWapper() {UpdateWrapper<UserInfo> updateWrapper=new UpdateWrapper<UserInfo>().set("delete_flag",0).set("age",5).in("id",List.of(5,7));userInfoMapper.update(updateWrapper);}
5.自定义SQL
使用注解的方式:
参数Wrapper必须命名为ew,用Param注解,直接写ew或者使用常量类Constants.WAPPER
SQL用${ew.customSqlSegment}的方式传入参数
@Select("select * from user_info ${ew.customSqlSegment}")List<UserInfo> selectList(@Param(Constants.WRAPPER) Wrapper wrapper);//常量Constants.WRAPPER就是ew
LambdaUpdateWrapper<UserInfo> wrapper=new LambdaUpdateWrapper<UserInfo>().eq(UserInfo::getAge,10);userInfoMapper.selectList(wrapper);
使用XML的形式:
配置mapper路径:
mybatis-plus:mapper-locations: "classpath*:/mapper/**.xml" # Mapper.xml
定义方法:
List<UserInfo> selectList2(@Param(Constants.WRAPPER) Wrapper wrapper);
编写XML
<select id="selectList2" resultType="com.bit.mybatisplus.model.UserInfo">select * from user_info ${ew.customSqlSegment}</select>
测试
@Testvoid selectList() {LambdaQueryWrapper<UserInfo> wrapper=new LambdaQueryWrapper<UserInfo>().eq(UserInfo::getAge,10);//userInfoMapper.selectList(wrapper);//userInfoMapper.selectList2((Wrapper) wrapper);userInfoMapper.selectList2( wrapper);}