功能介绍:根据现有的类生成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(); } } } }