原文地址:  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. @+id/和android:id有什么区别?

    Any View object may have an integer ID associated with it, to uniquely identify the View within the ...

  2. 基于Kubernetes集群部署skyDNS服务

    目录贴:Kubernetes学习系列 在之前几篇文章的基础,(Centos7部署Kubernetes集群.基于kubernetes集群部署DashBoard.为Kubernetes集群部署本地镜像仓库 ...

  3. laravel 错误 1071 Specified key was too long; max key length is 1000 bytes

    laravel 执行 php artisan migrate 安装数据库报 1071 Specified key was too long; max key length is 1000 bytes ...

  4. AtCoder Grand Contest 006 (AGC006) C - Rabbit Exercise 概率期望

    原文链接https://www.cnblogs.com/zhouzhendong/p/AGC006C.html 题目传送门 - AGC006C 题意 有 $n$ 个兔子,从 $1$ 到 $n$ 编号, ...

  5. Java中常见的排序方式-冒泡排序(升序)

    [基本思想] 假设数组为int[] a = { 49, 38, 65, 97, 76, 13, 27 },数组元素个数为7个. 第1轮比较:先是a[0]与a[1]比较,大于则先交换,再比较a[1]和a ...

  6. php分词工具scws

    分词工具   sphinx  支持php版本5.2.2~6.0因此选用scws 文档地址 http://www.xunsearch.com/scws/docs.php#instscws 简单的demo ...

  7. 3、Qt Project之Socket网络编程

    Socket网络编程  Step1:首先完成整个界面的设计 <?xml version="1.0" encoding="UTF-8"?> <u ...

  8. The Monocycle(bfs)

    题目描述: 转载自:https://blog.csdn.net/h1021456873/article/details/54572767 题意: 给你一个转轮,有5种颜色,为了5中颜色的位置是确定的, ...

  9. 6491: Daydream

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

  10. Oracle 在字符串中输入单引号或特殊字符

    -- Start 字符串是用单引号括起来的,如果想在字符串中输入单引号该怎么办呢?有两种方法. 方法一:是用两个单引号代表一个单引号 SELECT 'I''m Shangbo' FROM DUAL; ...