网上关于自动生成entity文件的代码很多,看了很多代码后,在先辈们的基础上再完善一些功能(指定多个表,全部表).

为了使用方便所以把两个类写在一个java文件中,所以大家可以直接拿这个java文件,修改下配置后就可以使用了,传送门

1.把字段抽象为一个类

/**
* 字段信息表
*/
class FieldMeta {
private String fieldName; //字段名
private String fieldDataType; //字段类型
private int fieldLength; //字段长度
private String fieldComment; //字段备注 public String getFieldName() {
return fieldName;
}
public void setFieldName(String fieldName) {
this.fieldName = fieldName;
} public String getFieldDataType() {
if(fieldDataType.equalsIgnoreCase("bit")){
return "boolean";
}else if(fieldDataType.equalsIgnoreCase("tinyint")){
return "byte";
}else if(fieldDataType.equalsIgnoreCase("smallint")){
return "short";
}else if(fieldDataType.equalsIgnoreCase("int")){
return "int";
}else if(fieldDataType.equalsIgnoreCase("bigint")){
return "long";
}else if(fieldDataType.equalsIgnoreCase("float")){
return "float";
}else if(fieldDataType.equalsIgnoreCase("decimal") || fieldDataType.equalsIgnoreCase("numeric")
|| fieldDataType.equalsIgnoreCase("real") || fieldDataType.equalsIgnoreCase("money")
|| fieldDataType.equalsIgnoreCase("smallmoney")){
return "double";
}else if(fieldDataType.equalsIgnoreCase("varchar") || fieldDataType.equalsIgnoreCase("char")
|| fieldDataType.equalsIgnoreCase("nvarchar") || fieldDataType.equalsIgnoreCase("nchar")
|| fieldDataType.equalsIgnoreCase("text") || fieldDataType.equalsIgnoreCase("LONGTEXT")){
return "String";
}else if(fieldDataType.equalsIgnoreCase("datetime")){
return "Date";
}else if(fieldDataType.equalsIgnoreCase("image")){
return "Blod";
}
return fieldDataType;
}
public void setFieldDataType(String fieldDataType) {
if(fieldDataType.equalsIgnoreCase("bit")){
this.fieldDataType = "boolean";
}else if(fieldDataType.equalsIgnoreCase("tinyint")){
this.fieldDataType = "byte";
}else if(fieldDataType.equalsIgnoreCase("smallint")){
this.fieldDataType = "short";
}else if(fieldDataType.equalsIgnoreCase("int")){
this.fieldDataType = "int";
}else if(fieldDataType.equalsIgnoreCase("bigint")){
this.fieldDataType = "long";
}else if(fieldDataType.equalsIgnoreCase("float")){
this.fieldDataType = "float";
}else if(fieldDataType.equalsIgnoreCase("decimal") || fieldDataType.equalsIgnoreCase("numeric")
|| fieldDataType.equalsIgnoreCase("real") || fieldDataType.equalsIgnoreCase("money")
|| fieldDataType.equalsIgnoreCase("smallmoney")){
this.fieldDataType = "double";
}else if(fieldDataType.equalsIgnoreCase("varchar") || fieldDataType.equalsIgnoreCase("char")
|| fieldDataType.equalsIgnoreCase("nvarchar") || fieldDataType.equalsIgnoreCase("nchar")
|| fieldDataType.equalsIgnoreCase("text") || fieldDataType.equalsIgnoreCase("LONGTEXT")
|| fieldDataType.equalsIgnoreCase("TIMESTAMP")){
this.fieldDataType = "String";
}else if(fieldDataType.equalsIgnoreCase("datetime") || fieldDataType.equalsIgnoreCase("date")){
this.fieldDataType = "Date";
}else if(fieldDataType.equalsIgnoreCase("image")){
this.fieldDataType = "Blod";
}else {
this.fieldDataType = fieldDataType;
}
} public int getFieldLength() {
return fieldLength;
}
public void setFieldLength(int fieldLength) {
this.fieldLength = fieldLength;
} public String getFieldComment() {
return fieldComment;
}
public void setFieldComment(String fieldComment) {
this.fieldComment = fieldComment;
} }

2.通用方法,jdbc的创建与关闭,首字母大写方法.

   /**
* 功能:将输入字符串的首字母改成大写
* @param str
* @return
*/
private String upFirstChar(String str) {
if (str!=null&&str.length()>0) {
char[] ch = str.toCharArray();
if(ch[0] >= 'a' && ch[0] <= 'z'){
ch[0] = (char)(ch[0] - 32);
}
return new String(ch);
}
return null;
} /**
* 获取jdbc连接
*/
private Connection getJdbcCon(){
try {
Class.forName(DRIVER);
return DriverManager.getConnection(URL,NAME,PASS);
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
/**
* 关闭所有资源
*/
private void closeAll(ResultSet resultSet,PreparedStatement preparedStatement,Connection connnection,CallableStatement callableStatement) {
// 关闭结果集对象
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
System.out.println(e.getMessage());
}
}
// 关闭PreparedStatement对象
if (preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException e) {
System.out.println(e.getMessage());
}
}
// 关闭CallableStatement 对象
if (callableStatement != null) {
try {
callableStatement.close();
} catch (SQLException e) {
System.out.println(e.getMessage());
}
}
// 关闭Connection 对象
if (connnection != null) {
try {
connnection.close();
} catch (SQLException e) {
System.out.println(e.getMessage());
}
}
}

3.生成类,生成字段,生成方法

   /**
* 生成类主题框架
*/
public String genFrame(List<FieldMeta> fmls,String tableName){
StringBuilder sb = new StringBuilder();
//package空间
sb.append("package "+this.packagePath+";\r\n\r\n");
// 判断是否导入工具包
if (f_util) {
sb.append("import java.util.Date;\r\n");
}
if (f_sql) {
sb.append("import java.sql.*;\r\n");
}
// 注释部分
sb.append("/**\r\n");
sb.append(" * 名 称:" + tableName + "\r\n");
sb.append(" * 描 述:\r\n");
sb.append(" * 作 者:" + this.authorName + "\r\n");
sb.append(" * 时 间:" + new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(new Date()) + "\r\n");
sb.append(" * --------------------------------------------------" + "\r\n");
sb.append(" * 修改历史" + "\r\n");
sb.append(" * 序号 日期 修改人 修改原因 "+ "\r\n");
sb.append(" * 1" + "\r\n");
sb.append(" * **************************************************" + "\r\n");
sb.append(" */\r\n");
// 实体部分
sb.append("public class " + upFirstChar(tableName) + "{\r\n");
//字段部分
genAttrs(sb, fmls);
//方法部分
genMethods(sb, fmls);
sb.append("}\r\n");
return new String(sb);
}
/**
* 功能:生成所有属性
*/
private void genAttrs(StringBuilder sb,List<FieldMeta> fmls) {
for (int i = 0; i < fmls.size(); i++) {
sb.append("\t");
sb.append("private " + fmls.get(i).getFieldDataType() + " "
+ fmls.get(i).getFieldName() + ";");
sb.append("\t/*"+fmls.get(i).getFieldComment()+"\tlen: "+fmls.get(i).getFieldLength()+"*/\r\n");
}
sb.append("\r\n");
}
/**
* 功能:生成所有方法
*/
private void genMethods(StringBuilder sb,List<FieldMeta> fmls){
for (int i = 0; i < fmls.size(); i++) {
sb.append("\tpublic void set"+upFirstChar(fmls.get(i).getFieldName())+"("+fmls.get(i).getFieldDataType()+" "+fmls.get(i).getFieldName()+"){\r\n");
sb.append("\t\tthis."+fmls.get(i).getFieldName()+"="+fmls.get(i).getFieldName()+";\r\n");
sb.append("\t}\r\n");
sb.append("\tpublic "+fmls.get(i).getFieldDataType()+" get"+upFirstChar(fmls.get(i).getFieldName())+"(){\r\n");
sb.append("\t\treturn "+fmls.get(i).getFieldName()+";\r\n");
sb.append("\t}\r\n");
sb.append("\r\n");
}
sb.append("");
}

4.其他方法,写入文件方法,获取所有表名方法

    /**
* 写入文件
*/
private void wirteToFile(String content,String packagePath,String tableName){
PrintWriter pw = null;
BufferedWriter bw = null;
File dir = new File(""); //根据空文件获取项目路径
//entity文件父文件夹全路径
String dirpath = dir.getAbsolutePath() + "\\src\\"+packagePath.replace(".", "\\");
File parentDir = new File(dirpath);
if (!parentDir.exists()) { //判断是否存在该路径
parentDir.mkdirs(); //不存在则创建
}
String filePath = dirpath+"\\"+upFirstChar(tableName)+".java"; //java文件路径
File file = new File(filePath);
try {
if (!file.exists()) { //判断是否存在java文件
file.createNewFile(); //不存在则创建
}else {
System.out.print("表 "+tableName+" 的entity实体已存在于:");
}
pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream(filePath), "utf-8")); //OutputStreamWriter为了解决乱码
bw = new BufferedWriter(pw);
bw.write(content);
} catch (IOException e) {
e.printStackTrace();
} finally{
try {
if (bw!=null) {
bw.close();
}
if (pw!=null) {
pw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println(filePath);
} //获取所有表名
private String[] getAllTables(){
List<String> stringList = new ArrayList<String>();
Connection con = null;
PreparedStatement ps = null;
ResultSet rs =null;
con = getJdbcCon();
String sql = "show tables";
try {
ps = con.prepareStatement(sql);
rs = ps.executeQuery();
while (rs.next()) {
stringList.add(rs.getString(1));
}
} catch (SQLException e) {
e.printStackTrace();
} finally{
closeAll(rs, ps, con, null);
}
return stringList.toArray(new String[stringList.size()]);
}

5.执行

private String packagePath = "com.qy.entity";    //指定实体生成所在包的路径
//表名以","分隔;若为"*"则生成所有表的entity文件
private String tableNames = "*"; private String authorName = "邱宇"; //作者名字
private static final String DRIVER = "com.mysql.jdbc.Driver";
private static final String URL = "jdbc:mysql://localhost:3306/protocol";
private static final String NAME = "qy";
private static final String PASS = "199526"; private boolean f_util = false; // 是否需要导入包java.util.*
private boolean f_sql = false; // 是否需要导入包java.sql.* public static void main(String[] args) {
new CreateEntity();
} public CreateEntity(){ String[] tables = null;
if (this.tableNames=="*") {
tables = getAllTables();
}else {
tables = this.tableNames.split(",");
}
for (int i = 0; i < tables.length; i++) {
new CreateEntity(tables[i]);
f_util = false;
f_sql = false;
}
} public CreateEntity(String tableName){
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
DatabaseMetaData dbmd = null;
//ResultSetMetaData rsmd= null;
List<FieldMeta> fmls = new ArrayList<FieldMeta>();
String sql= "select * from "+tableName;
try {
con=getJdbcCon();
dbmd = con.getMetaData();
rs = dbmd.getColumns(con.getCatalog(), null, tableName, null);
while (rs.next()) {
FieldMeta fm = new FieldMeta();
fm.setFieldName(rs.getString("COLUMN_NAME"));
if (rs.getString("TYPE_NAME").equalsIgnoreCase("datetime")
|| rs.getString("TYPE_NAME").equalsIgnoreCase("date")) {
f_util = true;
}
if (rs.getString("TYPE_NAME").equalsIgnoreCase("image")
|| rs.getString("TYPE_NAME").equalsIgnoreCase("text")) {
f_sql = true;
}
fm.setFieldDataType(rs.getString("TYPE_NAME"));
fm.setFieldLength(Integer.parseInt(rs.getString("COLUMN_SIZE")));
fm.setFieldComment(rs.getString("REMARKS").replace("\r\n", " ")); //注释中的换行改为空格
fmls.add(fm);
}
/* 从resultSet读取的ResultSetMetaData没有注释等详细信息
ps = con.prepareStatement(sql);
rs = ps.executeQuery();
rsmd = rs.getMetaData();
for (int i = 0; i < rsmd.getColumnCount(); i++) {
FieldMeta fm = new FieldMeta();
fm.setFieldName(rsmd.getColumnName(i+1));
if (rsmd.getColumnTypeName(i+1).equalsIgnoreCase("datetime")) {
f_util = true;
}
if (rsmd.getColumnTypeName(i+1).equalsIgnoreCase("image")
|| rsmd.getColumnTypeName(i+1).equalsIgnoreCase("text")) {
f_sql = true;
}
fm.setFieldDataType(rsmd.getColumnTypeName(i+1));
fm.setFieldLength(rsmd.getColumnDisplaySize(i+1));
//fm.setFieldComment(fieldComment);
fmls.add(fm);
}*/ } catch (SQLException e) {
e.printStackTrace();
} finally{
if (con!=null) {
closeAll(rs, ps, con, null);
}
}
//生成内容
String content = genFrame(fmls,tableName);
//System.out.println(content);
//写入到文件
wirteToFile(content,this.packagePath,tableName);
}

源码

java自动生成entity文件的更多相关文章

  1. 【Mybatis】使用Mybatis-Generator自动生成entity、dao、mapping

    使用过mybatis的应该都有用过Mybatis-Generator,本文主要介绍使用Mybatis-Generator来自动生成entity.dao.mapping文件. Mybatis-Gener ...

  2. Java Itext 生成PDF文件

    利用Java Itext生成PDF文件并导出,实现效果如下: PDFUtil.java package com.jeeplus.modules.order.util; import java.io.O ...

  3. php中soap的使用实例以及生成WSDL文件,提供自动生成WSDL文件的类库——SoapDiscovery.class.php类

    1. web service普及: Webservice soap wsdl区别之个人见解 Web Service实现业务诉求:  Web Service是真正“办事”的那个,提供一种办事接口的统称. ...

  4. Mybatis上路_06-使用Java自动生成[转]

    Mybatis上路_06-使用Java自动生成 11人收藏此文章, 我要收藏发表于1个月前(2013-04-24 23:05) , 已有151次阅读 ,共0个评论 目录:[ - ] 1.编写Gener ...

  5. 记录一下idea自动生成Entity

    最近在鼓捣spring -boot ,真好用,学习到jpa. 通过生成Entity 文件,能够快速的生成数据库,并且使用 JpaRepository 的基本增删查改 方法,好用的一批. 可是随之,问题 ...

  6. Mybatis自动生成xml文件、dao接口、实体类

    Mybatis可以通过逆向工程,实现自动生成xml文件.dao接口.实体类 以下使用的是Intellij Idea进行自动生成 一.首先,要在pom.xml中导入插件,在<build>中加 ...

  7. linux下使用automake工具自动生成makefile文件

    linux环境下,当项目工程很大的时候,编译的过程很复杂,所以需要使用make工具,自动进行编译安装,但是手写makefile文件比较复杂,所幸在GNU的计划中,设计出了一种叫做Autoconf/Au ...

  8. 使用automake等命令自动生成Makefile文件 (转载)

    使用automake等命令自动生成Makefile文件   Linux下编程时,为了方便编译,往往使用Makefile文件自动完成编译,但是Makefile文件本身的书写十分复杂,规则很多.好在Lin ...

  9. Wix 安装部署(一)同MSBuild 自动生成打包文件

    因为项目需要,最近在研究Wix打包部署,园子里也有一些关于wix的博客,方方面面,讲的点各不同.我自己也在测试过程中,写下过程,以供参考.最新版本WiX Toolset v3.7,如何安装的就不说了, ...

随机推荐

  1. 【NOIP模拟】jzoj5233概率博弈(树规)

    Description 小A和小B在玩游戏.这个游戏是这样的: 有一棵

  2. SpringMVC 配置

    1.在WEB-INF\web.xml中定义前端控制器 <servlet> <servlet-name>springmvc</servlet-name> <se ...

  3. SQL&SQLite

    注册博客园有一年多了,每次都是来找点资料,从来没有写过点什么,促使我开始写博客的原因主要有两点 一是在查找资料的过程中,经常需要重复的查找某个知识点,一个知识点时间长了之后总是忘记,这样重复的过程却是 ...

  4. iOS 11更新后以及iPhone X推出后工程中遇到的问题及适配

    1.UITableView滑动时右侧的滑动条忽长忽短的乱跳以及MJRefresh上拉刷新死循环 这是因为tableView在iOS11默认使用Self-Sizing,tableView的estimat ...

  5. bug:论用例健壮性的重要

    最近出了2个类似问题,此处写下,以作为警醒 问题1: 背景:电商类网站,为了增加用户回流,增加用户购买力度,做了一个和用户等级相关活动 需求:用户等级为g0 -g5,现在有一批代金券有等级领取限制.用 ...

  6. centos 源码安装python

    一.准备环境 首先在官网下载想要的python对应版本http//www.python.org/downloads/source 下载tgz就可以了.文件有两种 1,Python-版本号.tgz(解压 ...

  7. SSH框架的多表查询和增删查改 (方法一)中

    原创作品,允许转载,转载时请务必标明作者信息和声明本文章==>http://www.cnblogs.com/zhu520/p/7774144.html   这边文章是接的刚刚前一遍的基础上敲的  ...

  8. Android 开发笔记___图像视图__简单截屏

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  9. this指向(匿名函数问题)

    1.匿名函数中 this一般指向window对象 2.闭包函数中的this,指向window var mod = { init: function(){ console.log('this',this ...

  10. zip 安装mysql 和遇到的坑

    在官网下载了mysql 社区版的,官方网址:https://dev.mysql.com/downloads/mysql/ 解压后发现里面没有安装快捷方式,才知道是zip解压,dos窗口安装.这就比界面 ...