电脑装配网

自定义代码生成器(上)

 人阅读 | 作者yiyi | 时间:2023-07-19 16:56

1 概述

1.1 介绍

在项目开发过程中,有很多业务模块的代码是具有一定规律性的,例如controller控制器、service接口、service实现类、mapper接口、model实体类等等,这部分代码可以使用代码生成器生成,我们就可以将更多的时间放在业务逻辑上。

传统的开发步骤:

创建数据库和表 根据表设计实体类 ​ 编写mapper接口 ​ 编写service接口和实现类 ​ 编写controller控制器 ​ 编写前端页面 ​ 前后端联调

基于代码生成器开发步骤:

创建数据库和表 ​ 使用代码生成器生成实体类、mapper、service、controller、前端页面 ​ 将生成好的代码拷贝到项目中并做调整 ​ 前后端联调

我们只需要知道数据库和表相关信息,就可以结合模版生成各个模块的代码,减少了很多重复工作,也减少出错概率,提高效率。

1.2 实现思路

3 数据库元数据

3.1 介绍

元数据(Metadata)是描述数据的数据。

数据库元数据(DatabaseMetaData)就是指定义数据库各类对象结构的数据。

在mysql中可以通过show关键字获取相关的元数据

show status; 获取数据库的状态show databases; 列出所有数据库show tables; 列出所有表show create database [数据库名]; 获取数据库的定义show create table [数据表名]; 获取数据表的定义show columns from <table_name>; 显示表的结构show index from <table_name>; 显示表中有关索引和索引列的信息show character set; 显示可用的字符集以及其默认整理show collation; 显示每个字符集的整理show variables; 列出数据库中的参数定义值

也可以从 information_schema库中获取元数据,information_schema数据库是MySQL自带的信息数据库,它提供了访问数据库元数据的方式。存着其他数据库的信息。

select schema_name from information_schema.schemata; 列出所有的库select table_name FROM information_schema.tables; 列出所有的表

在代码中可以由JDBC的Connection对象通过getMetaData方法获取而来,主要封装了是对数据库本身的一些整体综合信息,例如数据库的产品名称,数据库的版本号,数据库的URL,是否支持事务等等。

DatabaseMetaData的常用方法:

getDatabaseProductName:获取数据库的产品名称getDatabaseProductName:获取数据库的版本号getUserName:获取数据库的用户名getURL:获取数据库连接的URLgetDriverName:获取数据库的驱动名称driverVersion:获取数据库的驱动版本号isReadOnly:查看数据库是否只允许读操作supportsTransactions:查看数据库是否支持事务

3.2 搭建环境

(1)导入mysql依赖

<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version></dependency>

(2)创建测试用例

package com.itheima.test;import org.junit.Before;import org.junit.Test;import java.sql.*;import java.util.Properties;public class DataBaseMetaDataTest { private Connection conn; @Before public void init() throws Exception { Properties pro = new Properties(); pro.setProperty("user", "root"); pro.setProperty("password", "123456"); pro.put("useInformationSchema", "true");//获取mysql表注释 //pro.setProperty("remarksReporting","true");//获取oracle表注释 conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/?useUnicode=true&characterEncoding=UTF8", pro); } }

3.3 综合信息元数据

(1)获取数据库元信息综合信息

@Testpublic void testDatabaseMetaData() throws SQLException { //获取数据库元数据 DatabaseMetaData dbMetaData = conn.getMetaData(); //获取数据库产品名称 String productName = dbMetaData.getDatabaseProductName(); System.out.println(productName); //获取数据库版本号 String productVersion = dbMetaData.getDatabaseProductVersion(); System.out.println(productVersion); //获取数据库用户名 String userName = dbMetaData.getUserName(); System.out.println(userName); //获取数据库连接URL String userUrl = dbMetaData.getURL(); System.out.println(userUrl); //获取数据库驱动 String driverName = dbMetaData.getDriverName(); System.out.println(driverName); //获取数据库驱动版本号 String driverVersion = dbMetaData.getDriverVersion(); System.out.println(driverVersion); //查看数据库是否允许读操作 boolean isReadOnly = dbMetaData.isReadOnly(); System.out.println(isReadOnly); //查看数据库是否支持事务操作 boolean supportsTransactions = dbMetaData.supportsTransactions(); System.out.println(supportsTransactions);}

(2)获取数据库列表

@Testpublic void testFindAllCatalogs() throws Exception { //获取元数据 DatabaseMetaData metaData = conn.getMetaData(); //获取数据库列表 ResultSet rs = metaData.getCatalogs(); //遍历获取所有数据库表 while (rs.next()) { //打印数据库名称 System.out.println(rs.getString(1)); } //释放资源 rs.close(); conn.close();}

(3)获取某数据库中的所有表信息

@Testpublic void testFindAllTable() throws Exception { //获取元数据 DatabaseMetaData metaData = conn.getMetaData(); //获取所有的数据库表信息 ResultSet rs = metaData.getTables("库名", "%", "%", new String[]{"TABLE"}); //拼装table while (rs.next()) { //所属数据库 System.out.println(rs.getString(1)); //所属schema System.out.println(rs.getString(2)); //表名 System.out.println(rs.getString(3)); //数据库表类型 System.out.println(rs.getString(4)); //数据库表备注 System.out.println(rs.getString(5)); System.out.println("--------------"); }}

(4)获取某张表所有的列信息

@Testpublic void testFindAllColumns() throws Exception { //获取元数据 DatabaseMetaData metaData = conn.getMetaData(); //获取所有的数据库某张表所有列信息 ResultSet rs = metaData.getColumns("库名", "%", "表名","%"); while(rs.next()) { //表名 System.out.println(rs.getString("TABLE_NAME")); //列名 System.out.println(rs.getString("COLUMN_NAME")); //类型码值 System.out.println(rs.getString("DATA_TYPE")); //类型名称 System.out.println(rs.getString("TYPE_NAME")); //列的大小 System.out.println(rs.getString("COLUMN_SIZE")); //小数部分位数,不适用的类型会返回null System.out.println(rs.getString("DECIMAL_DIGITS")); //是否允许使用null System.out.println(rs.getString("NULLABLE")); //列的注释信息 System.out.println(rs.getString("REMARKS")); //默认值 System.out.println(rs.getString("COLUMN_DEF")); //是否自增 System.out.println(rs.getString("IS_AUTOINCREMENT")); //表中的列的索引(从 1 开始 System.out.println(rs.getString("ORDINAL_POSITION")); System.out.println("--------------"); }}

3.4 参数元数据

参数元数据(ParameterMetaData):是由PreparedStatement对象通过getParameterMetaData方法获取而 来,主要是针对PreparedStatement对象和其预编译的SQL命令语句提供一些信息,ParameterMetaData能提供占位符参数的个数,获取指定位置占位符的SQL类型等等 以下有一些关于ParameterMetaData的常用方法:

getParameterCount:获取预编译SQL语句中占位符参数的个数@Testpublic void testParameterMetaData() throws Exception { String sql = "select * from health.t_checkgroup where id=? and code=?"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, "7"); pstmt.setString(2, "0003"); //获取ParameterMetaData对象 ParameterMetaData paramMetaData = pstmt.getParameterMetaData(); //获取参数个数 int paramCount = paramMetaData.getParameterCount(); System.out.println(paramCount);}

3.5 结果集元数据

结果集元数据(ResultSetMetaData):是由ResultSet对象通过getMetaData方法获取而来,主要是针对由数据库执行的SQL脚本命令获取的结果集对象ResultSet中提供的一些信息,比如结果集中的列数、指定列的名称、指 定列的SQL类型等等,可以说这个是对于框架来说非常重要的一个对象。 以下有一些关于ResultSetMetaData的常用方法:

getColumnCount:获取结果集中列项目的个数getColumnType:获取指定列的SQL类型对应于Java中Types类的字段getColumnTypeName:获取指定列的SQL类型getClassName:获取指定列SQL类型对应于Java中的类型(包名加类名@Testpublic void testResultSetMetaData() throws Exception { String sql = "select * from health.t_checkgroup where id=?"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, "7"); //执行sql语句 ResultSet rs = pstmt.executeQuery(); //获取ResultSetMetaData对象 ResultSetMetaData metaData = rs.getMetaData(); //获取查询字段数量 int columnCount = metaData.getColumnCount(); System.out.println("字段总数量:"+ columnCount); for (int i = 1; i <= columnCount; i++) { //获取表名称 System.out.println(metaData.getColumnName(i)); //获取java类型 System.out.println(metaData.getColumnClassName(i)); //获取sql类型 System.out.println(metaData.getColumnTypeName(i)); System.out.println("----------"); }}

4 代码生成器环境搭建

4.1 创建maven工程

创建maven工程并导入以下依赖

<properties> <java.version>11</java.version> <!-- 项目源码及编译输出的编码 --> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <!-- 项目编译JDK版本 --> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target></properties><dependencies> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.23</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.8</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.10</version> </dependency></dependencies>

目录结构如下


文章标签:

本文链接:『转载请注明出处』