简介
MyBatis-Plus技术带来的开发效率提高还是很可观的,所以花一些时间学习升级技术还是有必要的。这一篇进阶MyBatis,讲一下MP(MyBatis-Plus)的集成和MP代码生成器的使用。
这里的实战知识大多来自于中文官网:《MyBatis-Plus
为简化开发而生》,推荐前往深入学习。
环境
- idea
- jdk1.8
Mybatis-集成及使用
1. 引入pom依赖
1 | <!-- 只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑--> |
2. 定义映射xml文件的路径
application.yml中加入mapper的xml文件路径配置1
2
3# MyBatis Mapper所对应的XML文件位置
mybatis-plus:
mapper-locations: classpath:/com/xjy/world/mapper/*Mapper.xml
3. 数据源配置
数据源可以结合springboot数据源在application.yml中配置1
2
3
4
5
6spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://ip:3306/test?serverTimezone=UTC
username: root
password: root
4. 定义一个goods表
1 | DROP TABLE IF EXISTS `goods`; |
5. 定义一个实体Goods类
1 |
|
6. 定义一个GoodsMapper接口
注意这里继承了BaseMapper1
2
3
4
5
public interface GoodsMapper extends BaseMapper<Goods> {
}
7. 定义一个GoodsService实现类
注意这里继承了ServiceImpl类1
2
3
4
5
6
7
public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements GoodsService {
public List<Goods> list() {
return this.list(new QueryWrapper<Goods>().eq("goods_id", 39));
}
}
8. 调用查询
在业务逻辑中可以分别通过MP提供的基类等多种方式调用,还支持例如Map形式的查询条件、Wrapper类组装查询条件、自定义查询sql等,详见官方介绍。下面是基类自带的简单示例:1
2
3
4
5
6
7// MP自带(BaseMapper类的方法)
Map<String, Object> queryMap = new HashMap<>();
queryMap.put("goods_id", 39);
List<Goods> listGoods = goodsMapper.selectByMap(queryMap);
// MP自带(ServiceImpl类的方法)查询
List<Goods> listGoods2 = goodsService.list();
}
Mybatis代码生成器的配置及使用
听说MyBatis-Plus代码生成器比MyBatis生成器更方便,那就实战一下
1. 引入pom依赖
pom文件中加入如下配置1
2
3
4
5
6
7
8
9
10
11
12
13<!--代码生成器 依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.3.0</version>
</dependency>
<!--模板引擎 依赖-->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.28</version>
</dependency>
</plugin>
2.引入模板文件
模板文件的下载地址在这里
将下载好的模板文件放入项目的resources/templates目录中
3. 编写生成器java类
新增代码生成器类,注意修改下面的包名及数据库连接等配置,代码修改自知乎文章代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/**
* MyBatis-Plus代码生成器
*
* @author: xjy
* @createDate: 2020/8/13 18:05
*/
public class MyBatisPlusGenerator {
/**
* 控制台内容读取
*
* @author: xjy
* @param: tip
* @return: java.lang.String
* @exception:
* @date: 2020/8/13 18:15
*/
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();
final String projectPath = System.getProperty("user.dir");
gc.setOutputDir(projectPath + "/world-company/src/main/java");
gc.setAuthor("xjy");
gc.setOpen(false);
gc.setIdType(IdType.AUTO);
// gc.setSwagger2(true); 实体属性 Swagger2 注解
gc.setFileOverride(true); //设置是否覆盖原来的代码 最好设置为false 或者 另外配置路径
mpg.setGlobalConfig(gc);
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://ip:3306/test?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=UTC");
// dsc.setSchemaName("public");
dsc.setDriverName("com.mysql.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("root");
mpg.setDataSource(dsc);
// 包配置
final PackageConfig pc = new PackageConfig();
//pc.setModuleName(scanner("模块名"));
pc.setParent("com.xjy.world.company");
mpg.setPackageInfo(pc);
// 自定义配置
InjectionConfig cfg = new InjectionConfig() {
public void initMap() {
// to do nothing
}
};
// 如果模板引擎是 freemarker
String templatePath = "/templates/mapper.xml.ftl";
// 如果模板引擎是 velocity
// String templatePath = "/templates/mapper.xml.vm";
// 自定义输出配置
List<FileOutConfig> focList = new ArrayList<>();
// 自定义配置会被优先输出
focList.add(new FileOutConfig(templatePath) {
public String outputFile(TableInfo tableInfo) {
// 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
return projectPath + "/world-company/src/main/resources/mapper/"
+ 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("templates/mapper.java");
//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");
// 是否启动Lombok配置
strategy.setEntityLombokModel(true);
// 是否启动REST风格配置
strategy.setRestControllerStyle(true);
strategy.setInclude(scanner("表名,多个英文逗号分割").split(","));
// 写于父类中的公共字段 父类没有id就注释掉,否则实体类不生成 id属性
//strategy.setSuperEntityColumns("id");
strategy.setControllerMappingHyphenStyle(true);
strategy.setTablePrefix(pc.getModuleName() + "_");
mpg.setStrategy(strategy);
mpg.setTemplateEngine(new FreemarkerTemplateEngine());
mpg.execute();
}
4. 调用生成器
直接run上述的main方法即可生成包括xml、Entity、Mapper、Service、Controller等文件。
当然上述方法需要修改代码,还不是最人性化。如果想把配置项都写到一个单独的配置文件中,可以参考一下这篇文章就可以了。原理相同,不在赘述!
本文链接: https://www.xiajunyi.com/pages/p69.html
版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。转载请注明出处!