1、mybatis-plus简介
mybatis-plus在mybatis的基础上进行的扩展,只做增强不做改变,引入mybatis-plus不会对您现有的mybatis架构产生任何影响,
而且mp支持所有mabatis原生的特性。
本文将介绍关于mybatis-plus的特性和springboot整合mybatis-plus,同时使用mybatis-plus提供的MysqlGenerator.java,
你可以通过指定的数据库表生成对应的bean、mapper.xml、mapper.java、service.java、serviceImpl.java,甚至controller
2、使用idea创建springboot项目
我的项目结构:
pom.xml中添加依赖
<!-- 阿里巴巴druid数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.3</version>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.0</version>
</dependency>
<!-- mybatis plus 代码生成器依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.1.0</version>
</dependency>
<!-- 代码生成器模板 -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-extension</artifactId>
<version>3.1.2</version>
</dependency>
<!-- 模板引擎 -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.0</version>
</dependency>
<!-- 开启web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
添加了以上mybatis-plus的依赖后,无需再引入mybatis的依赖,但是可以同时使用mybatis的特性
添加properties.yml配置
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/hotel?serverTimezone=UTC
#使用druid连接池
type: com.alibaba.druid.pool.DruidDataSource
username: root
password: aaaaaa
main:
allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册
mybatis-plus:
mapper-locations: classpath*:/mapper/*.xml
#实体扫描,多个package用逗号或者分号分隔
typeAliasesPackage: com.example.demo.bean
global-config:
#主键类型 0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
id-type: 0
#字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
field-strategy: 2
#驼峰下划线转换
db-column-underline: true
#刷新mapper 调试神器
refresh-mapper: true
#数据库大写下划线转换
#capital-mode: true
#序列接口实现类配置
#key-generator: com.baomidou.springboot.xxx
#逻辑删除配置(下面3个配置)
logic-delete-value: 0
logic-not-delete-value: 1
#自定义SQL注入器
#sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector
#自定义填充策略接口实现
#meta-object-handler: com.baomidou.springboot.xxx
configuration:
map-underscore-to-camel-case: true
cache-enabled: false
添加MyBatisPlusConfig.java
import com.baomidou.mybatisplus.core.injector.ISqlInjector;
import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
@Configuration
public class MyBatisPlusConfig {
private final static Logger logger = LoggerFactory.getLogger(MyBatisPlusConfig.class);
/**
* @description: 配置分页插件
*
* @author: gradual
* @date: 2019/1/15 10:17
* @param: []
* @return: com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
logger.debug("注册分页插件");
return new PaginationInterceptor();
}
/**
* @description: SQL执行效率插件
*
* @author: gradual
* @date: 19-1-24 下午4:59
* @param: []
* @return: com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor
*/
@Bean
@Profile({"test"})// 设置 dev test 环境开启
public PerformanceInterceptor performanceInterceptor() {
return new PerformanceInterceptor();
}
/**
* 逻辑删除用,3.1.1之后的版本可不需要配置该bean,但项目这里用的是3.1.0的
*
* @author David Hong
*
* @return com.baomidou.mybatisplus.core.injector.ISqlInjector
*/
@Bean
public ISqlInjector sqlInjector() {
return new LogicSqlInjector();
}
}
配置代码生成器MysqlGenerator
import com.baomidou.mybatisplus.core.toolkit.StringPool;
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.TableFill;
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;
public class MysqlGenerator {
/**
* RUN THIS
*/
public static void main(String[] args) {
// 代码生成器
AutoGenerator mpg = new AutoGenerator();
// TODO 全局配置 用来设置生成文件的命名
GlobalConfig gc = new GlobalConfig();
gc.setOutputDir("C:/Users/Administrator/IdeaProjects/MybatisPlus/src/main/java");
// 设置用户名
gc.setAuthor("yuan");
gc.setOpen(true);
// service 命名方式
gc.setServiceName("%sService");
// service impl 命名方式
gc.setServiceImplName("%sServiceImpl");
// 自定义文件命名,注意 %s 会自动填充表实体属性!
gc.setMapperName("%sMapper");
gc.setXmlName("%sMapper");
gc.setFileOverride(true);
gc.setActiveRecord(true);
// XML 二级缓存
gc.setEnableCache(false);
// XML ResultMap
gc.setBaseResultMap(true);
// XML columList
gc.setBaseColumnList(false);
mpg.setGlobalConfig(gc);
// TODO 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/hotel?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=UTC");
dsc.setDriverName("com.mysql.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("aaaaaa");
mpg.setDataSource(dsc);
// TODO 包配置 文件生成后对应的包
PackageConfig pc = new PackageConfig();
//pc.setModuleName(scanner("模块名"));
pc.setParent("com.example.demo");
pc.setEntity("bean");
pc.setService("service");
pc.setServiceImpl("service.impl");
mpg.setPackageInfo(pc);
// TODO 自定义需要填充的字段
List<TableFill> tableFillList = new ArrayList<>();
//如 每张表都有一个创建时间、修改时间
//而且这基本上就是通用的了,新增时,创建时间和修改时间同时修改
//修改时,修改时间会修改,
//虽然像Mysql数据库有自动更新几只,但像ORACLE的数据库就没有了,
//使用公共字段填充功能,就可以实现,自动按场景更新了。
//如下是配置
//TableFill createField = new TableFill("gmt_create", FieldFill.INSERT);
//TableFill modifiedField = new TableFill("gmt_modified", FieldFill.INSERT_UPDATE);
//tableFillList.add(createField);
//tableFillList.add(modifiedField);
// TODO 自定义配置
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
// to do nothing
}
};
List<FileOutConfig> focList = new ArrayList<>();
focList.add(new FileOutConfig("/templates/mapper.xml.ftl") {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定义输入文件名称和生成的mapper.xml文件所在的包
return "C:/Users/Administrator/IdeaProjects/MybatisPlus/src/main/resources/mapper/"
+ "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
}
});
cfg.setFileOutConfigList(focList);
mpg.setCfg(cfg);
mpg.setTemplate(new TemplateConfig().setXml(null));
// TODO 策略配置 StrategyConfig数据表
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
// strategy.setSuperEntityClass("com.fame.common.BaseEntity");
strategy.setEntityLombokModel(true);
strategy.setRestControllerStyle(true);
// strategy.setSuperControllerClass("com.fame.common.BaseController");
// 需要生成哪些表的文件 在这里用,分开,这里生成的是style和room两个表
strategy.setInclude(new String("style,room").split(","));
// strategy.setSuperEntityColumns("id");
// strategy.setControllerMappingHyphenStyle(true);
strategy.setTablePrefix("sys");
mpg.setStrategy(strategy);
mpg.setTemplateEngine(new FreemarkerTemplateEngine());
mpg.execute();
}
}
启动类添加注解 扫描mapper类
@SpringBootApplication
@MapperScan("com.example.demo.mapper")
public class MybatisplusApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisplusApplication.class, args);
}
}
配置结束后运行MysqlGenerator类的main方法
生成实体类如下
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class Style extends Model<Style> {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
/**
* 风格
*/
private String style;
/**
* 优惠前的单价
*/
private Double money;
/**
* 房间设施描述
*/
private String facilities;
/**
* 封面图片
*/
private String image;
/**
* 类型描述
*/
private String message;
@Override
protected Serializable pkVal() {
return this.id;
}
}
生成mapper类
public interface StyleMapper extends BaseMapper<Style> {
}
生成service类
public interface StyleService extends IService<Style> {
}
生成impl类
@Service
public class StyleServiceImpl extends ServiceImpl<StyleMapper, Style> implements StyleService {
}
因为mybatis-plus本身封装了数据库CRUD操作,以及支持ActiveRecord形式调用,实体类只需继承Model类即可实现基本CRUD操作
所以几乎不需要我们去xml文件中过多配置
生成的xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.StyleMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.example.demo.bean.Style">
<id column="id" property="id" />
<result column="style" property="style" />
<result column="money" property="money" />
<result column="facilities" property="facilities" />
<result column="image" property="image" />
<result column="message" property="message" />
</resultMap>
</mapper>
contronller类
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.demo.bean.Style;
import com.example.demo.service.StyleService;
import org.hibernate.validator.constraints.URL;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* <p>
* 前端控制器
* </p>
*
* @author yuan
* @since 2020-03-11
*/
@RestController
@RequestMapping("/style")
public class StyleController {
@Autowired
StyleService styleService;
/*插入数据*/
@RequestMapping(value = "/add", method = RequestMethod.GET)
@Transactional//只能直接在方法上才生效
public String add() throws RuntimeException {
Style style = new Style();
style.setId(14);
style.setStyle("大房");
style.setMoney(129.0);
style.setFacilities("卫生间、健生房");
style.setMessage("可住两人");
// 插入
// styleService.save(style);
// style.insert();
// 更新
// styleService.saveOrUpdate(style);
// style.insertOrUpdate()
// 修改更新 可以只给style对象id设置值就可以修改
// style.setMessage("很大");
// styleService.updateById(style);
// 查找一个
// Style style1=styleService.getById(15);
// Style style1=styleService.getOne(new QueryWrapper<Style>().eq("message","可住两人").last("limit 1"));
// System.out.println(style1);
// 查询所有
// List<Style> lists=styleService.list();
// System.out.println(lists);
// 分页查询
// int pageNum = 1;
// int pageSize = 10;
// IPage<Style> mpUserIPage = styleService.page(new Page<>(pageNum, pageSize), new QueryWrapper<Style>().eq("facilities", "卫生间、健生房"));
// // IPage to List
// List<Style> mpUserList = mpUserIPage.getRecords();
// // 总页数
// long allPageNum = mpUserIPage.getPages();
// System.out.println("查询结果"+mpUserList);
// System.out.println("总页数"+allPageNum);
// 通过id删除
// style.deleteById();
styleService.removeById(14);
return "保存成功";
}
}
想了解mybatis和mybatisplus的区别 查阅https://blog.youkuaiyun.com/qq_34508530/article/details/88945034