根据javabean转换为mysql建表语句与mapper内容
原文地址: 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内容的更多相关文章
- 基于表的数据字典构造MySQL建表语句
表的数据字典格式如下: 如果手动写MySQL建表语句,确认麻烦,还不能保证书写一定正确. 写了个Perl脚本,可快速构造MySQL脚本语句. 脚本如下: #!/usr/bin/perl use str ...
- MySQL 建表语句 create table 中的列定义
MySQL 建表语句 create table 中的列定义: column_definition: data_type [NOT NULL | NULL] [DEFAULT default_value ...
- 三种常用的MySQL建表语句
MySQL建表语句是最基础的SQL语句之一,下面就为您介绍最常用的三种MySQL建表语句,如果您对MySQL建表语句方面感兴趣的话,不妨一看. 1.最简单的: CREATE TABLE t1( ...
- 脚本工具---自动解析mysql建表语句,生成sqlalchemy表对象声明
常规建表语句: CREATE TABLE `test_table` ( `id` int(11) NOT NULL, `name` char(64) NOT NULL, `password` char ...
- mysql 建表语句
修改id为自动增长: alter table book b_ISBN int(11) auto_increment; 自动增长要加的:auto_increment 基本的sql语句: 选择:sel ...
- Mysql建表语句
create table messages( id int unsigned primary key auto_increment, sender varchar(64) not null, gett ...
- mysql建表语句key的含义
CREATE TABLE `admin_role` ( `adminSet_id` varchar(32) NOT NULL, `roleSet_id` varchar(32) NOT NULL, ...
- 一则 Mysql 建表语句
DROP TABLE IF EXISTS `nuvue`; CREATE TABLE `nuvue`( `id` ) UNSIGNED NOT NULL AUTO_INCREMENT, `status ...
- MySQL建表、插入语句等
不定时更新MySQL的一些基础语句以及出现过的问题 5.10 建表语句 CREATE TABLE `policy_landvalue` ( `id` ) NOT NULL AUTO_INCREMENT ...
随机推荐
- c_数据结构_顺序表
#define OK 1 #define ERROR 0 #define OVERFLOW -2 #define LIST_INIT_SIZE 100 // 线性表存储空间的初始分配量 #define ...
- go-无法下载websocket的问题
由于限制问题,国内使用 go get 安装 golang 官方包可能会失败,如我自己在安装 collidermain 时,出现了以下报错: $ go get collidermain package ...
- mac 命令操作
内核空间和用户空间 x86架构中将内核地址空间划分三部分:ZONE_DMA.ZONE_NORMAL和 ZONE_HIGHMEM. 自动加载(开机自动启动服务) ln -sfv /usr/local/o ...
- 简单的使用Nginx框架搭建Web服务器~
系统环境Debian 8,内核版本 一.首先来安装nginx服务程序: 1.安装nginx服务需要的相关程序(记得在root权限下操作下面的指令) aptitude install libpcre3 ...
- Codeforces 852G Bathroom terminal 【Trie树】
<题目链接> 题目大意: 现在给定出n个字符串,并且进行m此询问,每次询问给出一个匹配串,每次询问都给出该匹配串能够匹配的字符串个数(题目只出现字符'a'~'e').'?'可以看成任意字符 ...
- poj 2528 Mayor’s posters 【离散化】+【线段树】
<题目链接> 题目大意: 往一堵墙上贴海报,依次输出这些海报张贴的范围,这些海报能够相互覆盖,问最后能够看见几张海报? 解题分析: 由于是给出每张海报的区间,所以在这些区间内的很多点可能用 ...
- 一种表达式语言的解析引擎JEXL简单使用
Jexl 是一个 Expression Language 的解析引擎, 是为了方便嵌入你的系统或者程序框架的开发中, 他算是实现了 JSTL 中 EL 的延伸版本. 不过也采用了一些 Velocity ...
- 解决UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range
字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(en ...
- 解决VS打开文件出现No EditorOptionDefinition export found for the given option name问题
转载自http://stackoverflow.com/questions/23893497/no-editoroptiondefinition-export-found-error的第一个回答 Af ...
- My Web Developer Roadmap
必需技能部分,可以理解为通用的.基础的技能,不管我们选择哪个方向都是通用的,包括但不限于 Git 使用.HTTP/HTTPS.数据结构和算法等.当然了,学习能力是必须具备的. 从一开始学习web前端, ...