• MyBatisPlus


    1 MP介绍

    MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

    2 新特性

    无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
    损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
    强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
    支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
    支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
    支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
    支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
    内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
    内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
    分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
    内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
    内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

    愿望: 以面向对象的方式操作数据库!!!

    3 JPA思想

    JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。 [1]
    Sun引入新的JPA ORM规范出于两个原因:其一,简化现有Java EE和Java SE应用开发工作;其二,Sun希望整合ORM技术,实现天下归一。

    4 MybatisPlus 原理说明

    核心: 以对象的方式操作数据库
    例子: 自己写 userMapper.insert(user对象);
    自己编辑Sql
    insert into user values(#{id},#{name},#{age}…); 将来由框架完成.

    思考:
    1. 对象与表如何关联? 通过注解实现对象与表映射
    2. 如何将curd操作做到统一定义? 将CRUD操作统一封装到Mapper接口中. 其他的Mapper只需要集成即可.
    3. 数据库只能识别sql语句. 如何将对象与sql转化???
    将对象的操作动态的转化为sql语句.之后交给Mybatis执行

    1. userMapper.insert(user对象);
    insert into user  values(#{id},#{name},#{age}....)
    
    2. deptMapper.insert(dept对象);
    insert into dept  values(.....)

    5 导入jar包文件

    说明: 导入MP包之后,将原有的Mybatis包删除.

    <!--spring整合mybatis-plus -->
        <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>3.2.0</version>
        </dependency>

    6 编辑User POJO对象

    7 继承公共的Mapper接口

    extends BaseMapper<>

    8 修改YML配置文件

    #切换为Mybatisplus的配置   
    mybatis-plus:
      # 定义别名包
      type-aliases-package: com.jt.demo.pojo
      # 批量导入mapper映射文件
      mapper-locations: classpath:/mybatis/mappers/*.xml
      #开启驼峰映射
      configuration:
        map-underscore-to-camel-case: true
    
    #引入sql日志输出
    logging:
      level:
        com.jt.demo.mapper: debug 

    9 MP API学习

    package com.jt.demo.test;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    import com.baomidou.mybatisplus.core.conditions.query.Query;
    import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
    import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
    import com.jt.demo.mapper.UserMapper;
    import com.jt.demo.pojo.User;
    
    @SpringBootTest
    public class TestMybatis {
    
        @Autowired
        private UserMapper userMapper;
    
        @Test
        public void testFindUser() {
    
            List<User> userList = userMapper.findAll();
            System.out.println(userList);
        }
    
    
        //1.案例1:利用MP实现查询所有的数据
        @Test
        public void selectList() {
    
            List<User> userList = userMapper.selectList(null);
            System.out.println(userList);
        }
    
    
        //1.用户入库操作
        //注意事项: MP操作时,将对象中不为null的数据 当做执行要素
        @Test
        public void insert() {
    
            User user = new User();
            user.setName("特朗普");
            user.setAge(60);
            user.setSex("男");
            userMapper.insert(user);
        }
    
        //1.查询name="特朗普"的用户
        //SELECT id,sex,name,age FROM user WHERE 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  用户
        //逻辑运算符     = eq,  > gt ,< lt , >= ge ,  <= le  
        @Test
        public void select02() {
            QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
            queryWrapper.eq("sex", "女");
            queryWrapper.gt("age", 200);
            List<User> userList = userMapper.selectList(queryWrapper);
            System.out.println(userList);
        }
    
        /**
         *     3. 查询name中包含"精"的用户  like
            sql: SELECT id,sex,name,age FROM user WHERE (name LIKE ?) 
            3.1 查询name中  以"精"结尾的数据    like  %精
            sql:SELECT id,sex,name,age FROM user WHERE (name LIKE ?) 
                Parameters: %精(String)
         */
        @Test
        public void select03() {
            QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
            //queryWrapper.like("name", "精");
            queryWrapper.likeLeft("name", "精");
            List<User> userList = userMapper.selectList(queryWrapper);
            System.out.println(userList);
        }
    
        /**
         * 案例:  查询age 位于  18-35, and  并且要求性别 "男"
         * 规则:  在多条件测试下 默认采用and连接
         * SELECT id,sex,name,age FROM user WHERE (age BETWEEN ? AND ? AND sex = ?) 
         */
        @Test
        public void select04() {
            QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
            queryWrapper.between("age", 18, 35)
            .eq("sex", "男");
            List<User> userList = userMapper.selectList(queryWrapper);
            System.out.println(userList);
        }
    
    
        /**
         * 要求: 查询name不为null的用户信息,
         *          并且根据age降序排列,如果age相同则按照sex排序 
         *          SELECT id,sex,name,age FROM user WHERE (name IS NOT NULL) ORDER BY age DESC , sex DESC 
         */
        @Test
        public void select05() {
    
            QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
            queryWrapper.isNotNull("name")
            .orderByDesc("age","sex");
            userMapper.selectList(queryWrapper);
        }
    
        //查询单个用户数据
        @Test
        public void select06() {
            //1.根据主键进行查询    返回值结果单个对象
            User user = userMapper.selectById(1);
            System.out.println(user);
    
            //2.根据非主键的字段查询单个数据
            QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
            queryWrapper.eq("name", "特朗普");
            User user2 = userMapper.selectOne(queryWrapper);
            System.out.println(user2);
    
        }
    
        //批量查询数据   要求查询id 1 3 5 8 10..
        //SELECT id,sex,name,age FROM user WHERE id IN ( ? , ? , ? , ? ) 
        //单表操作可以使用 in/or  但是多表操作时慎用.
        @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> list2 = Arrays.asList(ids);
            List<User> userList = userMapper.selectBatchIds(list2);
            System.out.println(userList);
        }
    
        //查询记录总数  name不为null的
        @Test
        public void select08() {
    
            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
            queryWrapper.isNotNull("name");
            int count = userMapper.selectCount(queryWrapper);
            System.out.println(count);
        }
    
        //自己练习删除案例
        @Test
        public void delete() {    
            
            userMapper.delete(null);
        }
        
        //更新数据库
        //将id=53的用户信息  改为  name="奥巴马"  age=66  
        @Test
        public void update01() {    
            //根据主键更新.  要求对象中必须传递主键信息
            User user = new User();
            user.setId(53).setName("奥巴马").setAge(66) ;
            userMapper.updateById(user);
        }
        
        //将name=null的用户信息 name改为="测试案例" sex="男" age=1;
        /**
         * 参数:
         *     1.entity  用户赋值封装的对象
         *  2.修改的条件构造器
         *  
         * UPDATE user SET sex=?, name=?, age=? WHERE (name IS NULL) 
         */
        @Test
        public void update02() {    
            
            User user = new User();
            user.setName("测试案例").setAge(1).setSex("男");
            UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
            updateWrapper.isNull("name");
            userMapper.update(user, updateWrapper);
        }
    
    }
  • 相关阅读:
    深入理解JavaScript定时器(续)
    也谈前端基础设施建设
    Reporting Services在指定计算机上找不到报表服务器
    优化tempdb提高SQL Server的性能
    SQL 代理服务未运行。此操作需要 SQL 代理服务。 (rsSchedulerNotResponding) 获取联机帮助
    报表服务器上出现内部错误。有关详细信息,请参阅错误日志。 (rsInternalError) 获取联机帮助.找不到存储过程 'GetOneConfigurationInfo'。
    表中包含有外键时无法进行导入数据,
    SQLSTATE ODBC API(驱动程序管理器)错误
    数据库只能用机器名连接,不能用ip地址连接
    请教:不能访问通过IP访问,却可以通过机器名访问
  • 原文地址:https://www.cnblogs.com/wangjincai/p/13415366.html
Copyright © 2020-2023  润新知