• 根据现有的类生成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();
                }  
            }  
        }
    }
  • 相关阅读:
    githubz在add ssh key报错 Key is invalid. Ensure you've copied the file correctly 解决办法
    iOS 更改状态栏颜色
    iOS 加载图片选择imageNamed 方法还是 imageWithContentsOfFile?
    iOS UIWebView加载网页、文件、HTML
    XXX is undefine,全局搜索却只得到一个结果
    接口调用报错,全局搜索却找不到?vscode vue
    elementui下拉框选择一次以后再选,多项被选中的情况
    VUE+ elementui 表单rules validator 邮箱验证、电话号码验证、身份证验证、账号验证
    JS 验证input内容框 Demo(复制可测试)
    Vscode setting.json个人设置(包含保存格式化,空格、换行,标点符号自动增删)
  • 原文地址:https://www.cnblogs.com/jsbk/p/9869509.html
Copyright © 2020-2023  润新知