04、Dubbo实战:MybaitsPlus+Druid使用

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

*

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

*

说到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();
 
 ```java 
// 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否则,出现typebeannotfound错误,要在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.码字不易,点个右下角的“在看”吧。 *