今天给大家带来的是关于Java的相关知识,文章围绕着如何用Java实现一个简单的代码生成器展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
前言
逆向工程从数据库表直接生成代码,是日常开发中常用的敏捷开发手段,常见的例如:mybatis-plus的代码生成器等
为什么要自己写代码生成器呢?MP的生成器不香吗?香!
但是自己写的工具用起来最顺手,可以随意扩展,想怎么玩就怎么玩,只要自己有想法,玩出花来都没问题来源[email protected]搞@^&代*@码网,当然了,能力有限,现在还只能实现简单版本,更多骚操作自己发挥!
思路:
1、建立jdbc连接,执行查询sql,获取表结构信息。
2、在指定的路径上创建文件。
3、按照我们的布局排版要求,根据表结构信息拼接文件的内容。
4、将字符输出到文件中。
以上即可完成一个文件的自动生成
编码
通用部分
几个内部工具类
file工具类:创建、读取文件
字符串工具类:驼峰标识、下划线互转,首字母大写,数据库字段类型转java类型等
jdbc连接:连接数据库
表注释、表结构信息实体类、执行sql获取表结构信息的方法
表结构信息
private String columnName;//字段名 private String dataType;//字段类型 private String columnComment;//字段注释 private String columnKey;//主键 private String extra;//主键类型
mysql查询表注释、表字段信息使用的是
表字段信息
SELECT column_name, data_type, column_comment, column_key, extra FROM information_schema.COLUMNS WHERE table_schema = ( SELECT DATABASE ()) AND table_name =?
表注释
SELECT table_comment FROM information_schema.TABLES WHERE table_schema = ( SELECT DATABASE ()) AND table_name =?
需要支持其他数据库类型的,自己调整就好了,例如oracle获取表注释、表结构sql如下:
-- 表、表注释 SELECT t.table_name, t1.comments FROM user_tables t JOIN user_tab_comments t1 ON t.table_name = t1.table_name; -- 表字段、字段注释 SELECT t.table_name, c.column_name, c.data_type, cc.comments FROM USER_TAB_COLUMNS c JOIN user_tables t ON c.table_name = t.table_name JOIN user_col_comments cc ON cc.table_name = t.table_name WHERE cc.column_name = c.column_name;
另外,数据连接、基础路径的配置也是一样
/** * 数据连接相关,需要手动设置 */ private static final String URL = "jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8&characterEncoding=utf-8"; private static final String USERNAME = "root"; private static final String PASSWORD = "123456"; private static final String DRIVER_CLASSNAME = "com.mysql.cj.jdbc.Driver"; /** * 基础路径,需要手动设置 */ private String basePackage = "cn\\huanzi\\qch\\baseadmin\\";//根包位置 private String filePackage = basePackage + "sys\\";//文件所在包位置
2.0版本多一个模板文件路径
private String tlfPath = System.getProperty("user.dir") + "\\src\\main\\resources\\tlf\\";//模板文件位置
main函数也一样,调用构造参数,传入表名,调用入口函数
public static void main(String[] args) { // String[] tables = {"sys_user","sys_menu","sys_authority","sys_user_menu","sys_user_authority","sys_shortcut_menu","sys_setting"}; String[] tables = {"tb_user"}; for (String table : tables) { String msg = new AutoGenerator(table).create(); System.out.println(msg); } }
V1.0版本
AutoGenerator,1.0版本采用原始的在代码拼接字符串,然后创建文件将字符串输出的方法,比较原始但个人觉得可玩性较高
几个创建方法,就拿实体类来举例
/** * 创建pojo实体类 */ private void createPojo(List tableInfos) { //创建文件 File file = FileUtil.createFile(filePath + "pojo\\" + StringUtil.captureName(StringUtil.camelCaseName(tableName)) + ".java"); //拼接文件内容 StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append( "package " + filePackage.replaceAll("\\\\", ".") + "pojo;\n" + "\n" + "import lombok.Data;\n" + "import javax.persistence.*;\n" + "import java.io.Serializable;\n" + "import java.util.Date;\n" + "\n" + "@Entity\n" + "@Table(name = \"" + tableName + "\")\n" + "@Data\n" + "public class " + StringUtil.captureName(StringUtil.camelCaseName(tableName)) + " implements Serializable {\n" ); //遍历设置属性 for (TableInfo tableInfo : tableInfos) { //主键 if ("PRI".equals(tableInfo.getColumnKey())) { stringBuffer.append(" @Id\n"); } //自增 if ("auto_increment".equals(tableInfo.getExtra())) { stringBuffer.append(" @GeneratedValue(strategy= GenerationType.IDENTITY)\n"); } stringBuffer.append(" private ").append(StringUtil.typeMapping(tableInfo.getDataType())).append(" ").append(StringUtil.camelCaseName(tableInfo.getColumnName())).append(";//").append(tableInfo.getColumnComment()).append("\n\n"); } stringBuffer.append("}"); //写入文件内容 FileUtil.fileWriter(file, stringBuffer); }
其他的也一样,无非就:创建文件、拼接文件内容、输出文件内容
入口函数,供main函数直接调用
/** * 快速创建,供外部调用,调用之前先设置一下项目的基础路径 */ private String create() { System.out.println("生成路径位置:" + filePath); //获取表信息 List tableInfo = getTableInfo(); //开始生成代码 createPojo(tableInfo); createVo(tableInfo); createRepository(tableInfo)以上就是教你用Java实现一个简单的代码生成器的详细内容,更多请关注gaodaima搞代码网其它相关文章!