JFinal 连接数据库生成Model类

Stella981
• 阅读 623

很喜欢JFinal 框架的,简单,不用像SSH那样乱七八糟的注入,配置。不过用惯了Hibernate,Eclipse 可以直接连接数据库,批量生成表对象类。嘿嘿……“懒惰”驱使,那就自己写一个吧,肯定以后的学习中,JFinal是很有用的,就写了这个CreateJfinalEntityUtil 工具类。用的是POSTGRESQL数据库,这个数据库非常不错,呵呵……写的不好,大家勿喷。

package xidian.wwf.utils;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;


/**
 * 映射数据库,自动生成Entity
 * @author WWF
 */
public class CreateJfinalEntityUtil {
    
    private static Connection conn = null;
    private static final String URL;
    private static final String JDBC_DRIVER;
    private static final String USER_NAME;
    private static final String PASSWORD;
    private static final String DATABASENAME;
    private static final String PACKAGENAME;
    static {
        DATABASENAME = "数据库名";
        URL = "jdbc:postgresql://localhost:5432/"+DATABASENAME;
        JDBC_DRIVER = "org.postgresql.Driver";
        USER_NAME = "数据库帐号";
        PASSWORD = "密码";
        PACKAGENAME = "xidian.wwf.entity";
    }
    
    /**
     * 获得连接
     * @return
     */
    public static Connection getConnection() {
        try {
            Class.forName(JDBC_DRIVER);
            conn = DriverManager.getConnection(URL, USER_NAME, PASSWORD);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }
    
    /**
     * 关闭数据库
     */
    public static void closeConnection(){
        try {
            if (conn != null && !conn.isClosed()) {
                conn.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 生成字段静态声明
     * @param connection
     * @param tableName
     * @return
     */
    private static String CreateEntityString(String tableName){
        String result  = "package "+PACKAGENAME+";\n\n";
        result += "import com.jfinal.plugin.activerecord.Model; \n\n";
        result += "public class "+StringUtil.toLowerCaseTheFristChar(tableName)+" extends Model<"+StringUtil.toLowerCaseTheFristChar(tableName)+">{\n\n";
        result += "    private static final long serialVersionUID = 1L;\n";
        result += "    public static final "+StringUtil.toLowerCaseTheFristChar(tableName)+" dao = new "+StringUtil.toLowerCaseTheFristChar(tableName)+"();\n\n";
        result += "    /**表名**/ \n" ;
        result += "    public static String TABLE = \""+tableName+"\";" ;
        String sql = "select column_name from information_schema.columns where table_name = '"+tableName+"';";
        try {
            Statement statement = conn.createStatement();
            ResultSet resultSet =  statement.executeQuery(sql);
            while (resultSet.next()) {
                if (resultSet.getString(1)!=null&&!resultSet.getString(1).isEmpty()) {
                    String string = resultSet.getString(1);
                    String row = "    public static final String "+ string.toUpperCase(Locale.CHINA) +" = \""+string+"\";";
                    String note = "    /****/";
                    result += "\n"+note + "\n" +row;
                }
            }
            resultSet.close();
            statement.close();
            result+="\n }";
            return result;
        } catch (SQLException e) {
            e.printStackTrace();
            return null;
        }
    }
    
    /**
     * 获得数据库的所有表名
     * @return
     */
    public static List<String> getAllTables(){
        String sql = "select relname as TABLE_NAME from pg_class c " +
                "where  relkind = 'r' and relname not like 'pg_%' and relname not like 'sql_%' order by relname";
        try {
            List<String> result = new ArrayList<String>();
            Statement statement = conn.createStatement();
            ResultSet resultSet =  statement.executeQuery(sql);
            while (resultSet.next()) {
                if (resultSet.getString(1)!=null&&!resultSet.getString(1).isEmpty()){
                    result.add(resultSet.getString(1));
                }
            }
            return result;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    
    
    
    /**
     * 生成Entity
     */
    public static void CreateEntity(){
        try {
            getConnection();
            List<String> tables = getAllTables();
            for (int i = 0; i < tables.size(); i++) {
                File createFolder = new File(System.getProperty("user.dir")+"/src/"+PACKAGENAME.replace(".", "/"));
                //路径不存在,生成文件夹
                if (!createFolder.exists()) {
                    createFolder.mkdirs();
                }
                String entityString = CreateEntityString(tables.get(i).trim());
                File entity = new File(createFolder.getAbsolutePath()+"/"+StringUtil.toLowerCaseTheFristChar(tables.get(i))+".java");
                if (!entity.exists())
                {
                    //写入文件 
                    BufferedWriter out = new BufferedWriter(new FileWriter(entity, true));
                    out.write(entityString);
                    out.close();
                    out = null;
                    entity = null;
                }
            }
            closeConnection();
            System.out.println("生成成功");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    
    
    public static void main(String[] args) {
        CreateEntity();
    }

    

}
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Easter79 Easter79
3年前
tcp_tw_recycle参数引发的数据库连接异常
【问题描述】开发反馈有个应用在后端数据库某次计划性重启后经常会出现数据库连接异常问题,通过监控系统的埋点数据,发现应用连接数据库异常有两类表现:  其一:连接超时  <spanstyle"backgroundcolor:FFFF00"131148.00msTomcatConnectionPool</span  其二:连接耗时过
Easter79 Easter79
3年前
sql注入
反引号是个比较特别的字符,下面记录下怎么利用0x00SQL注入反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下1)表名payload:select\from\users\whereuser\_id1limit0,1;!(https://o
Stella981 Stella981
3年前
Django之Django模板
1、问:html页面从数据库中读出DateTimeField字段时,显示的时间格式和数据库中存放的格式不一致,比如数据库字段内容为2012082616:00:00,但是页面显示的却是Aug.26,2012,4p.m.答:为了页面和数据库中显示一致,需要在页面格式化时间,需要添加<td{{dayrecord.p\_time|date:
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
Hibernate反射DAO模式
在持久层框架中,如果我们要像简单的JDBC连接数据库那样写一个通用的Dao方法的话,那么把JDBC简单的业务逻辑搬到hibernate持久层框架中,当然是不可能的,这里主要的问题就在于hibernate持久层框架中,因为它不是像JDBC那样简单的增删改查的编写,而是要针对实体类映射配置文件来对照数据库表字段进行操作,而且操作是面向对象的查询,不是简单的sql
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这