根据现有的类生成sql语句

功能介绍:根据现有的类生成sql 语句

适应范围:已知很多类,生成对应sql语句 (很少类,自己建更好一些),一个类字段过多也可以用这个方法

缺点:不能很好的对应java 中数据类型和数据库数据类型

缺点处理:所有类生成 类型为varchar(?)  ,然后再手动更改,让sql 语句符合需求

原理:文件读取,字符串的拼接(和自动生成代码类似)

参考文档:https://blog.csdn.net/ly690226302/article/details/79920319

引用:

SqlGenerator类中generateSql 自己修改sql 语句,使得符合自己项目

测试生成类:

public class tast {
    
    public static void main(String[] args) {
                                                //实体类po所在的绝对路径    
         List<String> s=SqlGenerator.getAllClasses("H:\eclipse-workspace\JSYYHJ\src\com\saiji\po");
         
         //System.out.println(s);
          for (String className : s) {
            //System.out.println(className);  
            //. 必须转译
            String[] ss=className.split("\.");
            //判断防止空指针和xml    
            if(ss.length==2&&(!ss[1].equals("xml"))) {
            String str= SqlGenerator.generateSql("com.saiji.po."+ss[0]);
            
            System.out.println(str);
            
            SqlGenerator.StringToSql(str, "H:/temp/sql");
            
            }
        }
        
        
    }

}

生成的核心代码类:

/**
 * sql自动生成
 * @author 
 * @date 
 */
public class SqlGenerator {
    private static final Logger logger = LoggerFactory.getLogger(SqlGenerator.class);

    /**
     * 根据实体类生成建表语句
     * @author  
     * @date    
     * @param className 全类名  
     */
    public static String generateSql(String className){
        try {
            Class<?> clz = Class.forName(className);
            className = clz.getSimpleName();
            Field[] fields = clz.getDeclaredFields();
            StringBuffer column = new StringBuffer();
            String varchar = " varchar(50)  NULL,";
            for(int i=0;i<fields.length;i++) {
                if(i==0) {
                     column.append(" 
 ["+fields[i].getName()+"]").append("[int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,");
                }else if(i==fields.length-1) {
                     column.append(" 
 ["+fields[i].getName()+"]").append("varchar(50)  NULL");
                }else {
                     column.append(" 
 ["+fields[i].getName()+"]").append(varchar);
                }
            }
            StringBuffer sql = new StringBuffer();
            //sql.append("
 DROP TABLE IF EXISTS ["+className+"]; ")
                sql.append(" 
 CREATE TABLE [dbo].["+className+"] (")
                .append(" 
 "+column)
                .append("
")
                .append(" 
 ); ");
            return sql.toString();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            logger.debug("该类未找到!");
            return null;
        }

    }

    /**
     * 获取包下的所有类名称,获取的结果类似于 XXX.java
     * @author  
     * @date   
     * @param packageName
     * @return
     */
    public static List<String> getAllClasses(String packageName){
        List<String> classList = new ArrayList<String>();
        String className="";
        File f = new File(packageName);
        if(f.exists() && f.isDirectory()){
            File[] files = f.listFiles();
            for (File file : files) {
                 className = file.getName();
                 classList.add(className);
            }
            return classList;
        }else{
            logger.debug("包路径未找到!");
            return null;
        }
    }
    /**
     * 将string 写入sql文件
     * @author  
     * @date   
     * @param str
     * @param path
     */
    public static void StringToSql(String str,String path){
        byte[] sourceByte = str.getBytes();  
        if(null != sourceByte){  
            try {  
                File file = new File(path);     //文件路径(路径+文件名)  
                if (!file.exists()) {   //文件不存在则创建文件,先创建目录  
                    File dir = new File(file.getParent());  
                    dir.mkdirs();  
                    file.createNewFile();  
                }  
                //必须设置为追加写入
                FileOutputStream outStream = new FileOutputStream(file,true);    //文件输出流用于将数据写入文件  
                outStream.write(sourceByte);  
                outStream.flush();
                outStream.close();  //关闭文件输出流  
                System.out.println("生成成功");
            } catch (Exception e) {  
                e.printStackTrace();
            }  
        }  
    }
}
原文地址:https://www.cnblogs.com/jsbk/p/9869509.html