MyBatisPlus
一、介绍:
MyBatis-Plus(简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提升效率而生。
二、为什么使用MyBatis-Plus?
使用MyBatis或者是其他的持久层框架或技术实现CRUD操作,逻辑思路简单,但操作实现繁琐,如果大量的重复代码由程序媛来实现,未免有些影响效率,所以我们使用MyBatisPlus这种简化开发的工具来帮助我们快速开发
注意:MyBatisPlus主要完成单表的CRUD操作简化开发
三、MyBatis-plus入门
实现步骤:
- 导入MyBatis-plus的jar包文件
- 思想:使用对象的方式操作数据库
- 编辑pojo实现对象与数据表的映射关系
- 继承公共的接口(BaseMapper),获取常用的CRUD操作
- 实现数据库操作
导入jar包文件:
<!--spring整合mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
编辑pojo类:
//注解的作用:动态的生成get/set/toString...方法
@Data //一般为属性赋值get/set方法
@Accessors(chain = true) //开启链式加载(重写set方法)
@NoArgsConstructor //无参构造
@AllArgsConstructor //全参构造
@TableName("demo_user")
public class User {
@TableId(type = IdType.AUTO)
private Integer id;
// @TableField("name")
private String name;
private Integer age;
private String sex;
}
注意: 1、pojo类应该与数据库中的表完成映射(@TableName(“demo_user”) //实现对象与表名映射)
2、pojo中的属性与表中的字段一一映射
使用注解:设定主键自增 @TableId(type = IdType.AUTO)
@TableField(“name”) 实现属性与字段映射.(如果属性与字段的名称一致,则注解可以省略)
继承公共的接口(BaseMappper<pojo类>):
public interface UserMapper extends BaseMapper<User> {
//查询所有的user表数据
List<User> findAll();
}
注意: 继承接口之后,必须添加泛型对象,否则程序无法执行
父类中的接口:MyBatis-Plus将常用的CRUD的方法进行了抽取,以后自雷如果需要调用,则直接使用即可
MyBatis-Plus生效配置:
注意:如果之前你使用的是MyBatis,那就可以直接在后面加个-plus即可
#SpringBoot整合MyBatisPlus
mybatis-plus:
#设置别名包
type-aliases-package: com.jt.pojo
#加载映射文件
mapper-locations: classpath:/mappers/*.xml
#开启驼峰映射
configuration:
map-underscore-to-camel-case: true
#打印Sql语句
logging:
level:
com.jt.mapper: debug
#未来只要这个包下的sql执行,就会以debug的形式打印日志
实现数据库操作:
//思想:以对象的形式操作数据库,单表几乎
@Test
public void testInsert(){
User user=new User();
user.setName("MP").setAge(19).setSex("其他");
userMapper.insert(user);
}
MP工作原理:
核心思想:以对象的方式操作数据库
配置:
1、编辑POJO与数据表的映射
2、编辑POJO属性与表字段映射
3、封装了大量的常用CRUD API 简化用户调用
4、根据对象动态的生成Sql语句
执行过程:
1、程序业务开始调用userMapper.insert(user)
2、根据Mapper接口动态获取操作的泛型,获取对象之后获取表的相关数据
public interface UserMapper extends BaseMapper获取这个泛型
3、只要获取对象 获取了表名称,字段名称,数据的值
4、将对象转化为特定的Sql,之后交给MyBatis执行
MP常用操作:
-
根据ID查询:
//1.根据ID查询 @Test public void selectById(){ User user = userMapper.selectById(1); System.out.println(user); }
-
selectList查询:
//2.查询name="小乔" sex="男"的用户 public void testSelect2(){ User user=new User(); user.setName("小乔").setSex("男"); //实现会动态的根据对象中不为null的属性,拼接where条件 //条件构造器默认的管理连接符是and QueryWrapper<User> userQueryWrapper = new QueryWrapper<>(user); List<User> userList = userMapper.selectList(userQueryWrapper); System.out.println(userList); }
//3.查询name="小乔" sex="男"的用户 public void testSelect3(){ QueryWrapper<User> userQueryWrapper = new QueryWrapper<>(); userQueryWrapper.eq("name", "小乔").eq("sex", "男"); List<User> userList = userMapper.selectList(userQueryWrapper); System.out.println(userList); }
//4.查询 age> 18 sex="女"的用户 public void testSelect4(){ QueryWrapper<User> userQueryWrapper = new QueryWrapper<>(); //逻辑运算符: > gt, < lt, = eq, >= ge, <= le, != ne userQueryWrapper.gt("age", 18).eq("sex", "女"); List<User> userList = userMapper.selectList(userQueryWrapper); System.out.println(userList); }
-
selectList查询–like关键字(%号在左边就是leftLike,%在右边就是rightLike,两边都有%就是like)
//5. like关键字 //5.1 查询name包含"乔" where name like '%乔%' //5.2 查询name以乔结尾的 where name like '%乔' @Test public void testSelect5(){ QueryWrapper<User> userQueryWrapper = new QueryWrapper<>(); userQueryWrapper.like("name", "乔"); List<User> userList = userMapper.selectList(userQueryWrapper); System.out.println(userList); userQueryWrapper.clear(); userQueryWrapper.likeLeft("name", "乔"); List<User> userList1 = userMapper.selectList(userQueryWrapper); System.out.println(userList1); }
-
selectList查询–in关键字(两个方法,一个是可变参数,一个是数组集合)
//6. in 关键字 //需求: 查询ID为1,3,5,6的数据 @Test public void testSelect6(){ QueryWrapper<User> userQueryWrapper = new QueryWrapper<>(); //可变参数 userQueryWrapper.in("id", 1,3,5,6); List<User> userList = userMapper.selectList(userQueryWrapper); System.out.println(userList); }
@Test public void testSelect6(){ QueryWrapper<User> userQueryWrapper = new QueryWrapper<>(); //一般的数组采用包装类型,使用对象身上的方法,基本类型没有方法 Integer[] arr={1,3,5,6}; userQueryWrapper.in("id",arr); List<User> userList = userMapper.selectList(userQueryWrapper); System.out.println(userList); }
-
selectList查询–order by
//7.关键字: order by 排序 //默认规则:升序asc 如果想要降序desc //需求: 查询性别为男的用户并且 按照年龄降序排列. @Test public void testSelect7(){ QueryWrapper<User> userQueryWrapper = new QueryWrapper<>(); userQueryWrapper.eq("sex", "男").orderByDesc("age"); List<User> userList = userMapper.selectList(userQueryWrapper); System.out.println(userList); }
-
selectList查询–动态Sql
/** * 动态Sql: * 根据用户的条件,动态的拼接where条件 * 案例: 根据sex,age查询数据 * 1.select * from demo_user where age > 18 and sex="女" * API说明: * queryWrapper.gt(判断条件,字段名称,字段值) * 判断条件: true 则动态的拼接where条件 * false 不会拼接where条件 * 判断语句: * Boolean sexBoo = (sex !=null) && sex.length()>0; */ @Test public void testSelect8(){ String sex="男"; Integer age=20; QueryWrapper<User> userQueryWrapper = new QueryWrapper<>(); //判断参数是否存在 Boolean sexBoo=StringUtils.hasLength(sex); Boolean ageBoo=(age!=null); // age > 18 and sex="女" userQueryWrapper.gt(ageBoo, "age", 18).eq(sexBoo, "sex", sex); List<User> userList = userMapper.selectList(userQueryWrapper); System.out.println(userList); }
-
selectList查询–objs
/** * 练习9: 只获取主键ID的值 * Sql: select id from demo_user */ @Test public void testSelect9(){ //注意:如果我们将这里的泛型修改,会导致这里报错,因为在java中只能向上造型,没有向下造型,selectObjs方法的返回值是Object类型 List<Object> ids = userMapper.selectObjs(null); System.out.println(ids); }
-
删除操作
/** * 练习10: 删除name="xxx"的数据 */ @Test public void testDelete(){ //删除操作的条件构造器 QueryWrapper<User> userQueryWrapper = new QueryWrapper<>(); userQueryWrapper.eq("name", "小乔"); userMapper.delete(userQueryWrapper); userQueryWrapper.clear(); //删除ID为100的数据 userMapper.deleteById(100); }
-
更新操作–byId
/** * 练习11: 数据修改 * 案例1: 要求修改id=233 name改为="晚上吃什么" * API说明: userMapper.updateById(对象信息) */ @Test public void testUpdate1(){ User user=new User(); user.setId(233).setName("晚上吃什么"); //修改除ID之外的所有不为null的数据,id作为where的唯一条件 userMapper.updateById(user); }
-
更新操作–任意字段
/** * 练习12: 数据修改 * 案例2: 将name=mp的用户改为name="宵夜吃什么" age=20 sex=女 * API说明: * userMapper.update(对象,修改条件构造器) * 对象: 修改后的数据使用对象封装 * 修改条件构造器: 负责修改的where条件 */ @Test public void testUpdate2(){ QueryWrapper<User> userQueryWrapper = new QueryWrapper<>(); userQueryWrapper.eq("name", "夜宵吃什么"); User user=new User(); user.setAge(20).setSex("女"); userMapper.update(user,userQueryWrapper); }