Mybatis Plus使用心得
2018-12-18 本文已影响0人
yyq唯心不易
代码生成器的使用
1.引入Maven
生成器可以采用velocity模板或freemarker模板,下面采用的是freemark模板
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.6</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.6</version>
</dependency>
<!-- freemarker 模板引擎 -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.28</version>
</dependency>
2.编写模板
在mybatis-plus-generator-3.0.6.jar包下可以找到默认的模板配置。如果想采用修改生成的代码,只需将相应的模板拷贝到自己工程下的templates目录即可。
默认模板位置
3.数据库的连接配置
按基本的jdbc连就行了,不过我在连接时踩了个坑,记录一下。
在连接时没有设置时区导致一直在报错,所以设置URL时最好带上
jdbc:mysql://localhost:3306/" + DB_NAME + "?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=UTC
4.生成代码
//包名
public static final String PACKAGE_NAME = "com.yyq.demo";
//模块名
public static final String MODULE_NAME = "code";
//数据库名
public static final String DB_NAME = "test";
//数据库表
public static final String TABLE_NAME = "t_user";
//获取当前项目的路径
public static final String PROJECT_PATH = System.getProperty("user.dir");
//代码存储路径
public static final String CODE_SAVE_PATH = PROJECT_PATH + "/src/main/java/" + StringUtils.join((PACKAGE_NAME + "." + MODULE_NAME).split("\\."), "/");
public static void main(String[] args) {
// 代码生成器
AutoGenerator mpg = new AutoGenerator();
// 全局配置
GlobalConfig gc = new GlobalConfig();
gc.setOutputDir(PROJECT_PATH + "/src/main/java");
gc.setAuthor("Richard");
gc.setOpen(false);
gc.setFileOverride(true);
gc.setServiceName("%sService");
gc.setBaseColumnList(true);
gc.setBaseResultMap(true);
gc.setDateType(DateType.ONLY_DATE);
mpg.setGlobalConfig(gc);
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/" + DB_NAME + "?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=UTC");
// dsc.setSchemaName("public");
dsc.setDriverName("com.mysql.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("123456");
mpg.setDataSource(dsc);
// 包配置
PackageConfig pc = new PackageConfig();
pc.setModuleName(MODULE_NAME);
pc.setParent(PACKAGE_NAME);
mpg.setPackageInfo(pc);
// 自定义配置
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) {
// 自定义输入文件名称
return PROJECT_PATH + "/src/main/resources/mapper/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
}
});
focList.add(new FileOutConfig("/templates/service.java.ftl") {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定义输入文件名称
return CODE_SAVE_PATH + "/service/" + tableInfo.getEntityName() + "Service" + StringPool.DOT_JAVA;
}
});
cfg.setFileOutConfigList(focList);
mpg.setCfg(cfg);
mpg.setTemplate(new TemplateConfig().setXml(null));
// 策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setTablePrefix(new String[]{"t_"});
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setSuperEntityClass("com.yyq.demo.bean.BaseEntity");
strategy.setEntityLombokModel(true);
strategy.setRestControllerStyle(true);
strategy.setSuperControllerClass("com.yyq.demo.controller.BaseController");
strategy.setInclude(TABLE_NAME);
//自定义基础的Entity类,公共字段 ,填入将在entity中不出现
strategy.setSuperEntityColumns("id","version");
strategy.setControllerMappingHyphenStyle(true);
mpg.setStrategy(strategy);
mpg.setTemplateEngine(new FreemarkerTemplateEngine());
mpg.execute();
//删除自己不需要的目录
deleteDir(new File(CODE_SAVE_PATH+"/service/impl"));
}
private static void deleteDir(File dir) {
if (dir.isDirectory()) {
File[] files = dir.listFiles();
for (int i = 0; i < files.length; i++) {
deleteDir(files[i]);
}
}
dir.delete();
}
各种查询套路
1.使用eq()时
字段名要是数据库对应的字段名,如wrapper.eq("login_name","test");
不能直接用于和null比较要用wrapper.isNull("param_name");
2.where()
可以写任何的sql在里面,可以把其他关联表的结合起来做查询,如
wrapper.where("id in (select o_id from t_a where name like concat('%',{0},'%'))",keyword);