Spring Boot集成Mybatis Plus快速入门Demo

1.什么事Mybatis Plus?

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

特性

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑

  • 损耗小:启动即会自动注入基本 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 操作智能分析阻断,也可自定义拦截规则,预防误操作

支持数据库

任何能使用 MyBatis 进行 CRUD, 并且支持标准 SQL 的数据库,具体支持情况如下,如果不在下列表查看分页部分教程 PR 您的支持。
  • MySQL,Oracle,DB2,H2,HSQL,SQLite,PostgreSQL,SQLServer,Phoenix,Gauss ,ClickHouse,Sybase,OceanBase,Firebird,Cubrid,Goldilocks,csiidb,informix,TDengine,redshift

  • 达梦数据库,虚谷数据库,人大金仓数据库,南大通用(华库)数据库,南大通用数据库,神通数据库,瀚高数据库,优炫数据库,星瑞格数据库

2.mysql环境准备

第一个mysql数据库

docker run --name docker-mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql

初始化数据

create database demo;create table user_info(user_id     varchar(64)          not null primary key,username    varchar(100)         null ,age         int(3)               null ,gender      tinyint(1)           null ,remark      varchar(255)         null ,create_time datetime             null ,create_id   varchar(64)          null ,update_time datetime             null ,update_id   varchar(64)          null ,enabled     tinyint(1) default 1 null);

说明

msyql账号rootmysql密码123456

3.代码工程

实验目的:使用mybatis plus操作mysql数据库

pom.xml

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <parent>        <artifactId>springboot-demo</artifactId>        <groupId>com.et</groupId>        <version>1.0-SNAPSHOT</version>    </parent>    <modelVersion>4.0.0</modelVersion>
<artifactId>mybatis-plus</artifactId>
<properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> <dependencies>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- mybatis-plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.3.1</version> </dependency> <!-- mysql --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.3.1</version> </dependency>
<dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.31</version> </dependency>
</dependencies></project>

application.yaml

server:  port: 8088
spring: datasource: password: 123456 username: root url: jdbc:mysql://localhost:3306/demo?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true driver-class-name: com.mysql.cj.jdbc.Driver

generator

package com.et.mybaties.plus.util;
import com.baomidou.mybatisplus.annotation.IdType;import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;import com.baomidou.mybatisplus.core.toolkit.StringPool;import com.baomidou.mybatisplus.core.toolkit.StringUtils;import com.baomidou.mybatisplus.generator.AutoGenerator;import com.baomidou.mybatisplus.generator.InjectionConfig;import com.baomidou.mybatisplus.generator.config.*;import com.baomidou.mybatisplus.generator.config.po.TableInfo;import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import java.util.ArrayList;import java.util.List;import java.util.Scanner;

public class GeneratorCode { /** * database connect * */ private static final String dbUrl = "jdbc:mysql://localhost:3306/demo?useUnicode=true&useSSL=false&characterEncoding=utf8"; /** * username * */ private static final String username = "root"; /** * pasword * */ private static final String password = "123456"; /** * moduleName * */ private static final String moduleName = "/mybatis-plus";
/** * <p> * read console content * @param * </p> */ public static String scanner(String tip) { Scanner scanner = new Scanner(System.in); StringBuilder help = new StringBuilder(); help.append("please input:" + tip + ":"); System.out.println(help.toString()); if (scanner.hasNext()) { String ipt = scanner.next(); if (StringUtils.isNotBlank(ipt)) { return ipt; } } throw new MybatisPlusException("please right conntent:" + tip + "!"); }
public static void main(String[] args) { // Code Generateor AutoGenerator mpg = new AutoGenerator(); String module = scanner("please input module"); // GlobalCOnfig GlobalConfig gc = new GlobalConfig(); //D:\IdeaProjects\ETFramework String basedir ="D:/IdeaProjects/ETFramework/"; String projectPath = basedir+moduleName; System.out.println(projectPath); //OutputDir gc.setOutputDir(projectPath+"/src/main/java"); gc.setAuthor("stopping"); //some generate rule gc.setMapperName("%sMapper"); gc.setServiceName("%sService"); gc.setServiceImplName("%sServiceImp"); gc.setControllerName("%sController"); gc.setXmlName("%sMapper"); gc.setIdType(IdType.AUTO); gc.setOpen(false); //IsOverride gc.setFileOverride(true); //isSwagger2 gc.setSwagger2(false); mpg.setGlobalConfig(gc);
//datasource DataSourceConfig dsc = new DataSourceConfig(); dsc.setUrl(dbUrl); dsc.setDriverName("com.mysql.cj.jdbc.Driver"); dsc.setUsername(username); dsc.setPassword(password); mpg.setDataSource(dsc);
// PackageConfig PackageConfig pc = new PackageConfig(); //package path pc.setParent("com.et.mybaties.plus"); //subpackage path pc.setMapper("mapper."+module); pc.setController("controller."+module); pc.setService("service."+module); pc.setServiceImpl("service."+module+".imp"); pc.setEntity("model.entity"); pc.setXml("Mapper"); mpg.setPackageInfo(pc);
//custom config InjectionConfig cfg = new InjectionConfig() { @Override public void initMap() { // to do nothing } };
// freemarker String templatePath = "/templates/mapper.xml.ftl";
// FileOutConfig List<FileOutConfig> focList = new ArrayList<>(); focList.add(new FileOutConfig(templatePath) { @Override public String outputFile(TableInfo tableInfo) { // Mapper String xmlUrl = projectPath + "/src/main/resources/mapper/" + module + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML; System.out.println("xml path:"+xmlUrl); return xmlUrl; } }); cfg.setFileOutConfigList(focList); mpg.setCfg(cfg);
// templateConfig TemplateConfig templateConfig = new TemplateConfig(); templateConfig.setXml(null); mpg.setTemplate(templateConfig);
// StrategyConfig StrategyConfig strategy = new StrategyConfig(); strategy.setNaming(NamingStrategy.underline_to_camel); strategy.setColumnNaming(NamingStrategy.underline_to_camel); strategy.setEntityLombokModel(true); strategy.setRestControllerStyle(true); // common file //strategy.setSuperEntityColumns("id"); strategy.setInclude(scanner("tablename,multi can be seperated ,").split(",")); strategy.setControllerMappingHyphenStyle(true); strategy.setTablePrefix(pc.getModuleName() + "_"); //isAnnotationEnable strategy.setEntityTableFieldAnnotationEnable(true); mpg.setStrategy(strategy); mpg.setTemplateEngine(new FreemarkerTemplateEngine()); mpg.execute(); }}


运行main函数,生成相应的代码如下

DemoApplication.java

package com.et.mybaties.plus;
import org.mybatis.spring.annotation.MapperScan;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication@MapperScan("com.et.mybaties.plus.mapper")public class DemoApplication {
public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); }}

以上只是一些关键代码,所有代码请参见下面代码仓库

代码仓库

  • https://github.com/Harries/springboot-demo

4.测试

编写测试类,执行插入,更新,自定义查询测试

package com.et.mybaties.plus;
import com.et.mybaties.plus.model.entity.UserInfo;import com.et.mybaties.plus.service.userInfo.UserInfoService;import org.junit.After;import org.junit.Before;import org.junit.Test;import org.junit.runner.RunWith;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)@SpringBootTest(classes = DemoApplication.class)public class DemoTests { private Logger log = LoggerFactory.getLogger(getClass()); @Autowired UserInfoService userInfoService; @Before public void before() { log.info("init some data"); } @After public void after(){ log.info("clean some data"); } @Test public void query() { log.info("your method test Code"); userInfoService.lambdaQuery().list().forEach(System.out::println); } @Test public void testQueryWrapper() { log.info("your method test Code"); userInfoService.testQueryWrapper(3).forEach(System.out::println); }
@Test public void insert() { log.info("your method test Code");
for(int i =1;i<10;i++) { UserInfo ui = new UserInfo(); ui.setUserId(i+"id"); userInfoService.removeById(i+"id"); ui.setUsername("HBLOG"+i); ui.setAge(i); userInfoService.save(ui); } }
}


5.参考引用

  • http://www.liuhaihua.cn/archives/710453.html

  • https://baomidou.com/

相关推荐

  • 今日代码大赏 | 本地文件存储
  • 备战四个月,每天学14小时,成了
  • 70k!建议来试试这个前景被低估的新方向!
  • Spring Boot 应用 Docker 化的 8 个最佳实践
  • 4 个 yyds 的 Java 框架!
  • 美团招聘
  • 告别信息过载:大模型驱动的搜索与推荐,精准定位用户需求
  • 直播预告| 智能运维,如何让中小企业数据库管理更高效?
  • 从0到1,聊聊货拉拉如何搭建数据指标体系
  • Meta 如何将缓存一致性提高到 99.99999999
  • QCon全球软件开发大会(北京站)2024 优秀出品人与明星讲师名单揭晓
  • 独立站如何摆脱系统不稳定的“漏洞”?这家企业做到了!
  • 数据库的夏天!2024可信数据库发展大会如约而至,邀请你来!| Q推荐
  • 关于 Tab 与空格之争,暴躁老哥 Linus 又有新指示!
  • Mistral 不相信AGI,开源大模型CEO发出警告,科技带不来“新造的人”
  • 侯毅张勇收购盒马传闻不实;英伟达大跌10%;用于Llama3训练的高质量数据集首次公开!
  • 【每周一课#06】MidJourney 应用实战
  • 中科曙光董事长李国杰院士被证监会立案调查:涉嫌违法炒股
  • 奖金丰厚!KDD Cup 2024 检索增强生成CRAG挑战赛正式启动
  • CVPR 2024 | 知识蒸馏中的Logit标准化:辅助logit-based KD算法稳定涨点