原文地址:  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. 0day漏洞

    0Day的概念最早用于软件和游戏破解,属于非盈利性和非商业化的组织行为,其基本内涵是“即时性”. Warez被许多人误认为是一个最大的软件破解组 织,而实际上,Warez如黑客一样,只是一种行为. 0 ...

  2. 实际生产用法CMS和G1

    java -Xms100m -Xmx100m -Xmn50m -XX:MetaspaceSize=20m -XX:MaxMetaspaceSize=20m -XX:+UseConcMarkSweepG ...

  3. 初识(试)LoadRunner

    一.安装和破解 1.傻瓜式安装.[注意:最好不要默认路径安装,因为64位的win7系统安装LR11时,会默认安装到“Program files (x86)”的目录中,该目录名称有空格,会导致录制“We ...

  4. PAT (Basic Level) Practise - 我要通过!

    “答案正确”是自动判题系统给出的最令人欢喜的回复.本题属于PAT的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”. 得到“答案正确”的条件是: 1 ...

  5. day 58 bootstrap -part1

    我们的bootstrap主要使用都是官网里面的内容,官网里面的都整理得很完备,有需要的时候就直接去里面找即可, 关于这个bootstrap,我所理解的就是,我们前面所学的那些,从html开始一直到后面 ...

  6. vee-validate校验demo

    //太长了,把异步校验放到前面吧: VeeValidate.Validator.extend('checkLoginName',{ getMessage:function () { return &q ...

  7. 基于Docker的服务器搭建

    -----------基于Docker的多种服务器搭建----------- 开发环境 本机上的虚拟机 Centos7.4 Docker1.13.1 Openssl1.1.1 1 Nginx 1.1 ...

  8. 实现左边div固定宽度,右边div自适应撑满剩下的宽度的布局方式:

    html: <div class="container"> <div class="left"> left固定宽度200px </ ...

  9. F5-VM

    如果找不到的话,点击下面的链接.链接包含物理主机镜像和虚机主机镜像,选择virtual Edition. BIG-IP v11.x / Virtual Edition https://download ...

  10. Java笔记(八)TreeMap & TreeSet & LinkedHashMap

    TreeMap & TreeSet & LinkedHashMap 一.TreeMap HashMap缺陷:键值对之间没有特定的顺序.在TreeMap中, 键值对之间按键有序,Tree ...