IDEA 逆向工程
今天要写一个导入功能,需要把数据库的一个表映射成一个pojo,但是这表字段不是一般的多啊。。。想了想能不能自动生成???在IDEA中点了半天发现还是可以的
下面介绍一下步骤:
第一步:找到这个图标,建立一个数据库连接


建立完成之后如下图:

第二部修改生成pojo的脚本,切换到这个视图

主要是修改包名:

把上图中的packageName修改成生成pojo存放位置的包即可
第三步:选中要生成实体类的表(可以多选),右键按下图即可生成

如果项目中使用了Lombok插件的话,可以扩展一下自带的Generate POJOs.groovy就可很快的生成我们想要形式的pojo
下面是我的这个工程结构:

这是一个典型的maven工程结构,针对maven工程,扩展的两个groovy脚本,两个脚本均可以根据选择的文件夹自动生成正确的包名
Generate POJOs For Hibernate Lombok.groovy 这个脚本用来生成Hibernate的实体类,要注意两点:1、主键名必须是“id”,2、如果表中有版本字段,那么版本字段名必须是"version",3、这脚本生成的实体类,主键生成策略没有采用自增模式,如果你的表中主键设置了自增的话,
需要稍微改动一下才可以用
import com.intellij.database.model.DasTable
import com.intellij.database.model.ObjectKind
import com.intellij.database.util.Case
import com.intellij.database.util.DasUtil /*
* Available context bindings:
* SELECTION Iterable<DasObject>
* PROJECT project
* FILES files helper
*/
typeMapping = [
(~/(?i)int/) : "long",
(~/(?i)float|double|decimal|real/): "double",
(~/(?i)datetime|timestamp/) : "java.sql.Timestamp",
(~/(?i)date/) : "java.sql.Date",
(~/(?i)time/) : "java.sql.Time",
(~/(?i)/) : "String"
] FILES.chooseDirectoryAndSave("Choose directory", "Choose where to store generated files") { dir ->
SELECTION.filter {
it instanceof DasTable && it.getKind() == ObjectKind.TABLE
}.each {
generate(it, dir)
}
} def generate(table, dir) {
def className = javaName(table.getName(), true)
def fields = calcFields(table)
def tableName = table.getName()
def path = dir.getPath()
def packageName = path.substring(path.lastIndexOf("java") + 5, path.length()).replaceAll("\\\\", ".")
new File(dir, className + ".java").withPrintWriter { out -> generate(out, tableName, className, fields, packageName) }
} def generate(out, tableName, className, fields, packageName) {
out.println "package $packageName;"
out.println ""
out.println "import lombok.Data;"
out.println "import org.hibernate.annotations.DynamicInsert;"
out.println "import org.hibernate.annotations.DynamicUpdate;"
out.println "import org.hibernate.annotations.GenericGenerator;"
out.println ""
out.println "import javax.persistence.*;"
out.println "import java.io.Serializable;"
out.println ""
out.println "@Data"
out.println "@Entity"
out.println "@Table(name = \"${tableName}\")"
out.println "@DynamicUpdate(true)"
out.println "@DynamicInsert(true)"
out.println "public class $className implements Serializable{"
out.println ""
out.println "\tprivate static final long serialVersionUID = 33163593958226L;"
out.println ""
fields.each() {
if (it.annos != "") out.println "\t${it.annos}"
out.println "\tprivate ${it.type} ${it.name};"
out.println ""
}
out.println "}"
} def calcFields(table) {
DasUtil.getColumns(table).reduce([]) { fields, col ->
def spec = Case.LOWER.apply(col.getDataType().getSpecification())
def typeStr = typeMapping.find { p, t -> p.matcher(spec).find() }.value
if (col.getName().toLowerCase() == "id") {
fields += [[name : javaName(col.getName(), false),
type : typeStr,
annos: "@Id\n" +
"\t@GeneratedValue(generator = \"" + table.getName() + "IDGenerator\" , strategy = GenerationType.AUTO)\n" +
"\t@GenericGenerator(name = \"" + table.getName() + "IDGenerator\" , strategy = \"uuid\")\n" +
"\t@Column(name =\"" + col.getName() + "\")"]]
} else if(col.getName().toLowerCase() == "version"){
fields += [[name : javaName(col.getName(), false),
type : typeStr,
annos: "@Version\n" +
"\t@Column(name =\"" + col.getName() + "\")"]]
}else {
fields += [[name : javaName(col.getName(), false),
type : typeStr,
annos: "@Column(name =\"" + col.getName() + "\")"]]
}
}
} def javaName(str, capitalize) {
def s = com.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(str)
.collect { Case.LOWER.apply(it).capitalize() }
.join("")
.replaceAll(/[^\p{javaJavaIdentifierPart}[_]]/, "_")
capitalize || s.length() == 1 ? s : Case.LOWER.apply(s[0]) + s[1..-1]
}
Generate POJOs For Lombok.groovy 使用lombok插件之后可以采用如下脚本生成Lombok形式的pojo
import com.intellij.database.model.DasTable
import com.intellij.database.model.ObjectKind
import com.intellij.database.util.Case
import com.intellij.database.util.DasUtil /*
* Available context bindings:
* SELECTION Iterable<DasObject>
* PROJECT project
* FILES files helper
*/ packageName = "com.ryb.pojo;" typeMapping = [
(~/(?i)int/) : "long",
(~/(?i)float|double|decimal|real/): "double",
(~/(?i)datetime|timestamp/) : "java.sql.Timestamp",
(~/(?i)date/) : "java.sql.Date",
(~/(?i)time/) : "java.sql.Time",
(~/(?i)/) : "String"
] FILES.chooseDirectoryAndSave("Choose directory", "Choose where to store generated files") { dir ->
SELECTION.filter { it instanceof DasTable && it.getKind() == ObjectKind.TABLE }.each { generate(it, dir) }
} def generate(table, dir) {
def className = javaName(table.getName(), true)
def fields = calcFields(table)
def path = dir.getPath()
def packageName = path.substring(path.lastIndexOf("java") + 5, path.length()).replaceAll("\\\\", ".")
new File(dir, className + ".java").withPrintWriter { out -> generate(out, className, fields, packageName) }
} def generate(out, className, fields, packageName) {
out.println "package $packageName;"
out.println ""
out.println "import lombok.Data;"
out.println ""
out.println "@Data"
out.println "public class $className {"
out.println ""
fields.each() {
if (it.annos != "") out.println "\t${it.annos}"
out.println "\tprivate ${it.type} ${it.name};"
}
out.println "}"
} def calcFields(table) {
DasUtil.getColumns(table).reduce([]) { fields, col ->
def spec = Case.LOWER.apply(col.getDataType().getSpecification())
def typeStr = typeMapping.find { p, t -> p.matcher(spec).find() }.value
fields += [[
name : javaName(col.getName(), false),
type : typeStr,
annos: ""]]
}
} def javaName(str, capitalize) {
def s = com.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(str)
.collect { Case.LOWER.apply(it).capitalize() }
.join("")
.replaceAll(/[^\p{javaJavaIdentifierPart}[_]]/, "_")
capitalize || s.length() == 1? s : Case.LOWER.apply(s[0]) + s[1..-1]
}
IDEA 逆向工程的更多相关文章
- IDEA 中生成 MyBatis 逆向工程实践
IDEA 逆向 MyBatis 工程时,不像支持 Hibernate 那样有自带插件,需要集成第三方的 MyBatis Generator. MyBatis Generator的详细介绍 http:/ ...
- mybatis逆向工程生成JavaBean、dao、mapper generatorSqlmapCustom
import java.io.File; import java.util.ArrayList; import java.util.List; import org.mybatis.generator ...
- mybatis入门基础(九)----逆向工程
一.什么是逆向工程 mybaits需要程序员自己编写sql语句,mybatis官方提供逆向工程 可以针对单表自动生成mybatis执行所需要的代码(mapper.java,mapper.xml.po. ...
- iOS逆向工程资料
链接: 基于iOS逆向工程的微信机器人 - 猫友会大讲坛第1期 我的失败与伟大 —— 创业必备的素质(狗神经验谈)
- PowerDesigner逆向工程导入MYSQL数据库总结
由于日常数据建模经常使用PowerDesigner,使用逆向工程能更加快速的生成模型提高效率,所以总结使用如下: 首先现在PowerDesigner,这里提供PD16.5版本链接: http://pa ...
- IOS_ios逆向工程-静态分析
返回博客列表 原 ios逆向工程-静态分析 余成海 发布时间: 2014/11/03 19:17 阅读: 11201 收藏: 17 点赞: 5 评论: 6 最近在学习IOS逆向工程,查看网络上的资料也 ...
- (转) PowerDesigner逆向工程导入MYSQL数据库总结
PowerDesigner逆向工程导入MySQL数据库总结 由于日常数据建模经常使用PowerDesigner,使用逆向工程能更加快速的生成模型提高效率,所以总结使用如下: 1. 安装MYS ...
- Mybatis逆向工程构建项目实例.
2016/11/06更新: 因为有博友可能需要这份代码, 所以我就直接发到百度云上面和大家共享, 如果链接失效请大家留言提示即可.下载地址: http://pan.baidu.com/s/1i57E8 ...
- Linux C++ 调试神技--如何将Linux C++ 可执行文件逆向工程到Intel格式汇编
Linux C++ 调试神技--如何将Linux C++ 可执行文件逆向工程到Intel格式汇编 对于许多在windows 上调试代码的人而言, Intel IA32格式的汇编代码可能并不陌生,因为种 ...
- MyBatis学习--逆向工程
简介 mybaits需要程序员自己编写sql语句,mybatis官方提供逆向工程 可以针对单表自动生成mybatis执行所需要的代码(mapper.java,mapper.xml.po..).企业实际 ...
随机推荐
- WEB状态码
这些状态代码表示临时的响应.客户端在收到常规响应之前,应准备接收一个或多个 1xx 响应. 100 - 继续. 101 - 切换协议. 2xx - 成功 这类状态代码表明服务器成功地接受了客户端请求. ...
- RabbitMq入门与基本使用
这两天工作项目中用到了rabbitmq,顺便学习了一下. RabbitMq主要的使用模式有三种:工作队列,发布订阅和RPC远程调用. 1.工作队列 生产者: using System; using R ...
- 01. Java序列化与反序列化简介
Java对象的序列化与反序列化 ; 给大家讲解一下什么是序列化 & 反序列化 当两个进程进行远程通讯的时候,彼此相互可以发送各种类型的数据,如文本,图片,语音和视频等无论是任何类型,最终都会 ...
- Mysql2索引
索引分类: 作用:优化查询,select查询有三种情况:缓存查询(不在mysql中进行数据查询),全表查询,索引扫描 Btree(btree b+tree b*tree) Rtree HASH Ful ...
- Linux命令(基础1)
一 命令的基本构成 (PS:Linux发行版本命令大概有200多个,熟练掌握个百八的就行了,其余的有个大概了解) 命令体 选项 参数(对象) ls -l /var 1.1参数:文件 文件类型: d ...
- 大量高清文字版PDF编程书籍下载
下载地址 :http://zhaojucai.com/download.html 文件夹: 数学之美(第二版) Java编程思想(第4版) 图灵程序设计丛书:Python基础教程(第2版)(修订版) ...
- Java集合—Map
简介 Map用户保存具有映射关系的数据,因此Map集合里保存着两组数,一组值用户保存Map里的key,另一组值用户保存Map里的value,key和value都可以是任何引用类型的数据.Map的key ...
- 【开发者笔记】java 利用jna调用c#的dll
一.需求阐述: 如果我们的项目利用c#开发,到了开发后期需要和java组进行合作,其中有一部分业务逻辑利用c#已经code completed,那么我们可能会考虑用java来调用现成的c#dll实现需 ...
- django生产环境部署
测试环境:linux centos7下 1.安装uwsgi python3下安装: pip3 install uwsgi python2下安装: pip install uwsgi 如果是系统自带的p ...
- python操作socket
Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 SocketServer, 它提供了服务器中心类,可以简化网络 ...