前言
写博客是为了记录和分享自己的学习,所分享内容是网上的资源,由于非原创项目,主要分享学习思路,只贴图部分代码(本人不分享本项目源码,支持项目付费)
一、逆向读取配置文件application.properties
这段代码的主要功能是从名为 “application.properties” 的配置文件中读取键值对,并将其存储在一个ConcurrentHashMap中,以便后续能够通过给定的键快速获取对应的值。
1.首先定义了两个静态变量:
- props是一个Properties对象,用于加载和存储属性文件中的键值对。
- PROPER_MAP是一个ConcurrentHashMap,用于以更方便的方式存储和检索属性值。
2.在静态代码块中:
- 尝试从类加载器中获取 “application.properties” 文件的输入流。
- 如果成功获取输入流,则使用props.load(is)加载属性文件中的键值对。
- 接着,使用迭代器遍历props中的所有键,将每个键值对存入PROPER_MAP中。
- 最后,在finally块中,确保输入流被正确关闭,防止资源泄漏。
3.定义了一个公共静态方法get(String key),用于根据给定的键从PROPER_MAP中获取对应的值。
二、通过配置文件连接到数据库
这段代码的主要功能是在类加载时建立与数据库的连接,并提供了一些用于查询数据库表信息的 SQL 语句和日志记录功能。
1.定义了静态变量:
- conn是一个Connection对象,用于表示数据库连接。
- logger是一个日志记录器,用于记录错误信息。
- 定义了三个静态的字符串常量,分别用于查询表状态、表字段和表索引的 SQL 语句。
2.在静态代码块中:
- 从配置文件中获取数据库驱动名、连接 URL、用户名和密码。
- 使用Class.forName()加载数据库驱动。
- 通过DriverManager.getConnection()建立数据库连接。如果连接失败,会记录错误日志。
三、读取数据库表的基本信息
这个方法的主要功能是获取数据库中所有表的信息,并将其封装成TableInfo对象的列表。它通过执行show table status SQL 语句获取表的基本信息,然后进一步获取每个表的字段信息和索引信息,并将这些信息封装到TableInfo对象中。
1.首先定义了一个PreparedStatement对象和一个ResultSet对象,用于执行 SQL 查询并获取结果集。还定义了一个List用于存储查询到的表信息。
2.在try块中:
- 准备并执行show table status SQL 查询,获取结果集。
- 遍历结果集,从每一行中获取表名、注释等信息,并根据一些规则处理表名生成 bean 名称。
- 创建TableInfo对象,设置表名、bean 名称、注释等属性。
- 调用readFieldInfo方法读取表的字段信息并设置到TableInfo对象中。
- 调用getKeyIndexInfo方法获取表的索引信息并设置到TableInfo对象中。
- 打印每个TableInfo对象的 JSON 表示形式。
3.在finally块中:关闭结果集、预处理语句和数据库连接,以防止资源泄漏。
4.最后返回存储表信息的列表。
四、读取数据库表字段
这个方法用于读取指定表的字段信息,并将其封装到FieldInfo对象中,然后添加到给定的TableInfo对象的字段信息列表中。同时,它还会根据字段的类型设置TableInfo对象中的一些标志位,用于表示表中是否包含特定类型的字段(如日期时间类型、日期类型、大数字类型等)。
1.定义了一个PreparedStatement对象和一个ResultSet对象,用于执行 SQL 查询并获取结果集。还定义了一个List< FieldInfo >用于存储字段信息。
2.在try块中:
- 使用给定的表名格式化SQL_SHOW_TABLE_FIELDS SQL 语句,准备并执行查询。
- 遍历结果集,从每一行中获取字段名、类型、注释和额外属性等信息。
- 处理字段类型字符串,去除括号及里面的内容(如果存在)。
- 生成属性名。
- 创建FieldInfo对象,设置字段名、SQL 类型、注释、是否自增、属性名和 Java 类型等属性。
- 将FieldInfo对象添加到列表中。
- 根据字段类型判断表中是否包含特定类型的字段,并设置相应的标志位在TableInfo对象中。
- 将字段信息列表设置到TableInfo对象中。
3.在finally块中:关闭结果集和预处理语句,防止资源泄漏。
五、读取数据库表索引
这个方法用于获取指定表的关键索引信息,并将其存储在TableInfo对象中。它通过执行格式化后的show index from %s SQL 语句,遍历结果集,筛选出非唯一索引(non_unique值为 1 的被跳过),然后根据索引名和列名找到对应的FieldInfo对象,并将其添加到TableInfo对象的keyIndexMap中对应的索引列表中。最后返回一个包含索引相关FieldInfo的列表,但这个列表在方法中并没有被实际使用。
1.定义了一个PreparedStatement对象和一个ResultSet对象,用于执行 SQL 查询并获取结果集。
2.在try块中:
- 使用给定的表名格式化 SQL 查询语句,准备并执行查询。
- 遍历结果集,获取索引名、是否唯一、列名等信息。
- 如果索引不是唯一索引,则跳过。
- 根据索引名从TableInfo对象的keyIndexMap中获取对应的索引字段列表,如果不存在则创建一个新的列表并放入keyIndexMap。
- 遍历表的字段信息列表,找到与当前索引列名匹配的FieldInfo对象,并添加到索引字段列表中。
3.在finally块中:关闭结果集和预处理语句,防止资源泄漏。
六、个人总结
这三条sql语句非常重要,是java代码生成工具的核心,所有关于表的操作都是基于这三句
show table status
show full fields from %s
show index from %s
1.show table status
:
- 这个语句用于显示数据库中每个表的状态信息。
- 它可以提供关于表的名称、引擎类型、行数、数据长度、索引长度、创建时间、更新时间等详细信息。这对于了解数据库中表的整体情况非常有用。
2.show full fields from %s
:
- 这个语句用于显示指定表的所有字段的详细信息。
- 通过格式化字符串中的占位符%s,可以在运行时指定具体的表名。
它会返回字段名、字段类型、是否允许为空、默认值、额外的属性(如自增属性等)以及字段的注释等信息。
3.show index from %s
:
- 这个语句用于显示指定表的索引信息。
- 同样,通过占位符%s可以指定要查询的表名。它会返回索引的名称、索引类型(如主键索引、唯一索引、普通索引等)、包含的字段以及索引的其他属性。
如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!