MySql之自动生成CRUD代码

MyBatis能够通过获取MySql中的information_schema从而获取表的字段等信息,最后通过这些信息生成代码。

笔者受此启发,将MyBatis-Generator中的核心结构体剥离出来,写成了能自动生成简单CRUD的工具。

自动生成代码原理图

information_schema

mysql本身存在一个information_schema,记录了所有的元数据信息,主要的几个有:

schema表:当前mysql实例中所有数据库的信息。

COLUMNS表:关联了所有表和其中列的信息。

TABLES表:提供了关于数据库中的表的信息。

......

jdbc中的MetaData

jdbc提供了非常方便的工具帮助我们获取这些元数据信息,就是MetaData。获取MetaData的代码如下:

Connection connection = getConnection();

DatabaseMetaData metaData = connection.getMetaData();

metaData获取一张表中的所有字段

通过metaData.getColumns方法在指定了schema和table后可以很方便的获取一张表中的所有字段,代码如下:

private void caculateColumns(DatabaseMetaData metaData) {

ResultSet rs = null;

try {

rs = metaData.getColumns("", introspectedTable.getIntrospectedSchema(),

introspectedTable.getIntrospectedTableName(), null);

while (rs.next()) {

IntrospectedColumn introspectedColumn = new IntrospectedColumn();

introspectedColumn.setJdbcType(rs.getInt("DATA_TYPE")); //$NON-NLS-1$

introspectedColumn.setLength(rs.getInt("COLUMN_SIZE")); //$NON-NLS-1$

introspectedColumn.setActualColumnName(rs.getString("COLUMN_NAME")); //$NON-NLS-1$

introspectedColumn.setNullable(rs.getInt("NULLABLE") == DatabaseMetaData.columnNullable); //$NON-NLS-1$

introspectedColumn.setScale(rs.getInt("DECIMAL_DIGITS")); //$NON-NLS-1$

introspectedColumn.setRemarks(rs.getString("REMARKS")); //$NON-NLS-1$

introspectedColumn.setDefaultValue(rs.getString("COLUMN_DEF")); //$NON-NLS-1$

} catch (SQLException e) {

e.printStackTrace();

}

}

metaData获取表中的主键

同样的通过getPrimaryKeys可以很轻松的计算其主键,注意主键可能是联合主键: 对应的代码如下:

ResultSet rs = null;

String cataLog;

try {

rs = metaData.getPrimaryKeys("", introspectedTable.getIntrospectedSchema(),

introspectedTable.getIntrospectedTableName());

Map keyColumns = new TreeMap();

while (rs.next()) {

String columnName = rs.getString("COLUMN_NAME");

short keySeq = rs.getShort("KEY_SEQ");

keyColumns.put(keySeq, columnName);

}

for (String columnName : keyColumns.values()) {

introspectedTable.addPrimaryKeyColumn(columnName);

}

} catch (SQLException e) {

e.printStackTrace();

System.exit(1);

} finally {

closeResultSet(rs);

}

将meta信息组织成结构体

有了上面的信息我们就可以将一张表中的所有信息用java结构体表现出来:

Table表Java结构体:

public class IntrospectedTable {

protected List primaryKeyColumns;

protected List baseColumns;

protected List blobColumns;

protected String introspectedSchema;

private String introspectedCatalog;

private String introspectedTableName;

字段表Java结构体属性过多,在此不一一赘述,详情请见github

Velocity渲染:

有了上述的元数据结构体后,就可以用Velocity渲染,例如如下的Velocity模板:

public ${name} get${name}(${primaryType} ${primaryKey}) {

return mapper.selectByPrimaryKey(${primaryKey});

}

就会被渲染成(假设primaryKey是id,tableName是Archer,appname是codegen):

package com.alchemystar.codegen.dal.dao.auto;

import com.alchemystar.codegen.dal.mapper.auto.ArcherMapper;

public class AutoArcherDao {

public Archer getArcher(Long id) {

return mapper.selectByPrimaryKey(id);

}

}

如法炮制,就可以通过元数据信息生成不同的方法。从而生成想要的代码。

github链接

原文链接

mysql中怎样自动生成代码_MySql之自动生成CRUD代码相关推荐

  1. mysql中随机16位数字_MySQL 生成随机数字、字符串、日期、验证码及 UUID的方法

    上一篇介绍了如何在 Oracle 生成随机数字.字符串.日期.验证码以及 UUID,今天我们继续讨论在 MySQL 中生成各种随机数据的方法.

  2. mysql中更新的命令是_MySQL 语言中,更新表数据的命令是( )。_学小易找答案

    [简答题]MySQL 语言中包含数都定义语言.数据操纵语言和数据控制语言,分别有哪些功能? [单选题]查询员工工资信息时,结果按工资降序排列,正确的是( ). [简答题]arrayList测验 [填空 ...

  3. mysql中需要提交的操作_MySQL常用操作及基础知识

    原标题:MySQL常用操作及基础知识 1.启动和关闭mysql服务器: service mysql start service mysql stop 2.重启MySQL服务: service mysq ...

  4. mysql中调用多个表_MySQL 多表查询

    文章转载的:http://www.cnblogs.com/BeginMan/p/3754322.html 一.多表查询方法分类 1.交叉连接查询(得到的是两个表的乘积,类似于矩阵乘积) select ...

  5. mysql中select是什么意思_MYSQL中select的是详解

    数据表都已经创建起来了,假设我们已经插入了许多的数据,我们就可以用自己喜欢的方式对数据表里面的信息进行检索和显示了,比如说:可以象下面这样把整个数据表内的内容都显示出来 select * from p ...

  6. mysql 修改自动递增值_MySql数据库自动递增值问题

    ?Create TABLE test(idINT UNSIGNEDNOT NULL PrimaRY KEY AUTO_INCREMENT,usernameVARCHAR(15)NOT NULL)AUT ...

  7. mysql中的外键约束_MySQL外键约束

    在本教程中,您将了解MySQL外键(foreign key)以及如何在MySQL中创建,添加和删除外键约束. MySQL外键简介 外键表示一个表中的一个字段被另一个表中的一个字段引用.外键对相关表中的 ...

  8. MYSQL中RAND子句的使用_mysql优化--rand()优化

    众所周知,在mysql中,随机的取10条数据,如:select * from users order by rand() limit 10,效果非常差,因为会多次的执行,如果等值查询用rand()也是 ...

  9. mysql中怎么查询单行单列_MySql中的子查询-结果单行单列

    MySQL是开源免费和功能多面的小型数据库,MySQL也是目前流行通用的关系型数据库,已经被 Oracle 收购了.随着版本更新升级,加入一些高级功能,MySQL6.x 版本也开始收费.不过本教程将使 ...

最新文章

  1. php 引入其他文件中的变量
  2. 海量数据处理利器之Hash——在线邮件地址过滤
  3. 中小型企业VMware服务器虚拟化实用案例
  4. FFmpeg音视频入门-使用FFmpeg读取多媒体文件的信息C++代码实现+详解
  5. “在解决方案中的一个或多个项目由于以下原因未能加载 项目文件或网站已移动或重新命名,或者不在您的计算机上” 的解决办法...
  6. 这是一名既能打比赛,又会发论文JD AI实验室的算法工程师,CSDN博客专家
  7. python tkinter 弹窗_tkinter主窗口和子窗口同时弹出该怎么办?
  8. 您没有足够的全新为该计算机所有用户安装,我用的是admin管理员身份可安装软件弹出你没有足够的权限为该计算机所有用户完成此安装.请以管理员的身份登...
  9. spring boot 中@Mapper和@Repository的区别
  10. Linux系统电脑非正常关机之后可能出现在登录界面循环的情况
  11. 2017/09/01-2017/09/30工作日志(补)
  12. Python零基础入门(四)——Python面向对象编程[学习笔记]
  13. 非参数检验统计量分析
  14. VOS2009_2.1.2.0的安装教程
  15. 计算机怎么发音乐,网易云音乐怎么分享音乐给别人的教程
  16. 电子学会2022年9月青少年软件编程(图形化)等级考试试卷(三级)答案解析
  17. 如何卸载腾讯云的云服务器主机安全云镜监控程序
  18. VC浏览器相关的学习(三)(解决IE8无法断点调试)
  19. 进入ubuntu进入系统时忘记密码了怎么办
  20. 【开篇】有志者立志长

热门文章

  1. 然并卵,苹果还是那个掉队的巨头
  2. AJAX,JSON,GSON
  3. 现货!《PHP7实践指南:o2o网站与App后台开发》京东天猫有售
  4. MySql类似Oracle的dual虚拟表
  5. KVM的概念和云计算
  6. HTML5基本知识小测验
  7. 最简单的嵌套循环,一句话即可。适合repeater,dropdownlist,gridview等等
  8. Spring小学习小结2
  9. sql入门基础知识分享
  10. 创建外网 ext_net - 每天5分钟玩转 OpenStack(104)