暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Dubbo学习系列之四(MybaitsPlus+Druid使用)

曱甴崽 2019-08-22
373
文章导航:
Dubbo学习系列之一(消费者生产者模式搭建)
Dubbo学习系列之二(Nacos做配置中心)
Dubbo学习系列之三(Gradle打包可运行jar)

有人问,文章里有个难度级别咋定义的,那我来解释下,“大师”级别的键盘是这样的:

而“新手”的键盘是这样的:

    说到MybatisPlus(以下简称mbp)、Druid,这俩玩意不是很简单么,我想说对于常见的我们要做到知其所以然。mbp不算是业界标准,但使用起来还是很畅快的,Druid是阿里出品的数据库连接池中间件。今天,就来玩一把mbp的系列操作。

目标

1.利用mbp的generator自动生成entity/dao/mapper, 2.实现provider和consumer端RPC方式对DB数据查询 3.整合druid

难度新手--战士--老兵--大师

准备

idea201902/JDK11/ ZK3.5.5/Gradle5.4.1/Mysql8.0.11/Lombok0.25

步骤

1.项目结构延续之前的整体构造:根项目下三个子模块,settings.gradle中可以看到:

rootProject.name = 'integrate'
include 'provider'
include 'consumer'
include 'common'

2.整体思路:先用mbp的generator生成entity/dao/mapper等,然后common中写一个公共接口,provider中实现接口提供一个服务,consumer中PRC调用这个接口,并输出DB查询结果。

3. 在前文的项目基础上,做了删减,仅保留本项目相关,去掉Nacos

4.common模块建包,并建立MysqlGenerator类,写个main入口,这里以mbp的官方为基础版本修改而来:

首先是个console读取函数,用于用户交互输入,比如指定module和表名:

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.isNotEmpty(ipt)){
return ipt;
}
}

声明一个AutoGenerator,做一些全局配置,其中的setBaseColumnList(true),是指mapper文件中的“通用查询结果列”,

AutoGenerator mpg = new AutoGenerator();
//global config
GlobalConfig gc = new GlobalConfig();
//获取当前项目的路径
String projectPath = System.getProperty("user.dir");
System.out.println("projectPath: "+projectPath);//for test
gc.setOutputDir(projectPath + "/common/src/main/java");
gc.setAuthor("xiaobiao");
gc.setFileOverride(false);
gc.setBaseColumnList(true); // XML columList
gc.setOpen(false);

设置生成的entity/dao/mapper/service/controller/Impl等,里面的“%s”将会被具体的实体名代替掉。

//文件名设置
gc.setEntityName("%sEntity");
gc.setMapperName("%sDao");
gc.setXmlName("%sDao");
gc.setServiceName("%sService");
gc.setServiceImplName("%sServiceImpl");
gc.setControllerName("%sController");
gc.setMapperName("%sMapper");
mpg.setGlobalConfig(gc);

数据源设置部分略过;

package设置,如果想把包分的更细,可以指定moduleName,比如我想订单order一个包,库存stock一个包,那么entity/dao/mapper/service/controller/Impl等会分别放到order/stock包下,

//包设置

PackageConfig pc = new PackageConfig();

// eg: com.example.common.{module-name}.dao
pc.setModuleName(scanner("module-name"));
pc.setParent("com.example.common");
pc.setEntity("entity");
pc.setMapper("dao");
pc.setService("service");
pc.setServiceImpl("impl");
pc.setEntity("mapper");
mpg.setPackageInfo(pc);

模板设置,注意这里的template不是指前端模板,是指mapper的模板,注释掉这个setTemplate,那么就不会生成mapper了。

cfg.setFileOutConfigList(focList);
mpg.setCfg(cfg);
// close xml generation,and will save at the root directory
mpg.setTemplate(new TemplateConfig());

策略配置,建议打开lombok,entity会自动加上lombok标签,这样就省去了setter/getter方法,toString()等,setInclude和setExclude二选一,setInclude即要自动生成的表,setExclude相反,全部要生成,setExclude(null)即可。还可统一指定各种生成对象的父类。

//策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
// strategy.setSuperEntityClass("com.baomidou.mybatisplus.samples.generator.common.BaseEntity");
strategy.setEntityLombokModel(true);
// strategy.setSuperControllerClass("com.baomidou.mybatisplus.samples.generator.common.BaseController");
strategy.setInclude(scanner("table-name"));//需要包含的表名,允许正则表达式(与exclude二选一配置)
// strategy.setSuperEntityColumns(""); //父类的公共字段
strategy.setControllerMappingHyphenStyle(true);
strategy.setTablePrefix(pc.getModuleName() + "_");
mpg.setStrategy(strategy);
// if use freemarker, be aware the dependency is required
// mpg.setTemplateEngine(new FreemarkerTemplateEngine());
mpg.execute();

5.运行一下:输入module和table名,

6.项目包下就有了:红色是没有加入git,右键git--> add,即可,

7.删除不要的文件,移动一些文件,


8.common下的service接口:

9.provider下的实现:

10.consumer下的controller层调用:

11.跑一下:启动zk-->provider---consumer,

12源码地址:其中的day04

https://github.com/xiexiaobiao/dubbo-project.git



项目复盘记:

1.我在项目中都尽量使用新的软件稳定版本,力求符合潮流,所以赶紧更新了zk版本
2.zk3.5.5安装问题解决:zk启动闪退

https://www.jianshu.com/p/c5dd1b4b0697

3.我尝试过其他generator,gradle非常强大,可以加插件,插件引入后就会有个generator的task,在other组中,比较好的插件:https://blog.csdn.net/cpongo4/article/details/86613812

我研究使用了一番,发现不能使用,原因未知,作者说的使用方法也略简陋

4.build编码错误:


根据提示,直接将有错误的文件具体指定为utf-8,

setting-->file Encodings, 然后选convert,

5.mbp在生成entity的时候,需要注意,pk字段必须要使用@tableId指定,尤其对于实体中驼峰,数据表中下划线的,使用@tableField指定映射

6.提示错误:


就是paid字段,mbg并没有自动生成@tableField,导致无法映射,需要手动添加,为保险,建议将所有下划线的都加上映射注解。

7.DubboOrderMapper.xml中,可以通过javaType指定java实体类型,jdbcType指定数据表类型,一般而言:String--VARCHAR;Boolean--TINYINT;LocalDateTime--DATETIME;

8.dao类需要添加 @Mapper 否则,出现type bean not found 错误,要在dao上添加两者的注解,或者启动类上@MapperScan()

注意 @Mapper 和 @Repository 的区别

@Mapper 是iBatis的注解,用于将实体和数据表映射,

@Repository是Spring的注解,用于注入bean,

9.我遇到的问题:后端List有数据,但前端接收数据一直显示[{},{}],找了几个小时,各种数据验证,原来是Lombok插件不兼容,lombok插件必须要对应相应的idea版本号,这个坑很隐蔽,不会报任何error,原因就是实体对象没有get/set导致,解决,要么直接实现get/set,要么修改lombok插件!
10.RPC的原理:如果仔细观察console,会发现虽然是consumer调用,但sql的执行是在provider下的,这其实就是PRC的机制:反射机制--传参--结果传输.
11.启动后打印输出有两行要注意:
一是Druid使用非常简单,引入包,配置下,就自动注入,这里可以看到.
二是,mapper文件的加载,可以看到加载了哪个映射文件,

12,事实上数据库连接池中间件有多款,C3P0,DBCP,但性能都不如Druid,如果有写过JDBC,就知道很繁琐,druid就是用线程池,来做JDBC的自动化。
13.mbp3.0之后的版本差别比较大,尤其是新QueryWrapper的语法,需要学习下。
14.mbp的局限性:只能生成单表的CRUD操作,多表关联的只能自己在dao写方法,并在mapper中实现。
15.写代码别“以为然”,必须自己敲一遍代码,不然别人的代码永远是别人的代码。碰见各种问题,就解决,过程是有点难受,但解决后的荷尔蒙能让你快活一下。反正怎么折腾怎么来,别人用maven,我用gradle,别人用mbg,我用熊猫generator,我保证你遇见各种问题。
16.码字不易,点个右下角的“在看”吧。




文章转载自曱甴崽,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论