原文地址:  https://www.cnblogs.com/Jeffscnblog/p/10072483.html

一般上,我们会使用数据库表转换为javabean、dao、或是mapper,就叫逆向工程。做项目时一般也是先设计数据库,再进行系统开发,所以一般使用逆向工程。

但我这边由于工作临时的需要,需要将javabean转换为建表语句和Mybatis的Mapper文件,于是上网搜了一下,大部分是做一个工具类进行bean解析输出的。

根据自身项目命名设计要求,将javabean小驼峰命名法转换为数据库表字段下划线命名法,简化一个例子如下,供参考

package com.util;
import java.io.IOException;
import java.lang.reflect.Field; /**
* Created by Jeff on 2018/12/5.
*/
public class GenerateSqlMapperUtil {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
generateSqlMapper(com.entity.Test.class, null);
} public static void generateSqlMapper(Class obj,String tableName) throws IOException{
Field[] fields = obj.getDeclaredFields();
String param = null;
String cameCaseColumn = null;
String underScoreCaseColumn = null;
StringBuilder sql = new StringBuilder();
if(tableName==null||tableName.equals("")){
// 未传表明默认用类名
tableName = obj.getName().substring(obj.getName().lastIndexOf(".")+1);
}
/**
* 以下部分生成建表Sql
*/
sql.append("drop table if exists ").append(tableName).append(";\r\n");
sql.append("create table ").append(tableName).append("( \r\n");
boolean firstId = true;
for(Field f : fields){
cameCaseColumn = f.getName();
underScoreCaseColumn = cameCaseColumn;
for(int i = 0; i < cameCaseColumn.length(); i++)
if(Character.isUpperCase(cameCaseColumn.charAt(i)))
// 将javabean中小驼峰命名变量的“大写字母”转换为“_小写字母”
underScoreCaseColumn = cameCaseColumn.substring(0, i) + '_' + cameCaseColumn.substring(i, i+1).toLowerCase() + cameCaseColumn.substring(i+1, cameCaseColumn.length());
sql.append(underScoreCaseColumn).append(" ");
param = f.getType().getTypeName();
if(param.equals("java.lang.Integer")){
sql.append("INTEGER");
}else{
// 根据需要自行修改
sql.append("VARCHAR(20)");
}
if(firstId){
// 默认第一个字段为ID主键
sql.append(" PRIMARY KEY AUTO_INCREMENT");
firstId = false;
}
sql.append(",\n");
}
sql.delete(sql.lastIndexOf(","), sql.length()).append("\n)ENGINE=INNODB DEFAULT CHARSET=UTF8 AUTO_INCREMENT=1;\r\n");
System.out.println(sql);
/**
* 以下部分生成Mapper
*/
firstId = true;
StringBuilder mapper = new StringBuilder();
StringBuilder resultMap = new StringBuilder();
StringBuilder insert = new StringBuilder();
StringBuilder insertValues = new StringBuilder();
StringBuilder update = new StringBuilder();
StringBuilder updateWhere = new StringBuilder();
StringBuilder delete = new StringBuilder();
StringBuilder deleteWhere = new StringBuilder();
mapper.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
mapper.append("<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\r\n");
mapper.append("<mapper namespace=\"com..mapper.").append(tableName).append("Mapper\">\r\n");
resultMap.append(" <resultMap id=\"Base").append(tableName).append("\" type=\"").append(obj.getName()).append("\">\r\n");
insert.append(" <insert id=\"save").append(tableName).append("\" parameterType=\"").append(obj.getName()).append("\">\r\n");
insert.append(" INSERT INTO ").append(tableName.toLowerCase()).append(" (");
update.append(" <update id=\"update").append(tableName).append("\" parameterType=\"").append(obj.getName()).append("\">\r\n");
update.append(" UPDATE ").append(tableName.toLowerCase()).append(" SET ");
delete.append(" <delete id=\"delete").append(tableName).append("\" parameterType=\"int\">\r\n");
delete.append(" DELETE FROM ").append(tableName.toLowerCase());
for(Field f : fields){
cameCaseColumn = f.getName();
underScoreCaseColumn = cameCaseColumn;
for(int i = 0; i < cameCaseColumn.length(); i++)
if(Character.isUpperCase(cameCaseColumn.charAt(i)))
// 将javabean中小驼峰命名变量的“大写字母”转换为“_小写字母”
underScoreCaseColumn = cameCaseColumn.substring(0, i) + '_' + cameCaseColumn.substring(i, i+1).toLowerCase() + cameCaseColumn.substring(i+1, cameCaseColumn.length());
resultMap.append(" ");
if(firstId){
resultMap.append("<id column=\"").append(underScoreCaseColumn).append("\" property=\"").append(cameCaseColumn).append("\" jdbcType=\"");
updateWhere.append(" WHERE ").append(underScoreCaseColumn).append(" = #{").append(cameCaseColumn).append("}\r\n");
deleteWhere.append(" WHERE ").append(underScoreCaseColumn).append(" = #{").append(cameCaseColumn).append("}\r\n");
firstId = false;
} else {
resultMap.append("<result column=\"").append(underScoreCaseColumn).append("\" property=\"").append(cameCaseColumn).append("\" jdbcType=\"");
insert.append(underScoreCaseColumn).append(", ");
insertValues.append("#{").append(cameCaseColumn).append("},");
update.append(underScoreCaseColumn).append(" = #{").append(cameCaseColumn).append("}, ");
}
param = f.getType().getTypeName();
if(param.equals("java.lang.Integer")){
resultMap.append("INTEGER\" />\r\n");
}else{
// 根据需要自行修改
resultMap.append("VARCHAR\" />\r\n");
}
}
resultMap.append(" </resultMap>\r\n");
insert.delete(insert.lastIndexOf(","), insert.length()).append(")\r\n");
insertValues.delete(insertValues.lastIndexOf(","), insertValues.length());
insert.append(" VALUES (");
insert.append(insertValues).append(")\r\n");
insert.append(" </insert>\r\n");
update.delete(update.lastIndexOf(","), update.length()).append("\r\n");
update.append(updateWhere);
update.append(" </update>\r\n");
delete.append(deleteWhere);
delete.append(" </delete>\r\n");
mapper.append(resultMap).append(insert).append(update).append(delete);
mapper.append("</mapper>");
System.out.println(mapper);
}
}

  

根据javabean转换为mysql建表语句与mapper内容的更多相关文章

  1. 基于表的数据字典构造MySQL建表语句

    表的数据字典格式如下: 如果手动写MySQL建表语句,确认麻烦,还不能保证书写一定正确. 写了个Perl脚本,可快速构造MySQL脚本语句. 脚本如下: #!/usr/bin/perl use str ...

  2. MySQL 建表语句 create table 中的列定义

    MySQL 建表语句 create table 中的列定义: column_definition: data_type [NOT NULL | NULL] [DEFAULT default_value ...

  3. 三种常用的MySQL建表语句

    MySQL建表语句是最基础的SQL语句之一,下面就为您介绍最常用的三种MySQL建表语句,如果您对MySQL建表语句方面感兴趣的话,不妨一看. 1.最简单的: CREATE TABLE t1(    ...

  4. 脚本工具---自动解析mysql建表语句,生成sqlalchemy表对象声明

    常规建表语句: CREATE TABLE `test_table` ( `id` int(11) NOT NULL, `name` char(64) NOT NULL, `password` char ...

  5. mysql 建表语句

    修改id为自动增长: alter table book b_ISBN int(11) auto_increment;   自动增长要加的:auto_increment 基本的sql语句: 选择:sel ...

  6. Mysql建表语句

    create table messages( id int unsigned primary key auto_increment, sender varchar(64) not null, gett ...

  7. mysql建表语句key的含义

    CREATE TABLE `admin_role` (  `adminSet_id` varchar(32) NOT NULL,  `roleSet_id` varchar(32) NOT NULL, ...

  8. 一则 Mysql 建表语句

    DROP TABLE IF EXISTS `nuvue`; CREATE TABLE `nuvue`( `id` ) UNSIGNED NOT NULL AUTO_INCREMENT, `status ...

  9. MySQL建表、插入语句等

    不定时更新MySQL的一些基础语句以及出现过的问题 5.10 建表语句 CREATE TABLE `policy_landvalue` ( `id` ) NOT NULL AUTO_INCREMENT ...

随机推荐

  1. JMeter命令行参数汇总

    jmeter.properties文件,默认是使用JMETER_HOME/bin目录下的jmeter.properties,如果用户自定义有其它的配置,在这里加上   #用法如下: -p user.p ...

  2. flink--DateSet开发--简单入门

    开发流程 1. 获得一个execution environment, 2. 加载/创建初始数据, 3. 指定这些数据的转换, 4. 指定将计算结果放在哪里, 5. 触发程序执行 例子: object ...

  3. mariadb-半同步复制

    半同步复制: 使用插件 对于从节点,有一部分为同步复制,当主节点复制完从节点后才向客户返回ok,同步超时后自动降级为异步 有一部分为异步复制 这样为了与主节点冗余 基于主从的模式上搭建 半同步复制: ...

  4. 移动端iscroll实现日期选择

    哎,说多了都是泪: 引入相关JS文件 <script type="text/javascript" src="js/jquery-1.9.1.min.js" ...

  5. 普林斯顿微积分读本 大纲与重点 (by zzd)

    普林斯顿微积分读本 大纲重点 由于博客园太菜,所以我用图片上传. 当前更新状态:未完待续,挖坑暂时不填了. UPD(2018-07-08): 稍微更一下,加一个本书的某一版本下载链接:https:// ...

  6. BZOJ3295 [Cqoi2011]动态逆序对 分治 树状数组

    原文链接http://www.cnblogs.com/zhouzhendong/p/8678185.html 题目传送门 - BZOJ3295 题意 对于序列$A$,它的逆序对数定义为满足$i< ...

  7. Vijos1755 靶形数独 Sudoku NOIP2009 提高组 T4 舞蹈链 DLX

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目(传送门) 题意概括 给出一个残缺的数独,求这个数独中所有的解法中的最大价值. 一个数独解法的价值之和为每个位置所填的数值 ...

  8. 3dsmax不同版本 pyside qt UI 设置max窗口为父窗口的方法

    3dsmax不同版本 pyside qt widget 设置 max 窗口为父窗口的方法 前言: 3dsmax 在 2014 extension 之后开始集成 Python 和 PySide,但是在版 ...

  9. 6491: Daydream

    题目描述 You are given a string S consisting of lowercase English letters. Another string T is initially ...

  10. 色彩空间-- RGB\HSV

    颜色空间 标签(空格分隔): 计算机视觉 颜色通常用三个独立的属性来描述,三个独立变量综合作用,自然就构成一个空间坐标,这就是颜色空间. RGB和CMY颜色模型都是面向硬件的,而HSV(Hue Sat ...