mybatisPlus 学习笔记

1.特性

  • 无入侵(对原有功能没有影响)
  • 依赖少(引入mybatis依赖即可)

2 集成MP(mybatisPlus)

1.导入依赖文件(springboot)


        com.baomidou
        mybatis-plus-boot-starter
        3.1.1

3 CURD

  • 编写xxxMapper接口集成BaseMapper 接口, BaseMapper 范型指定当前实体类的类型。

baseMapper 接口提供方法:

插入操作
  • insert(Entity entity) 需要配置主键策略
    @TableName(value=“表名”),不配置的话,mp会默认使用实体类的类名做为表名
    @TableId(value=“id”,type=“IdType.枚举”),列名和字段名一致则value 可以不写)
    @TableField(exist=“true”) 是否为数据表字段默认是true
  • mybatisPlus 添加成功会自动将主键值写到实体类中
  • inserAllColumn 插入所有列(正常情况下insert 插入时会根据实体类的每个属性进行非空判断,只有非空的属性对应的字段才会出现到sql 语句中insertAllCloumn则会全部出现在sql 语句中)
全局策略配置
  • dbCloumnUnderline:true 驼峰格式(2.3以后版本自动开启)
  • tablePrefix:“xxxx” 全局的表前缀策略
  • idType :0,1,2… 全局主键策略对应IdType 的枚举类型
更新操作
  • updateById 类似于insert 操作不会更新null 的属性字段啊
  • updateAllColumnById 不区别属性字段是否为NULL,全部更新
查询操作
  • selectById 根据ID 查询数据
  • selectOne(Entity entity) 根据非空的字段作为条件来查询数据(条件要保证唯一性不然查到多条会报错)
  • selectBatchIds(idsList) 根据集合中ID 查询所有数据
  • selectByMap(columnMap)map中的Key 必须要跟列名一致 value 为条件值
  • selectPage(rowBounds,条件构造器) 分页查询(内存分页,效果不是很好需要进行优化处理或者继承第三方插件)
删除操作
  • deleteById 根据id 删除数据
  • deleteByMap (columnMap)
  • deleteBatchIds(idsList) 根据id集合删除数据
MP启动注入SQL 原理分析
  • xxxMapper 的本质是org.apche.ibatis.binding.MapperProxy

  • MapperProxy中 sqlSession → sqlSessionFactory → configuration → MappedStatement → 根据方法ID 取得sql

  • sqlSessionFactory 中有个configuration 对象,configuration中有个
    每一个MappedStatement 都表示接口中的一个方法与Mapper 映射文件中的一个sql。Mp 再启动的就会分析每个xxxMapper 中的方法,并将对应的sql 语句处理好,保存到configuration 对象中的mappedStatements 中

  • sqlMethod :枚举对象 MP 支持的sql 方法

  • TableInfo: 数据库反射信息,可以获取数据表的相关信息

  • sqlSource :SQL语句处理对象

  • MapperBuilderAssistant :用于缓存、sql 参数、查询方法结果集处理等。通过mappedStatement 添加到configuration 中的mappedstatements 中

通用CURD小结

以上都是基本的CURD 操作,仅仅只需要继承BaseMapper 接口即可实现大部分表单的CURD操作。BaseMapper 提供了多大17种方法,可以极其简便的实现单一、批量、分页等操作。极大的减少开发负担。

条件构造器

  • EntitiyWrapper 实体包装器,主要用于sql 拼接,排序,实体参数查询等。使用的是数据库字段而不是Java 属性用户用来构件查询条件,能够有效的提高工作开发效率。
new EntityWrapper().eq("gender",0).like("last_name","李四").or().like("email","a") 
sql 拼接结果: (gender = ? and last_name like ? or email like ?)
new EntityWrapper().eq("gender",0).like("last_name","李四").orNew().like("email","a") 
sql 拼接结果: (gender = ? and last_name like ? )  or ( email like ?)

ActiveRecord(活动记录)

如何使用AR

实体类继承Model且实现主键的指定方法

@TableName(value="表明")
public class Employe extends Model{
	@Override
	protected Serializable pkValue(){
			return this.id;
	}
}

AR 实现CURD 操作

@Test
public void test(){
	Employe   emp = new Employe();
	emp.setXxx("属性值");
	// 增加操作
	emp.insert();
	//更新操作
	emp.update(emp);
	// 删除操作
	emp.deleteById("ID值");
	emp.delete(emp);
	// 查询操作
	emp.selectList(null);// 查询所有数据
	emp.selectById(“ID值”) ;// 根据ID 进行查询
	// 分页查询
	emp.selectPage(new Page<>(页数,条数),new EntityWrapper.like("列名",条件)) 

}
小结

AR 模式提供了一种更加便捷的方式实现CURD 操作,本质还是调用 Mybatis 对应的方法,类似于语法糖
语法糖:对现有功能没有影响,可以方便调用者开发使用,可以避免出错的机会,让程序可读性更好。

代码生成器

  • MP 提供了大量的自定义配置,生成的代码完全能够满足各类型的需求
  • MP 代码生成器是基于JAVA 代码生成的。MGB基于XML 文件生成
  • Mybatis 的代码生成器可以生成:实体类,mapper接口、mapper映射文件
  • MP 代码生成器可以生成:实体类(可选择是否支持AR)、Mapper 接口、Mapper 映射、service 、controller
添加依赖



    com.baomidou
    mybatis-plus-generator
    3.1.1




    org.apache.velocity
    velocity-engine-core
    2.1



    org.freemarker
    freemarker
    2.3.28



    com.ibeetl
    beetl
    3.0.5.RELEASE

生成器代码
// 演示例子,执行 main 方法控制台输入模块表名回车自动生成对应项目目录中
public class CodeGenerator {

    /**
     * 

* 读取控制台内容 *

*/ public static String scanner(String tip) { Scanner scanner = new Scanner(System.in); StringBuilder help = new StringBuilder(); help.append("请输入" + tip + ":"); System.out.println(help.toString()); if (scanner.hasNext()) { String ipt = scanner.next(); if (StringUtils.isNotEmpty(ipt)) { return ipt; } } throw new MybatisPlusException("请输入正确的" + tip + "!"); } public static void main(String[] args) { // 代码生成器 AutoGenerator mpg = new AutoGenerator(); // 全局配置 GlobalConfig gc = new GlobalConfig(); String projectPath = System.getProperty("user.dir"); gc.setOutputDir(projectPath + "/src/main/java"); gc.setAuthor("jobob"); gc.setOpen(false); // gc.setSwagger2(true); 实体属性 Swagger2 注解 mpg.setGlobalConfig(gc); // 数据源配置 DataSourceConfig dsc = new DataSourceConfig(); dsc.setUrl("jdbc:mysql://localhost:3306/ant?useUnicode=true&useSSL=false&characterEncoding=utf8"); // dsc.setSchemaName("public"); dsc.setDriverName("com.mysql.jdbc.Driver"); dsc.setUsername("root"); dsc.setPassword("密码"); mpg.setDataSource(dsc); // 包配置 PackageConfig pc = new PackageConfig(); pc.setModuleName(scanner("模块名")); pc.setParent("com.baomidou.ant"); mpg.setPackageInfo(pc); // 自定义配置 InjectionConfig cfg = new InjectionConfig() { @Override public void initMap() { // to do nothing } }; // 如果模板引擎是 freemarker String templatePath = "/templates/mapper.xml.ftl"; // 如果模板引擎是 velocity // String templatePath = "/templates/mapper.xml.vm"; // 自定义输出配置 List focList = new ArrayList<>(); // 自定义配置会被优先输出 focList.add(new FileOutConfig(templatePath) { @Override public String outputFile(TableInfo tableInfo) { // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!! return projectPath + "/src/main/resources/mapper/" + pc.getModuleName() + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML; } }); /* cfg.setFileCreate(new IFileCreate() { @Override public boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) { // 判断自定义文件夹是否需要创建 checkDir("调用默认方法创建的目录"); return false; } }); */ cfg.setFileOutConfigList(focList); mpg.setCfg(cfg); // 配置模板 TemplateConfig templateConfig = new TemplateConfig(); // 配置自定义输出模板 //指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别 // templateConfig.setEntity("templates/entity2.java"); // templateConfig.setService(); // templateConfig.setController(); templateConfig.setXml(null); mpg.setTemplate(templateConfig); // 策略配置 StrategyConfig strategy = new StrategyConfig(); strategy.setNaming(NamingStrategy.underline_to_camel); strategy.setColumnNaming(NamingStrategy.underline_to_camel); strategy.setSuperEntityClass("com.baomidou.ant.common.BaseEntity"); strategy.setEntityLombokModel(true); strategy.setRestControllerStyle(true); strategy.setSuperControllerClass("com.baomidou.ant.common.BaseController"); strategy.setInclude(scanner("表名,多个英文逗号分割").split(",")); strategy.setSuperEntityColumns("id"); strategy.setControllerMappingHyphenStyle(true); strategy.setTablePrefix(pc.getModuleName() + "_"); mpg.setStrategy(strategy); mpg.setTemplateEngine(new FreemarkerTemplateEngine()); mpg.execute(); } }

参考:MybatisPlus 官方文档

你可能感兴趣的:(java,学习路线,mybatis)