文档章节

数据库逆向生成代码及Maven插件开发

蛙牛
 蛙牛
发布于 2015/12/20 22:54
字数 1410
阅读 5673
收藏 258

        之前使用mybatis,可以用mybatis generator逆向生成dao层代码,详见博客《数据库逆向框架代码生成工具:MyBatis Generator的使用》。公司使用的是自己开发的服务,所以最近抽空写了一个逆向生成的工具,并做成了maven插件,以后就可以很方便的实现dao层的相关代码。

        在开发之前已经想好了思路,通过velocity模板,实现代码生成。上网搜了下velocity的代码生成工具。搜到了《一个基于velocity模板引擎的代码生成器》,下载了源码进行了部署以及学习,作者的代码写的非常规范,基于jquery easyui和mybatis做了一个mybatis的封装框架,并且考虑了多数据库的支持,自己从中也收获不少。另外也看了mybatis generator的源码,因为里面要兼容的东西多,所以代码量也是很大的。

        自己想做的比较简单,只用基于公司现有的底层实现,逆向生成出来Dao层的代码就可以。不需要支持其他数据库,不需要提供UI界面,只用简单的配置即可。所以实现的比较简单,正因为简单,修改起来也方便,学习成本也很低。下面进入正文。


1实现方式

        1通过配置连接库 2获得对应的表结构元数据 3进行相关类型转换 4然后通过velocity模板生成对应的文件。


需要注意:

        约定优于配置,命名一定要规范。比如数据库的字段命名规范,多个单词使用 _ 分割,这样可以方便转换为JavaBean的驼峰命名格式。数据库的user_name,JavaBean中对应userName。  

         另外如果想支持自己的项目,需要修改velocity模板,如果有特殊需求,可能需要改下源码。

2实现过程

        首先需要通过读取配置文件,连接数据库,我们可以使用各种方式,比如最原生的jdbc,或者mybatis,这里使用了Apache的DBCP以及DBUitls,另外配置文件使用properties,都是为了实现起来简单。


 配置文件配置有mysql的连接属性,需要逆向生成的数据库表名,生成的实体名,包名

       

2.把配置封装在一个对象中,便于上下文使用(也是为了maven插件使用,下文会说到)。

把数据库的连接,以及查询操作封装在DBHelper中。

然后获得对应表的元数据,进行类型转换,数据封装为velocity的模板数据,通过velocity生成代码。


3.代码细节

DBHelper中,通过配置初始化datasource,然后创建DBUtil的QueryRunner查询器。

通过QueryRunner的query方法,查询数据,这里用到MapListHandler解析器,可以把查询结果转换成List<Map<String, Object>>


接下来把查询到的元数据,转换为自定义对象,把数据库类型转换为java类型。这里有一个技术细节,DBUtils返回的Map对象里面的key是不区分大小写的。


生成代码,对应的velocity模板中的属性


然后就是渲染到模板了,需要什么属性,可以自己封装,模板也可以根据自己需要进行修改,这里是公司实体对应的模板

package ${package}.contract.entity;

import com.bj58.sfft.utility.dao.annotation.Column;
import com.bj58.sfft.utility.dao.annotation.Id;
import com.bj58.sfft.utility.dao.annotation.NotDBColumn;
import com.bj58.sfft.utility.dao.annotation.Table;
import com.bj58.spat.scf.serializer.component.annotation.SCFMember;
import com.bj58.spat.scf.serializer.component.annotation.SCFSerializable;

#set($hasDate=0)
#foreach($column in $columns)
#if($column.javaType=='Date' && $hasDate==0)
import java.util.Date;
#set($hasDate=1)
#end
#end

@Table(name="${table}")
@SCFSerializable
public class ${entity}{

    @NotDBColumn
    private static final long serialVersionUID = 1L;

#foreach($column in $columns)
    @SCFMember
#if(${column.isPk})
#if(!${column.isIdentityPk})
    @Id(insertable=true)
#end
#else
    @Column(name="${column.columnName}")
#end
    private ${column.javaType} ${column.javaFieldName};

#end

#foreach(${column} in ${columns})
    public void set${column.javaFieldNameUF}(${column.javaType} ${column.javaFieldName}){
        this.${column.javaFieldName} = ${column.javaFieldName};
    }

    public ${column.javaType} get${column.javaFieldNameUF}(){
        return this.${column.javaFieldName};
    }

#end}


这里需要生成整个Dao层代码,所以把方法写成了回调的形式


最后运行代码,会把代码生成在 项目的target/generator目录下


4封装成Maven插件

maven插件开发,也是自己第一次弄,官方文档Maven Plugin

上网搜了下maven插件开发,《开发自己的Maven插件之一:hello world》

实现过程也很简单,在pom中添加插件依赖,在代码中继承AbstractMojo类 ,实现execute方法

使用Intellij IDEA的话,可以选择maven模板




通过引用插件,就可以在项目中运行code-generator:generator命令,或者点击右侧插件运行


需要注意资源文件的加载方式

运行maven插件,项目是可以不编译的,因此要通过maven注入的basedir,获得项目的路径

如果在Java中运行,首先是需要编译项目的,通过java获得文件路径是在类编译的根目录下的

为了便于使用和测试,所以源码中,可以调用main包下的CodeGenerator类。

也可以把项目install本地,通过maven插件的方式,在其他项目中引用运行



5源码

源码使用了别人的一些代码进行了修改,类注释中都有原作者

最后强调,代码生成器不是万能的,要根据自己的需要进行一些修改,代码写的比较简单,见谅

源码:《code-generator》

© 著作权归作者所有

共有 人打赏支持
蛙牛

蛙牛

粉丝 525
博文 46
码字总数 48937
作品 1
朝阳
程序员
加载中

评论(25)

xfan1503
xfan1503
用fmpp比这方便多了
蛙牛
蛙牛

引用来自“ToB蓝波湾”的评论

哈哈 58的? 我看到了scf 还有之前架构部的数据库连接池
一条大河波浪宽
一条大河波浪宽
哈哈 58的? 我看到了scf 还有之前架构部的数据库连接池
蛙牛
蛙牛

引用来自“Hi徐敏”的评论

发布到github 经常呗。
Git@OSC 也一样哈~
Hi徐敏
Hi徐敏
发布到github 经常呗。
墨-眉
墨-眉
mark,好东西,有时间好好研究
sumyfly
sumyfly
向牛人学习!
maskleo
maskleo
up
最近改了下mybatis generator源码
可以自定义生成字段注释和表注释
看了楼主的代码
值得学习
缓一缓
缓一缓

引用来自“缓一缓”的评论

楼主还有 那个 velocity模板引擎代码生成器 的源码吗?博客链接里没找到代码下载位置3

引用来自“蛙牛”的评论

在resources目录下~
多谢
蛙牛
蛙牛

引用来自“傲气小舟舟”的评论

思路是错误的,持久层怎么能反推业务实体呢?
DB实体 业务实体 可以是不一样的~
【MyBatis框架】mybatis逆向工程自动生成代码

逆向工程 1.什么是逆向工程 mybaits需要程序员自己编写sql语句,mybatis官方提供逆向工程 可以针对单表自动生成mybatis执行所需要的代码(mapper.java,mapper.xml、po..) 企业实际开发中,常...

Mysoft
2015/09/21
222
0
IDEA中使用maven创建mybatis的逆向工程

逆向工程(Mybatis Generator) 概念 mybatis Generator 中文官网 mybatis需要程序员自己编写sql语句,mybatis官方提供逆向工程,可以针对单表 自动生成mybatis执行所需要的代码.(mapper.java、m...

中柠檬
2016/12/01
225
0
数据库逆向框架代码生成工具:MyBatis Generator的使用

MyBatis Generator的详细介绍http://mybatis.github.io/generator/index.html MyBatis Generator With Maven http://mybatis.github.io/generator/running/runningWithMaven.html 1前言 前段......

蛙牛
2014/02/16
0
28
IDEA—Mybatis逆向工程

mybaits需要程序员自己编写sql语句,mybatis官方提供逆向工程,可以针对单表自动生成mybatis执行所需要的代码(mapper.java,mapper.xml、po..) 1. 下载逆向工程,配置Maven pom.xml 文件 1....

小小蒜头
2017/12/01
0
0
mybatis 通用CRUD的替换方法

http://git.oschina.net/alexgaoyh/MutiModule-parent 代码此次变更较大,使用了mybatis-generator-maven-plugin 插件,把之前多模块项目中的domain部分删除,将这一部分代码整合到persise部...

alexgaoyh
2015/04/22
0
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

这些Spring中的设计模式,你都知道吗?

设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆。 Spring作为业界的经典框架,无论是在架构设计方面,还是在代码编写方面,都堪称行...

Java填坑之路
33分钟前
1
0
Spring Aop原理之Advisor过滤

在上文(Spring Aop之Advisor解析)中我们讲到,Spring Aop对目标bean的代理主要分为三个步骤:获取所有的Advisor,过滤当前bean可应用的Advisor和使用Advisor为当前bean生成代理对象,并且上文...

爱宝贝丶
44分钟前
0
0
JMockit学习教程

1 JMockit中文网 我觉得如果仅仅是开发自测的话,把JMockit中文网认真看一遍,就可以在项目中使用JMockit了。 http://jmockit.cn/index.htm 2 JMockit中文教程 官方文档中文版。对于不喜欢看...

SuperHeroes
56分钟前
0
0
Linux服务器几乎从不采用Arch Linux?

我们见得多的Linux服务器系统一般都是什么Ubuntu Server啊,什么Cent OS啊,什么Fedora啊,或者企业采用的Red Hat啊,为什么几乎没有Arch Linux呢?下面我将从若干个方面指出Arch Linux在服务...

linux-tao
今天
0
0
js 函数柯里化 闭包

参考 https://mp.weixin.qq.com/s/GEHL3jarDdAAcr5tQGjmDg 一个统计求和的函数 需要知道整个数组的信息,然后遍历求值 function countMoney() { let money = 0 // 温馨提示:arguments...

阿豪boy
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部