根据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 ...
随机推荐
- mysql时间延时注入案例
通过Burpsuite结合sqlmap发现如下接口存在时间盲注
- JAVA中值类型和引用类型的不同(面试常考)
转载:https://www.cnblogs.com/1ming/p/5227944.html 1. JAVA中值类型和引用类型的不同? [定义] 引用类型表示你操作的数据是同一个,也就是说当你传一个 ...
- P1182 数列分段`Section II` P1316 丢瓶盖 二分答案
题目描述 对于给定的一个长度为N的正整数数列A-iA−i,现要将其分成M(M≤N)M(M≤N)段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一数列4 2 4 5 142451要分成 ...
- 007 numpy数组文件的存取
不知道这个有没有用,都整理了一番. 一:数组以二进制格式进行存储 1.说明 np.save与np.load是读写磁盘数组数据的两个重要函数. 默认情况下,数组以压缩的原始二进制格式保存在扩展名为npy ...
- 使用 Django-debug-toolbar 优化Query 提高代码效率
一段程序执行效率慢,除了cpu计算耗时外,还有一个很重要的原因是SQL的Duplicated过多,使用Django-debug-toolbar能够快速找出哪些地方的SQL可以优化,提高程序执行效率 1 ...
- LBS基站定位
LBS基站定位(Location Based Service,简称LBS)一般应用于手机用户,它是基于位置的服务,通过电信.移动运营商的无线电通讯网络(如GSM网.CDMA网)或外部定位方式(如GPS ...
- 犹记当年写出bug睡不着,回想今天只求睡好渡余生……
不想面对已经在博客园注册了3年多的时间 了,就是这么快的就已经过去了近3年的工作时间,从最开始的对编程的困惑到慢慢有一点的认识,好像哦就这样没有什么啊,也没有涉及到一些比较难的东西. 但是当初第一份工 ...
- 【python】常用第三方模块
No1: [Pillow]图像处理标准库 缩放 from PIL import Image # 打开一个jpg图像文件,注意是当前路径: im = Image.open('test.jpg') # 获 ...
- Codeforces 1036E Covered Points (线段覆盖的整点数)【计算几何】
<题目链接> <转载于 >>> > 题目大意: 在二维平面上给出n条不共线的线段(线段端点是整数),问这些线段总共覆盖到了多少个整数点. 解题分析: 用GC ...
- RESTful restful api Representational State Transfer
通俗直白讲:REST是一种编写风格,一种API接口规范.它的风格就是将对象(如学生)的状态(如增删改查,API接口版本号等等)通过其他方式传递,API的接口地址突显出描述的对象. -- == REST ...