• mybatis-plus


    mybatis-plus插件的使用

    这里只介绍简单使用, 更多详细信息请参考:

    官网: https://mp.baomidou.com/

    官方手册离线版: [点击下载]

    狂神笔记: [点击下载笔记] 来源: 狂神说gitee

    入门程序

    1. 导入依赖

    mybatis 和 mybatis-plus不能同时存在

    maven地址:https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter

    2. pojo对象

    主要注解:

    @TableName("表明") 将对象与表明关联, 参数为数据库表名

    @TableId() 定义主键信息, 参数为枚举类型IdType

    @TableField("") 标识字段与属性的映射关系(驼峰命名), 如果名字相同则可以省略

    @Data
    @TableName("user") // 将对象与表明关联, 参数为数据库表名
    @Accessors(chain = true)
    public class User {
    	@TableId(type = IdType.AUTO) // 定义主键信息
    	private Integer id;
    	@TableField(value = "name") // 标识字段与属性的关联关系
    	private String name;
    	private Integer age;
    	private String sex;
    }
    

    3. dao接口, 继承BaseMapper接口

    如果启动类上有了mapper的自动扫描注解, 例如@MapperScan("com.jt.demo.mapper"), 可不写@Mapper注解

    @Mapper
    public interface UserMapper extends BaseMapper<User> {
    	
    }
    

    4. YML的配置

    其中数据源的配置是必不可少的, 其他可不写(看需求)

    mybatis的配置前缀改为mybatis-plus, 如下:

    spring:
      datasource:
        # driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/jtdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
        username: root
        password: 123456
    
    #切换为Mybatisplus的配置   
    mybatis-plus:
      # 定义别名包
      type-aliases-package: com.jt.demo.pojo
      #开启驼峰映射
      configuration:
        map-underscore-to-camel-case: true
        
    #引入sql日志输出
    logging:
      level:
        com.jt.demo.mapper: debug 
    

    5. 测试

    @Autowired
    private UserMapper userMapper;
    
    @Test
    public void select() {
        List<User> users = userMapper.selectList(null);
        System.out.println(users);
    }
    

    结果: 查询到了所有的user

    核心API

    insert

    返回值 方法 说明
    int insert(T entity); 插入一条记录

    delete

    返回值 方法 说明
    int deleteById(Serializable id); 根据 ID 删除
    int deleteByMap(Map<String, Object> columnMap); 根据 columnMap 条件,删除记录
    int delete(Wrapper<T> wrapper); 根据 entity 条件,删除记录
    wrapper为实体对象封装操作类
    (可以为 null)
    int deleteBatchIds(Collection idList); 删除(根据ID 批量删除)
    参数为集合
    idList 主键ID列表
    (不能为 null 以及 empty)

    update

    返回值 方法 说明
    int updateById( T entity); 根据 ID 修改
    int update(@Param(T entity, Wrapper<T> updateWrapper); 根据 whereEntity 条件,
    更新记录
    updateWrapper为
    实体对象封装操作类
    (可以为 null,里面的 entity
    用于生成 where 语句)

    select

    返回值 方法 说明
    T (泛型) selectById(Serializable id); 根据 ID 查询
    List selectBatchIds(Collection idList); 查询
    (根据ID 批量查询)
    参数为一个集合类型
    List selectByMap(Map<String, Object> columnMap); 查询(
    根据 columnMap 条件)
    T (泛型) selectOne(Wrapper<T> queryWrapper); 根据 entity 条件,
    查询一条记录
    queryWrapper为实体对象
    封装操作类
    (可以为 null)
    Integer selectCount(Wrapper<T> queryWrapper); 根据 Wrapper 条件,
    查询总记录数
    List selectList(Wrapper<T> queryWrapper); 根据 Wrapper条件,
    查询全部记录
    List<Map<String, Object>> selectMaps(Wrapper<T> queryWrapper); 根据 Wrapper 条件,
    查询全部记录
    List selectObjs(Wrapper<T> queryWrapper); 根据 Wrapper 条件,
    查询全部记录
    注意:
    只返回第一个字段的值
    IPage selectPage(IPage<T> page,Wrapper<T> queryWrapper); 根据 entity 条件,
    查询全部记录(并翻页)
    IPage<Map<String, Object>> selectMapsPage(IPage<T> page,Wrapper<T> queryWrapper); 根据 Wrapper 条件,查询全部记录(并翻页)
    page为分页查询条件
    queryWrapper为实体对象封装操作类

    分页查询

    分页查询需要配置分页拦截器, 即, 把PaginationInterceptor交给spring管理

    @Configuration
    public class MybatisPlusConfig {
    	
    	// 将分页拦截器交给spring容器管理. 
    	@Bean
    	public PaginationInterceptor pageInationInterceptor() {
    		return new PaginationInterceptor();
    	}
    
    }
    

    然后就可以正常分页了, 如果不加这个配置, 分页不会生效

    分页查询如下:

    @Override
    	public void findItemByPage(Integer page, Integer rows) {
    		// Page参数问题: 参数1: 第几页		参数2: size 每页多条条
    		// 分页查询条件
    		QueryWrapper<Item> queryWrapper = new QueryWrapper<>();
            // updated字段降序
    		queryWrapper.orderByDesc("updated");
            // 定义分页类, 参数1为第几页, 参数2为每页多少条数据
    		IPage<Item> iPage = new Page(page, rows);
            // 查询结果存入iPage
    		iPage = itemMapper.selectPage(iPage, queryWrapper);
    		long total = iPage.getTotal(); // 由分页工具获取
    		List<Item> itemList = iPage.getRecords(); // 获取当前分页的信息
    		// ...
    	}
    

    案例

    用户入库操作

    注意事项: MP操作时, 将对象中不为null的数据,当做执行要素

    @Test
    public void insert() {
        User user = new User();
        user.setName("特朗普");
        user.setAge(60);
        user.setSex("男");
        int rows = userMapper.insert(user);
        System.out.println(rows);
    }
    

    条件查询1

    查询name="特朗普"的用户

    @Test
    public void select01() {
        // 定义条件构造器 动态拼接where条件之后的数据
        User user = new User();
        user.setName("特朗普");
    
        // where name = "xxxx"
        QueryWrapper<User> queryWrapper = new QueryWrapper<>(user);
        List<User> userList = userMapper.selectList(queryWrapper);
        System.out.println(userList);
    }
    

    条件查询2

    查询sex="女" age > 200 的用户

    @Test
    public void select02() {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("sex", "女");
        queryWrapper.gt("age", 200);
        List<User> userList = userMapper.selectList(queryWrapper);
        System.out.println(userList);
    }
    

    条件查询3

    查询name中包含"精"的用户 like

    @Test
    public void select03() {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.like("name", "精"); // "%精%" 包含精
        // queryWrapper.likeLeft("name", "精"); // "%精" 以精字结尾
        // queryWrapper.likeRight("name", "精"); // "%精" 以精字开头
        List<User> userList = userMapper.selectList(queryWrapper);
        System.out.println(userList);
    }
    

    条件查询4

    查询age位于 18-30之间, 并且要求性别 "男"

    @Test
    public void select04() {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.between("age", 18, 35).eq("sex", "男");
        List<User> userList = userMapper.selectList(queryWrapper);
        System.out.println(userList);
    }
    

    条件查询5

    查询name不为空, 并且根据age降序排序,如果age相同则按照sex排序

    @Test
    public void select05() {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.isNotNull("name").orderByDesc("age", "sex");
        List<User> userList = userMapper.selectList(queryWrapper);
        System.out.println(userList);
    }
    

    条件查询6

    批量查询数据 要求查询id = 1, 3, 5, 8

    @Test
    public void select07() {
        // 1. idList 自己进行封装
        // List<Integer> idList = new ArrayList<>();
        //	idList.add(1);
        //	idList.add(3);
        //	idList.add(5);
        //	idList.add(8);
    
        // 2. Id的信息一般都是由前端进行传递, 所以一般都是竖着格式
        // 一般在定义数组格式时, 最好采用对象类型
        Integer[] ids = { 1, 3, 5, 8 };
        // 将数组转为集合
        List<Integer> idList = Arrays.asList(ids);
        List<User> userList = userMapper.selectBatchIds(idList); // in 语法
        System.out.println(userList);
    }
    

    条件查询7

    查询记录总数 name不为空的记录总数

    @Test
    public void select08() {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.isNotNull("name");
        int count = userMapper.selectCount(queryWrapper);
        System.out.println(count);
    }
    

    条件查询8

    查询记录总数 name不为空的记录总数

    @Test
    public void delete() {
        userMapper.deleteById(null);
    }
    

    条件查询9

    根据id查询

    @Test
    public void select06() {
        // 根据主键进行查询  返回值结果单个对象
        User user = userMapper.selectById(1);
        System.out.println(user);
    }
    

    根据id修改

    @Test
    public void update01() {
        // 根据主键更新, 要求对象中必须传递主键的信息
        User user = new User();
        user.setId(53);
        user.setName("奥巴马");
        user.setAge(66);
        user.setSex("男");
        userMapper.updateById(user);
    }
    

    根据条件修改

    将name=null的用户信息name改为="测试案例" sex="男" age=1

    @Test
    public void update02() {
        User user = new User();
        user.setName("测试案例");
        user.setSex("男");
        user.setAge(1);
        UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
        updateWrapper.isNull("name");
        userMapper.update(user, updateWrapper);
    }
    
  • 相关阅读:
    倒序数组的算法
    SQL 日期操作函数
    sp_executesql 练习
    c#编译器对byte类型的一些规则
    角度在excel中如何输入并使其能计算
    5天学会fx5800计算器测量编程(二) fx5800函数学习
    5天学会fx5800计算器测量编程(二) fx5800语法学习
    如何快速的将大地坐标系导入进施工结构的cad平面图纸中
    CAD中批量导入坐标和点号的方法命令
    5天学会fx5800计算器测量编程(一)
  • 原文地址:https://www.cnblogs.com/zpKang/p/13398995.html
Copyright © 2020-2023  润新知