MybatisPlus

目录

1 MybatisPlus介绍

1.1 工作原理

2 依赖

3 注解

3.1 POJO类

3.1.1 @TableName

3.1.2 @TableId

3.1.3 @TableField

4 配置

4.1 Mapper

4.2 YML

5 API

5.1 常见CURD API

5.2 分页实现-MP

5.3 分页实现-xml


1 MybatisPlus介绍

是一个Mybatis的增强工具,在Mybatis的基础上只做增强不做改变,为简化开发,提高效率.

1.1 工作原理

核心思想: 以对象的方式操作数据库

配置: 

  1. 编辑POJO与数据表的映射
  2. 标记POJO属性与表字段映射
  3. 封装了大量的常用CURD API 简化代码
  4. 根据对象动态的生成Sql语句

执行过程:

  1. 程序业务开始调用
  2. 根据Mapper接口动态获取操作的泛型对象, 获取对象之后获取表的相关数据
  3. 获取对象, 并获取表名称, 字段名, 数据值
  4. 将对象转化为特定的SQL, 之后交给Mybatis执行

SQL: insert into demo_user(id,name,age,gender) values(null,xx,xx,xx) 

2 依赖

 		<!--spring整合mybatis-plus MP中包含了mybatis依赖 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.3</version>
        </dependency>

3 注解

3.1 POJO类

3.1.1 @TableName

实现POJO对象与数据库的表名一一映射

如:@TableName("demo_user")

3.1.2 @TableId

设定主键自增

如:@TableId(type = IdType.AUTO)

3.1.3 @TableField

实现POJO属性与表中的字段名一一映射(若属性名与字段名一致,则注解可以省略)

如:TableField("name")

注:字段名user_name与userName属性名映射

4 配置

4.1 Mapper

Mapper接口需要extends MybatisPlus的BaseMapper<T>接口,且必须添加泛型,泛型对象为POJO类,否则程序无法执行

如:

@Mapper
public interface UserMapper extends BaseMapper<User> {
    List<User> RetrieveAll();
}

4.2 YML

#SpringBoot整合MybatisPlus
mybatis-plus:
    #设置别名包
    type-aliases-package: com.jt.pojo
    #加载映射文件
    mapper-locations: classpath:/mappers/*.xml
    #开启驼峰映射
    configuration:
        map-underscore-to-camel-case: true

5 API

5.1 常见CURD API

package com.jt.test;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.jt.mapper.UserMapper;
import com.jt.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.util.StringUtils;

import java.util.List;

@SpringBootTest
public class TestMybatis {
    @Autowired
    private UserMapper userMapper;

    @Test
    public void findAll() {
        System.out.println(userMapper.findAll());
    }

    //思想:以对象的方式操作数据库 单表几乎不写SQL
    //简化CURD操作
    @Test
    public void testInsert() {
        User user = new User();
        user.setName("MP").setSex("其他").setAge(18);
        userMapper.insert(user);
    }

    //1.根据id主键 查询id=1的数据
    //SELECT id,name,age,sex FROM demo_user WHERE id=?
    @Test
    public void testSelect1() {
        User user = userMapper.selectById(1);
        System.out.println(user);
    }

    //2.查询name="小乔" sex="男"的用户
    //Sql: select * from demo_user where name="xx" and sex="xx"
    @Test
    public void testSelect2() {
        //创建条件构造器,封装where条件的
        User user = new User();
        user.setName("小乔").setSex("男");
        //实现时会动态的根据对象中不为null的属性,拼接where条件
        //默认的关系连接符 and
        QueryWrapper queryWrapper = new QueryWrapper(user);
        List<User> userList = userMapper.selectList(queryWrapper);
        System.out.println(userList);
    }

    //3.查询name="小乔" sex="男"的用户
    //Sql:SELECT id,name,age,sex FROM demo_user WHERE name=? AND sex=?
    @Test
    public void testSelect3() {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("name", "小乔").eq("sex", "男");
        List<User> userList = userMapper.selectList(queryWrapper);
        System.out.println(userList);
    }

    //4.查询age>18 sex="女"的用户
    //Sql:SELECT * demo_user WHERE age > 18 and sex="女"
    //逻辑运算符 > gt, < lt ,= eq,>= ge,<= le,!= ne
    @Test
    public void testSelect4() {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.gt("age", 18).eq("sex", "女");
        List<User> userList = userMapper.selectList(queryWrapper);
        System.out.println(userList);
    }

    //5. like关键字
    //5.1 查询name包含"乔" where name like '%乔%'
    //5.2 查询name以乔结尾的 where name like '%乔'
    @Test
    public void testSelect5() {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//        queryWrapper.like("name", "乔");
        queryWrapper.likeLeft("name", "乔");
        List<User> userList = userMapper.selectList(queryWrapper);
        System.out.println(userList);
    }

    /*
     * 6.in关键字
     * 需求:查询ID为1,3,5,6的
     * Sql: select * from demo_user where id in (1,3,5,6)
     * java基础:参数中使用...表示可变参数类型 多个参数','分隔
     *          一般定义可变参数类型时,参数一般位于方法的最后一位
     *          可变参数类型的实质,就是数组,写法不同
     */
    @Test
    public void testSelect6() {
        //一般的数组采用包装类型,使用对象身上的方法,基本类型没有方法
        Integer[] ids = {1, 3, 5, 6};
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//        queryWrapper.in("id", 1, 3, 5, 6);
        queryWrapper.in("id", ids);
        List<User> userList = userMapper.selectList(queryWrapper);
        System.out.println(userList);
    }

    /*
     * 关键字:order by 排序
     * 默认规则: 升序 asc / 降序 desc
     * 需求:查询性别为男的用户,并且按照年龄降序排列
     * SQL: select * from demo_user where sex = "男" order by age desc
     */
    @Test
    public void testSelect7() {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("sex", "男").orderByDesc("age");
        List<User> userList = userMapper.selectList(queryWrapper);
        System.out.println(userList);
    }

    /*
     * 动态SQL:根据用户的条件,动态的拼接where条件   (如果某些数据不为null,则需要拼接为where条件)
     * 案例:根据sex,age查询数据
     *  1.select * from demo_user where age >18 and sex = "女"
     * API说明:
     *      queryWrapper.gt(判断条件,字段名称,字段值)
     *      判断条件:true     动态的拼接where条件
     *              false   不会拼接where条件
     * 判断语句:
     *   Sql: select * from demo_user where id in (1,3,5,6)
     */
    @Test
    public void testSelect8() {
        Integer age = 18;
        String sex = "";
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        boolean ageBoo = (age != null);
        boolean sexBoo = StringUtils.hasLength(sex);
        queryWrapper.gt(ageBoo, "age", age)
                .eq(sexBoo, "sex", "女");
        List<User> userList = userMapper.selectList(queryWrapper);
        System.out.println(userList);

    }

    /*
     * 9.只获取主键ID的值
     * SQL: select id from demo_user where ......
     */
    @Test
    public void testSelect9() {
        List idList = userMapper.selectObjs(null);
        System.out.println(idList);
    }

    /*
     * 练习10: 删除name="xxx"的数据
     */
    @Test
    public void testDelete() {
        //删除ID为100的数据
        userMapper.deleteById(100);
        //userMapper.deleteBatchIds(null);
        //删除操作的条件构造器
        QueryWrapper queryWrapper = new QueryWrapper();
        queryWrapper.eq("name", "xxx");
        userMapper.delete(queryWrapper);
    }

    /*
     * 练习11:数据修改
     * 案例1:要求修改id=233 name改为="晚上吃什么"
     * API说明:userMapper.updateById(对象信息)
     */
    @Test
    public void testUpdate() {
        //修改除ID之外的所有不为null的数据,id当做where的唯一条件
        User user = new User();
        user.setId(233).setName("晚上吃什么");
        userMapper.updateById(user);
    }

    /*
     * 练习12:数据修改
     * 案例2: 将name=mp的用户改为name="宵夜吃什么" age = 20 sex = "女"
     * API说明:
     *          userMapper.update(对象,修改条件构造器)
     *          对象:修改后的数据使用对象封装
     *          修改条件构造器: 负责修改的where条件
     */
    @Test
    public void testUpdate2() {
        User user = new User();
        user.setName("宵夜吃什么").setAge(20).setSex("女");
        UpdateWrapper updateWrapper = new UpdateWrapper();
        updateWrapper.eq("name", "MP");
        userMapper.update(user, updateWrapper);
    }
}

5.2 分页实现-MP

    @Override
    public PageResult getUserList(PageResult pageResult) {//原始3个参数
        //1.定义MP的分页对象
        IPage iPage = new Page(pageResult.getPageNum(), pageResult.getPageSize());
        //2.构建查询条件构造器
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        //判断用户数据是否有效 有效 true 无效 false
        boolean flag = StringUtils.hasLength(pageResult.getQuery());
        queryWrapper.like(flag, "username", pageResult.getQuery());
        //经过MP分页查询将所有的分页(total/结果/页面/条数/xxx)数据封装到iPage对象
        iPage = userMapper.selectPage(iPage, queryWrapper);
        //从分页对象中获取总记录数
        long total = iPage.getTotal();
        //从分页对象中获取分页后的结果
        List<User> rows = iPage.getRecords();
        return pageResult.setTotal(total).setRows(rows);
    }

5.3 分页实现-xml

    <!--方案1
        实现user分页查询
        List<User> getUserList(int startIndex, int pageSize);
    -->
    <select id="getUserList" resultType="User">
        select * from user limit #{startIndex},#{pageSize}
    </select>

    <!--方案2
        在mybatis内部做算术计算
        $符可以进行算数计算
        #号默认为字符串,不会进行计算
    -->
    <select id="getUserList2" resultType="User">
        select * from user
            /*动态Sql*/
            <where>
                <if test="query != null and query != ''">username like "%"#{query}"%"</if>
            </where>
        limit ${(pageNum-1)*pageSize},#{pageSize}
    </select>

版权声明:本文为CSDN博主「闪耀太阳」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_16804847/article/details/118209272

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值