栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

MyBatisPlus

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

MyBatisPlus

文章目录
    • 01#MyBatisPlus简介
    • 02#环境搭建
      • 01-创建测试表
      • 02-创建 javaBean
      • 03-maven依赖
      • 04-加入 MyBatis 的全局配置文件
      • 05-加入 log4j.xml
      • 06-加入 db.properties 连接信息配置
      • 07-加入 spring 的配置文件 applicationContext.xml
      • 08-集成 MP
    • 03#通用Mapper
      • 01-使用
      • 02-插入操作
      • 03-更新操作
      • 04-查询操作
      • 05-删除操作
    • 04#条件构造器 EntityWrapper&Condition
      • 01-简介
      • 02-EntityWrapper带条件的查询
      • 03-EntityWrapper带条件的修改
      • 04-EntityWrapper带条件的删除
      • 05-Condition使用
    • 05#ActiveRecord(活动记录)
      • 01-简介
      • 02-如何使用 **AR** 模式
      • 03-插入操作
      • 04-修改操作
      • 05-查询操作
      • 06-删除操作
      • 07-分页复杂操作
    • 06#代码生成器
      • 01-MP和Mybatis代码生成器
      • 02-建议
      • 03-Maven
    • 07#插件
      • 01-简介
      • 02-插件使用
      • 03-分页插件
      • 04-执行分析插件
      • 05-性能分析插件
      • 06-乐观锁插件
    • 08#自定义全局操作
      • 01-自定义全局操作
      • 02-系统逻辑删除
    • 09#公共字段自动填充
      • 01-元数据处理器接口
      • 02-开发步骤
    • 10#Oracle主键 Sequence
      • 01-使用
      • 02-抽取公共entity

01#MyBatisPlus简介
MyBatis-Plus(简称 MP),是一个 MyBatis 的增强工具包,只做增强不做改变. 为简化开发工作、提高生产率而生
官方地址:
http://mp.baomidou.com
代码发布地址:
Github: https://github.com/baomidou/mybatis-plus
Gitee: https://gitee.com/baomidou/mybatis-plus
文档发布地址:
http://mp.baomidou.com/#/?id=%E7%AE%80%E4%BB%8B
02#环境搭建 01-创建测试表
-- 创建库
CREATE DATAbase mp;
-- 使用库
USE mp;
-- 创建表
CREATE TABLE tbl_employee(
 id INT(11) PRIMARY KEY AUTO_INCREMENT,
 last_name VARCHAR(50),
 email VARCHAR(50),
 gender CHAR(1),
 age int
);
INSERT INTO tbl_employee(last_name,email,gender,age) VALUES('Tom','tom@atguigu.com',1,22);
INSERT INTO tbl_employee(last_name,email,gender,age) VALUES('Jerry','jerry@atguigu.com',0,25);
INSERT INTO tbl_employee(last_name,email,gender,age) VALUES('Black','black@atguigu.com',1,30);
INSERT INTO tbl_employee(last_name,email,gender,age) VALUES('White','white@atguigu.com',0,35);
02-创建 javaBean
public class Employee {
    private Integer id ; 
    private String lastName; 
    private String email ;
    private Integer gender ;
    private Integer age ;
}
03-maven依赖

     com.baomidou
     mybatis-plus
     2.3



    junit
    junit
    4.9



    log4j
    log4j
    1.2.17



    com.mchange
    c3p0
    0.9.5.2



    mysql
    mysql-connector-java
    5.1.37



    org.springframework
    spring-context
    4.3.10.RELEASE


    org.springframework
    spring-orm
    4.3.10.RELEASE

04-加入 MyBatis 的全局配置文件





05-加入 log4j.xml



    
         
         
             
         
    
    
     	
    
    
     	
    
    
         
         
    

06-加入 db.properties 连接信息配置
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mp
jdbc.username=root
jdbc.password=1234
07-加入 spring 的配置文件 applicationContext.xml


    
    
    
        
        
        
        
    
    
    
    	
    
    
    
    
    
        
        
        
        
        
    
    
    
        
    

08-集成 MP


        
        
        
        
        
    
03#通用Mapper 01-使用

public interface EmployeeMapper extends baseMapper {
}
//配置单个MP
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;


@TableName(value = "tbl_employee")
public class Employee {
	
	@TableId(value = "id", type = IdType.AUTO)
	private Integer id; 

	@TableField(value = "last_name")
	private String lastName;
	private String email;
	private Integer gender;
	private Integer age;

	@TableField(exist = false)
	private Double salary;
}

        
        
        
        
        
        
        




        
        
        
        
        
        

02-插入操作
1) Integer insert(T entity);//只有非空的属性对应的字段才会出现到SQL语句中
2) 支持主键自增的数据库插入数据获取主键值
    Mybatis: 需要通过 useGeneratedKeys 以及 keyProperty 来设置
    MP: 自动将主键值回写到实体类中
3) Integer insertAllColumn(T entity)//属性所对应的字段都会出现到SQL语句中
03-更新操作
1) Integer updateById(@Param("et") T entity);//只有非空的属性对应的字段才会出现到SQL语句中
2) Integer updateAllColumnById(@Param("et") T entity)//属性所对应的字段都会出现到SQL语句中
04-查询操作
1) T selectById(Serializable id);
2) T selectOne(@Param("ew") T entity);
3) List selectBatchIds(List idList);
4) List selectByMap(@Param("cm") Map columnMap);//数据库字段
5) List selectPage(RowBounds rowBounds, @Param("ew") Wrapper wrapper);//分页查询
例如:
List emps = employeeMapper.selectPage(new Page<>(3, 2), null);
05-删除操作
1) Integer deleteById(Serializable id);
2) Integer deleteByMap(@Param("cm") Map columnMap);//数据库字段
3) Integer deleteBatchIds(List idList);
04#条件构造器 EntityWrapper&Condition 01-简介
1、 EntityWrapper和Condition是MybatisPlus 封装的一个查询条件构造器,来让用户自由的构建查询条件,简单便捷,没有额外的负担, 能够有效提高开发效率。
2、实体包装器,主要用于处理 sql 拼接,排序,实体参数查询等。
3、注意: 使用的是数据库字段,不是 Java 属性。

条件参数说明:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QcjiWudH-1632920737697)(MyBatisPlus.assets/20190501161734238.png)]
02-EntityWrapper带条件的查询
List selectPage(RowBounds rowBounds, @Param("ew") Wrapper wrapper);//分页查询
List selectList(@Param("ew") Wrapper wrapper);
// 我们需要分页查询tbl_employee表中,年龄在18~50之间且性别为男且姓名为Tom的所有用户
List emps =employeeMapper.selectPage(new Page(1, 2),
    new EntityWrapper()
    .between("age", 18, 50)
    .eq("gender", 1)
    .eq("last_name", "Tom")
);
System.out.println(emps);
// 查询tbl_employee表中, 性别为女并且名字中带有"老师" 或者 邮箱中带有"a"
List emps = employeeMapper.selectList(
    new EntityWrapper()
    .eq("gender", 0)
    .like("last_name", "老师")
    //.or()    // SQL: (gender = ? AND last_name LIKE ? OR email LIKE ?)    
    .orNew()   // SQL: (gender = ? AND last_name LIKE ?) OR (email LIKE ?) 
    .like("email", "a")
);
System.out.println(emps);
// 查询性别为女的, 根据age进行排序(asc/desc), 简单分页
List emps  = employeeMapper.selectList(new EntityWrapper()
    .eq("gender", 0)
    .orderBy("age")
    //.orderDesc(Arrays.asList(new String [] {"age"}))
    .last("desc limit 1,3")
);
03-EntityWrapper带条件的修改
Integer update(@Param("et") T entity, @Param("ew") Wrapper wrapper);
Employee employee = new Employee();
employee.setLastName("苍老师");
employee.setEmail("cls@sina.com");
employee.setGender(0);
employeeMapper.update(employee, new EntityWrapper().eq("last_name", "Tom").eq("age", 44));
04-EntityWrapper带条件的删除
Integer delete(@Param("ew") Wrapper wrapper);
employeeMapper.delete(new EntityWrapper().eq("last_name", "Tom").eq("age", 22));
05-Condition使用
EntityWrapper和Condition用法一致
List emps = employeeMapper.selectPage(new Page(1, 2),
    Condition.create()
    .between("age", 18, 50)
    .eq("gender", "1")
    .eq("last_name", "Tom")
);
05#ActiveRecord(活动记录) 01-简介
Active Record(活动记录),是一种领域模型模式,特点是一个模型类对应关系型数据库中的一个表,而模型类的一个实例对应表中的一行记录。
ActiveRecord 一直广受动态语言( PHP 、 Ruby 等)的喜爱,而 Java 作为准静态语言,对于 ActiveRecord 往往只能感叹其优雅,所以 MP 也在 AR 道路上进行了一定的探索
02-如何使用 AR 模式
//仅仅需要让实体类继承 Model 类且实现主键指定方法,即可开启 AR 之旅.
@TableName("tbl_employee")
public class Employee extends Model {
    .......
    
    @Override
    protected Serializable pkVal() {
        return id;
    }
}
03-插入操作
public boolean insert()
Employee employee = new Employee();
employee.setLastName("宋老师");
employee.setEmail("sls@atguigu.com");
employee.setGender(1);
employee.setAge(35);

boolean result = employee.insert();
System.out.println("result:" + result);
04-修改操作
public boolean updateById()
Employee employee = new Employee();
employee.setId(20);
employee.setLastName("宋老湿");
employee.setEmail("sls@atguigu.com");
employee.setGender(1);
employee.setAge(36);

boolean result = employee.updateById();
System.out.println("result:" + result);
05-查询操作
public T selectById()
public T selectById(Serializable id)
public List selectAll()
public List selectList(Wrapper wrapper)
public int selectCount(Wrapper wrapper)
Employee employee = new Employee();
Employee result = employee.selectById(14);
Employee employee = new Employee();
employee.setId(14);
Employee result = employee.selectById();
Employee employee = new Employee();
List emps = employee.selectAll();
Employee employee = new Employee();
List emps= employee.selectList(
    new EntityWrapper().like("last_name", "老师"));
Employee employee = new Employee();
Integer result = employee.selectCount(new EntityWrapper().eq("gender", 0));
06-删除操作
//注意: 删除不存在的数据 逻辑上也是属于成功的.
public boolean deleteById()
public boolean deleteById(Serializable id)
public boolean delete(Wrapper wrapper)
Employee employee = new Employee();
boolean result = employee.deleteById(2);
Employee employee = new Employee();
employee.setId(2);
boolean result = employee.deleteById();
Employee employee = new Employee();
boolean result = employee.delete(new EntityWrapper().like("last_name", "小"));
07-分页复杂操作
public Page selectPage(Page page, Wrapper wrapper)
Employee employee = new Employee();
Page page = employee.selectPage(new Page<>(1, 1),
                new EntityWrapper().like("last_name", "老"));
List emps = page.getRecords();
06#代码生成器 01-MP和Mybatis代码生成器
MP 的代码生成器 和 Mybatis MBG 代码生成器比较:
1、MP 的代码生成器都是基于 java 代码来生成。MBG 基于 xml 文件进行代码生成
2、MyBatis 的代码生成器可生成: 实体类、Mapper 接口、Mapper 映射文件
   MP 的代码生成器可生成: 实体类(可以选择是否支持 AR)、Mapper接口、Mapper映射、Service层、Controller层
02-建议
建议数据库表名和表字段名采用驼峰命名方式 
如果采用下划线命名方式 请开启全局下划线开关
如果表名字段名命名方式不一致请注解指定
03-Maven

    org.apache.velocity
    velocity-engine-core
    2.0




    org.slf4j
    slf4j-api
    1.7.7


    org.slf4j
    slf4j-log4j12
    1.7.7

04-示例代码

package com.atguigu.mp.test;

import com.baomidou.mybatisplus.enums.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.DbType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import org.junit.Test;

public class MPGenerator {
    
    @Test
    public void testGenerator() {
        //1. 全局配置
        GlobalConfig config = new GlobalConfig();
        config.setActiveRecord(true) // 是否支持AR模式
                .setAuthor("weiyunhui") // 作者
                .setOutputDir("D:\workspace_mp\mp03\src\main\java") // 生成路径
                .setFileOverride(true)  // 多次生成文件覆盖
                .setIdType(IdType.AUTO) // 主键策略--自增
                // 设置生成的service接口的名字的首字母是否为I
                // IEmployeeService
                .setServiceName("%sService") 
                .setbaseResultMap(true)//基本的ResultMap
                .setbaseColumnList(true);//基本的Column

        //2. 数据源配置
        DataSourceConfig dsConfig = new DataSourceConfig();
        dsConfig.setDbType(DbType.MYSQL)  // 设置数据库类型
                .setDriverName("com.mysql.jdbc.Driver")
                .setUrl("jdbc:mysql://localhost:3306/mp")
                .setUsername("root")
                .setPassword("1234");

        //3. 策略配置
        StrategyConfig stConfig = new StrategyConfig();
        stConfig.setCapitalMode(true) //全局大写命名
                .setDbColumnUnderline(true)  // 指定表名 字段名是否使用下划线
                .setNaming(NamingStrategy.underline_to_camel) // 数据库表映射到实体的命名策略
                // 表名前缀
                .setTablePrefix("tbl_")
                // 表名// 表名// 表名// 表名// 表名// 表名// 表名
                .setInclude("tbl_employee");

        //4. 包名策略配置
        // 代码生成的包
        PackageConfig pkConfig = new PackageConfig();
        pkConfig.setParent("com.atguigu.mp")
                .setMapper("mapper")
                .setService("service")
                .setController("controller")
                .setEntity("beans")
                .setXml("mapper");

        //5. 整合配置
        AutoGenerator ag = new AutoGenerator();
        ag.setGlobalConfig(config)
                .setDataSource(dsConfig)
                .setStrategy(stConfig)
                .setPackageInfo(pkConfig);

        //6. 执行
        ag.execute();
    }

}
07#插件 01-简介
1) 插件机制: Mybatis 通过插件(Interceptor) 可以做到拦截四大对象相关方法的执行,根据需求,完成相关数据的动态改变。
    Executor
    StatementHandler
    ParameterHandler
    ResultSetHandler
2) 插件原理
四大对象的每个对象在创建时,都会执行 interceptorChain.pluginAll(),会经过每个插件对象的 plugin()方法,目的是为当前的四大对象创建代理。代理对象就可以拦截到四大对象相关方法的执行,因为要执行四大对象的方法需要经过代理.
02-插件使用



    
        
        ......
    


		......
        
        
            
                
                
            
        

03-分页插件

Page page = new Page<>(1, 1);
List emps = employeeMapper.selectPage(page, null);
System.out.println(emps);
System.out.println("===============获取分页相关的一些信息======================");
System.out.println("总条数:" + page.getTotal());
System.out.println("当前页码: " + page.getCurrent());
System.out.println("总页码:" + page.getPages());
System.out.println("每页显示的条数:" + page.getSize());
System.out.println("是否有上一页: " + page.hasPrevious());
System.out.println("是否有下一页: " + page.hasNext());

//将查询的结果封装到page对象中
page.setRecords(emps);
04-执行分析插件
1) SQL 执行分析拦截器,只支持 MySQL5.6.3 以上版本
2) 该插件的作用是防止小白或者恶意进行 DELETE UPDATE 全表操作
3) 只建议在开发环境中使用,不建议在生产环境使用
4) 在插件的底层通过SQL语句分析命令:Explain 分析当前的SQL语句,根据结果集中的Extra列来断定当前是否全表操作。

     

@Test
public void testSQLExplain() {
	employeeMapper.delete(null);  // 全表删除
}
05-性能分析插件
1) 性能分析拦截器,用于输出每条 SQL 语句及其执行时间
2) SQL性能执行分析,开发环境使用,超过指定时间,停止运行。有助于发现问题

    
    

@Test
public void testPerformance() {
    Employee employee = new Employee();
    employee.setLastName("玛利亚老师");
    employee.setEmail("mly@sina.com");
    employee.setGender("0");
    employee.setAge(22);
    employeeMapper.insert(employee);
}
06-乐观锁插件
1) 如果想实现如下需求: 当要更新一条记录的时候,希望这条记录没有被别人更新
2) 乐观锁的实现原理:
        取出记录时,获取当前 version 2 
        更新时,带上这个 version 2 
        执行更新时, set version = yourVersion+1 where version = yourVersion
        如果 version 不对,就更新失败
3) @Version 用于注解实体字段,必须要有。


@Version
private Integer version;
@Test
public void testOptimisticLocker() {
    Employee employee = new Employee();
    employee.setId(15);
    employee.setVersion(3);
    employeeMapper.updateById(employee);
}
08#自定义全局操作 01-自定义全局操作
不想在 xml 中进行配置的 SQL 语句,想跟通用Mapper一样直接注入使用

1) 在 Mapper 接口中定义相关的 CRUD 方法
2) 扩展 AutoSqlInjector inject 方法,实现 Mapper 接口中方法要注入的 SQL
3) 在 MP 全局策略中,配置 自定义注入器
public interface EmployeeMapper extends baseMapper {
	// 1、Mapper中定义方法
	int  deleteAll();
}
public class MySqlInjector extends AutoSqlInjector {

    
    @Override
    public void inject(Configuration configuration, MapperBuilderAssistant builderAssistant, Class mapperClass,Class modelClass, TableInfo table) {
    //将EmployeeMapper中定义的deleteAll,处理成对应的MappedStatement对象,加入到configuration对象中。
		
        //注入的SQL语句
        String sql = "delete from " + table.getTableName();
        //注入的方法名   一定要与EmployeeMapper接口中的方法名一致
        String method = "deleteAll";

        //构造SqlSource对象
        SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);

        //构造一个删除的MappedStatement
        this.addDeleteMappedStatement(mapperClass, method, sqlSource);

    }
}


		
		



@Test
public void  testMySqlInjector() {
    Integer result = employeeMapper.deleteAll();
    System.out.println("result: " +result );
}
02-系统逻辑删除
@TableLogic   // 逻辑删除属性
private Integer logicFlag ;



	 	
	 	
	 	
	 	
	 	
	


Integer result = userMapper.deleteById(1);
System.out.println("result:" +result );

User user = userMapper.selectById(1);//null
09#公共字段自动填充 01-元数据处理器接口
com.baomidou.mybatisplus.mapper.metaObjectHandler

insertFill(metaObject metaObject) 
updateFill(metaObject metaObject)

metaobject: 元对象. 是 Mybatis 提供的一个用于更加方便,更加优雅的访问对象的属性,给对象的属性设置值 的一个对象. 还会用于包装对象. 支持对 Object 、Map、Collection等对象进行包装
本质上 metaObject 获取对象的属性值或者是给对象的属性设置值,最终是要通过 Reflector 获取到属性的对应方法的 Invoker, 最终 invoke.
02-开发步骤
1) 注解填充字段 @TableFile(fill = FieldFill.INSERT) 查看 FieldFill
2) 自定义公共字段填充处理器
3) MP 全局注入 自定义公共字段填充处理器
@TableField(fill=FieldFill.INSERT_UPDATE)
private String name ;
import org.apache.ibatis.reflection.metaObject;
import com.baomidou.mybatisplus.mapper.metaObjectHandler;

public class MymetaObjectHandler extends metaObjectHandler {
    
    @Override
    public void insertFill(metaObject metaObject) {
        //获取到需要被填充的字段的值
        Object fieldValue = getFieldValByName("name", metaObject);
        if (fieldValue == null) {
            System.out.println("*******插入操作 满足填充条件*********");
            setFieldValByName("name", "weiyunhui", metaObject);
        }
    }
    
    @Override
    public void updateFill(metaObject metaObject) {
        Object fieldValue = getFieldValByName("name", metaObject);
        if (fieldValue == null) {
            System.out.println("*******修改操作 满足填充条件*********");
            setFieldValByName("name", "weiyh", metaObject);
        }
    }
}


	 	
	 	


 
	
public void testmetaObjectHandler() {
    User user = new User();
    //user.setName("Tom");
    user.setId(5);
    user.setLogicFlag(1);
    userMapper.updateById(user);
}
10#Oracle主键 Sequence 01-使用
MySQL: 支持主键自增。 IdType.Auto

Oracle: 序列(Sequence)
1) 实体类配置主键 Sequence @KeySequence(value=”序列名”,clazz=xxx.class 主键属性类型)
2) 全局 MP 主键生成策略为 IdType.INPUT 
3) 全局 MP 中配置 Oracle 主键 Sequence
	com.baomidou.mybatisplus.incrementer.OracleKeyGenerator
4) 可以将@keySequence 定义在父类中,可实现多个子类对应的多个表公用一个 Sequence

    com.oracle
    ojdbc14
    10.2.0.4.0

orcl.driver=oracle.jdbc.OracleDriver
orcl.url=jdbc:oracle:thin:@localhost:1521:xe
orcl.username=system
orcl.password=1234




    
    
    
    

@KeySequence(value="seq_user",clazz=Integer.class)
public class User {
    //@TableId(type=IdType.INPUT)//某个类指定主键自增类型
	private Integer id  ;
}


		
		
		
		
	



	 	
	 	
	


public void testOracle() {
    User user = new User();
    user.setLogicFlag(1);
    user.setName("OracleSEQ");
    userMapper.insert(user);
}
02-抽取公共entity
@KeySequence(value="seq_user",clazz=Integer.class)
public abstract class Parent {
}
//@KeySequence(value="seq_user",clazz=Integer.class)
public class User extends Parent {
	//@TableId(type=IdType.INPUT)
	private Integer id  ;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/276144.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号