zoukankan      html  css  js  c++  java
  • MybatisPlus的通用 CRUD

    3.1 通用 CRUD

    1) 提出问题: 假设我们已存在一张 tbl_employee 表,且已有对应的实体类 Employee,实现 tbl_employee 表的 CRUD 操作我们需要做什么呢?

    2) 实现方式:

    基于 Mybatis

    需要编写 EmployeeMapper 接口,并手动编写 CRUD 方法 提供 EmployeeMapper.xml 映射文件,并手动编写每个方法对应的 SQL 语句.

    基于 MP

    只需要创建 EmployeeMapper 接口, 并继承 BaseMapper 接口.这就是使用 MP 需要完成的所有操作,甚至不需要创建 SQL 映射文件。

    3.2 插入操作

    @Test
    public void testInsert(){
        //初始化Employee对象
        Employee employee  = new Employee();
        employee.setLastName("shuchegnxi");
        employee.setEmail("shuchegnxi@atguigu.com");
        //insert 方法在插入时,会根据实体类的每个属性进行非空判断,只有非空属性对应的字段才会出现到sql语句中
        employeeMapper.insert(employee);
    
        //insertAllColumn方法在插入时,无论属性是否为空,属性所对应的字段都会出现到sql语句中
        //employeeMapper.insertAllColumn(employee);
    
        //获取当前数据在数据库中的主键值
        System.out.println("主键值:"+employee.getId());
    }

    和插入相关的属性和配置

    @TableId

    /*
       @TableId:
        value : 指定表中主键列的列名,如果实体的属性和列名一直,则可以省略不指定
        type: 指定主键的策略
    
     */
    @TableId(value = "id",type = IdType.AUTO)

    @TableName

    // 指定该实体对应的数据库的表名
    @TableName(value = "tbl_employee")

    mybatisplus的全局配置+注入到 sqlSessionFactoryBean

    <bean id="sqlSessionFactoryBean" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
       <!-- 数据源 -->
       <property name="dataSource" ref="dataSource"></property>
       <property name="configLocation" value="classpath:mybatis.xml"></property>
       <!-- 别名处理 -->
       <property name="typeAliasesPackage" value="com.atguigu.mp.beans"></property>      
       
       <!-- 注入全局MP策略配置 -->
       <property name="globalConfig" ref="globalConfiguration"></property>
    </bean>
    
    <!-- 定义MybatisPlus的全局策略配置-->
    <bean id ="globalConfiguration" class="com.baomidou.mybatisplus.entity.GlobalConfiguration">
       <!-- 在2.3版本以后,dbColumnUnderline 默认值就是true -->
       <property name="dbColumnUnderline" value="true"></property>
       
       <!-- 全局的主键策略 -->
       <property name="idType" value="0"></property>
       
       <!-- 全局的表前缀策略配置 -->
       <property name="tablePrefix" value="tbl_"></property>
       
    </bean>

    @TableField

    当没有配置转驼峰的全局配置时,则需要使用该注解,映射实体类的属性和数据库的字段

    @TableField(value = "last_name")
    private String lastName;

    当实体中有某个属性,但是数据库中没有相应字段时,则需要设置

    @TableField(exist = false)

    插入数据获取主键值

    mabatis会自动将主键 值,插入到实体类中

    insertAllColumn方法

    //insert 方法在插入时,会根据实体类的每个属性进行非空判断,只有非空属性对应的字段才会出现到sql语句中
    employeeMapper.insert(employee);
    
    //insertAllColumn方法在插入时,无论属性是否为空,属性所对应的字段都会出现到sql语句中
    employeeMapper.insertAllColumn(employee);

    3.3 更新操作

    @Test
    public void testUpdate(){
        Employee employee  = new Employee();
        employee.setId(9);
        employee.setLastName("houchen");
        employee.setEmail("houchen@qq.com");
        employee.setGender(2);
        //返回结果是 对当前数据库影响的行数
        // 
        Integer result = employeeMapper.updateById(employee);
        System.out.println(result);
    }

    3.4 查询操作

    //通过id查询
    Employee employee = employeeMapper.selectById(9);
    System.out.println(employee);
    
    //通过多个列进行查询
    Employee emp  = new Employee();
    emp.setLastName("houchen");
    emp.setEmail("houchen@qq.com");
    Employee employee1 = employeeMapper.selectOne(emp);
    System.out.println(employee1);
    
    // 通过多个id进行查询
    List<Employee> employees = employeeMapper.selectBatchIds(Arrays.asList(1, 2, 3));
    for(Employee e:employees){
        System.out.println(e);
    }
    
    //selectByMap
    HashMap<String, Object> columnMap = new HashMap<>();
    //key 是表中的列名
    columnMap.put("last_name", "houchen");
    List<Employee> employees = employeeMapper.selectByMap(columnMap);
    for(Employee e:employees){
        System.out.println(e);
    }
    
    //分页查询 selectPage
    List<Employee> employees = employeeMapper.selectPage(new Page<>(2, 2), null);
    for(Employee e:employees){
        System.out.println(e);
    }

    3.5 删除操作

    @Test
    public void testDelete(){
        //根据ID删除数据
        //employeeMapper.deleteById(9);
    
        //根据条件删除数据
        HashMap<String, Object> columnMap = new HashMap<>();
        //key 是表中的列名
        columnMap.put("last_name", "MP");
        employeeMapper.deleteByMap(columnMap);
    
        // 批量删除deleteBatchIds
        employeeMapper.deleteBatchIds(Arrays.asList(1,2));
    }

    3.6 MP启动注入sql原理分析
    SqlSessionFacotry 中 → Configuration→ MappedStatements 每一个 mappedStatement 都表示 Mapper 接口中的一个方法与 Mapper 映射文件 中的一个 SQL。

    MP 在启动就会挨个分析 xxxMapper 中的方法,并且将对应的 SQL 语句处理好,保 存到 configuration 对象中的 mappedStatements 中

    3.7 通用crud总结
    以上是基本的 CRUD 操作,如您所见,我们仅仅需要继承一个 BaseMapper 即可实现 大部分单表 CRUD 操作。BaseMapper 提供了多达 17 个方法给大家使用, 可以极其方 便的实现单一、批量、分页等操作。极大的减少开发负担

  • 相关阅读:
    Ubuntu中pip的疑难杂症
    Python 分类方法记录
    Python 绘制热图
    脚本学习
    Ubuntu 基础使用教程
    机器学习各种相似性度量及Python实现
    Ubuntu 16.04安装R及Rstudio
    机器学习和数据挖掘领域大牛
    vux+vue-cli3.0坑
    函数的抖动以及节流
  • 原文地址:https://www.cnblogs.com/houchen/p/13506065.html
Copyright © 2011-2022 走看看