根据javabean转换为mysql建表语句与mapper内容

摘要:
通常,我们将使用数据库表将它们转换为javabean、dao或mapper,这称为反向工程。然而,由于工作的临时需要,我需要将javabean转换为表构建语句和Mybatis Mapper文件。所以我在互联网上搜索了一下,其中大部分都是作为bean解析和输出的工具类。根据自己项目的命名设计要求,将javabean小驼峰命名方法转换为数据库表字段下划线命名方法。参考packagecom的简化示例如下。效用;importjava.io。IOException;导入java.lang.reflect。字段;/***由Jeffon2018年12月5日创建。*/publicclassGenerateSqlMapperUtil{/***@paramargs*@throwsIOException*/publicstaticvoidmaintrowsIOException{generateSqlMapper;}PublicstaticvoidgenerateSqlMapperrowsIOException{Field[]fields=obj.getDeclaredFields();Stringparam=null;StringcameCaseColumn=null;StringunderScoreCaseColumn=null;StringBuildersql=newStringBuilder();if{//No transfer表示默认类名为tableName=obj.getName().substring;}/***以下部分生成创建Sql*/Sql的表。追加追加追加(“;”);sql.append.append。追加System.out。打印ln;/***以下部分生成Mapper*/firstId=true;StringBuildermapper=newStringBuilder();StringBuilderresultMap=newStringBuilder();StringBuilderinsert=newStringBuilder();StringBuilder插入值=newStringBuilder();StringBuilderupdate=newStringBuilder();StringBuilderupdateWhere=newStringBuilder();StringBuilderdelete=newStringBuilder();StringBuilderdeleteWhere=newStringBuilder();mapper.append(“˂?

一般上,我们会使用数据库表转换为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(";
");
        sql.append("create table ").append(tableName).append("( 
");
        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(",
");
        }
        sql.delete(sql.lastIndexOf(","), sql.length()).append("
)ENGINE=INNODB DEFAULT CHARSET=UTF8 AUTO_INCREMENT=1;
");
        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"?>
");
        mapper.append("<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
");
        mapper.append("<mapper namespace="com..mapper.").append(tableName).append("Mapper">
");
        resultMap.append("    <resultMap id="Base").append(tableName).append("" type="").append(obj.getName()).append("">
");
        insert.append("    <insert id="save").append(tableName).append("" parameterType="").append(obj.getName()).append("">
");
        insert.append("        INSERT INTO ").append(tableName.toLowerCase()).append(" (");
        update.append("    <update id="update").append(tableName).append("" parameterType="").append(obj.getName()).append("">
");
        update.append("        UPDATE ").append(tableName.toLowerCase()).append(" SET ");
        delete.append("    <delete id="delete").append(tableName).append("" parameterType="int">
");
        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("}
");
                deleteWhere.append(" WHERE ").append(underScoreCaseColumn).append(" = #{").append(cameCaseColumn).append("}
");
                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" />
");
            }else{
                // 根据需要自行修改
                resultMap.append("VARCHAR" />
");
            }
        }
        resultMap.append("    </resultMap>
");
        insert.delete(insert.lastIndexOf(","), insert.length()).append(")
");
        insertValues.delete(insertValues.lastIndexOf(","), insertValues.length());
        insert.append("              VALUES (");
        insert.append(insertValues).append(")
");
        insert.append("    </insert>
");
        update.delete(update.lastIndexOf(","), update.length()).append("
");
        update.append(updateWhere);
        update.append("    </update>
");
        delete.append(deleteWhere);
        delete.append("    </delete>
");
        mapper.append(resultMap).append(insert).append(update).append(delete);
        mapper.append("</mapper>");
        System.out.println(mapper);
    }
}

免责声明:文章转载自《根据javabean转换为mysql建表语句与mapper内容》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇python-5[leveldb]0.源码编译及使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

CentOS7安装mysql后无法启动服务,提示Unit not found

1、最近在centos7上面进行mysql安装完成后,无法启动,报如下错误: Failed to start mysql.server.service: Unit not found. 2、这个是知乎上面找到的无法启动的答案:https://www.zhihu.com/question/41832866 3、解决办法一:使用MariaDB代替mysql数...

mysql5.7.初始化后,临时密码过期

安装mysql 5.7遇到一个特别纠结的问题,初始化成功之后,使用临时密码提示过期。反复初始化n次,还是临时密码过期。脑袋很大。下面贴出代码 [root@oracle11g data]# mysqld --initialize --user=mysql [root@oracle11g data]# service mysqld start Starting...

mysql 5.7 迁移数据方案

从一台服务器迁移至其他服务器,如何选择最短的停服时间方案 方案一、凌晨3点的全备份+停服后一天的大概一天的增备   1. 拷贝前一天的全备份至新的服务器    rsync -auzrP /Data/dbbak/db/2019-04-23/2019-04-23_03-10-11 root@172.16.1.80:/data/backup/full/   2....

MySQL常见问题

1、mysql如何做分页 mysql数据库做分页用limit关键字,它后面跟两个参数startIndex和pageSize 2、mysql引擎有哪些,各自的特点是什么? innodb和myisam两个引擎,两者区别是innodb支持事物,myisam不支持innodb支持外键,myisam不支持innodb不支持全文索引,myisam支持全文索引innod...

MySQL 5.6表空间传输

在MySQL 5.6 Oracle引入了一个可移动表空间的特征(复制的表空间到另一个服务器)和Percona Server采用部分备份,这意味着你现在可以备份单个数据库或表;由于Percona Server 5.6的出现,innodb_import_table_from_xtrabackup是过时的Percona Server实现Oracle MySQL的...

第一次使用Ubuntu20.04系统-遇坑小记

第一次使用Ubuntu20.04系统-遇坑小记 最近发现Linux系统是程序员前进的必经之路(立志做一名“倔强又装逼的程序员”),所以果断在自己的笔记本上安装了最新的Ubuntu20.04系统,刚开始使用确实不是很习惯(应该还是自己比较菜),尤其是许多命令行的操作方式不是很熟悉、操作系统的一些相关知识也不是很了解,不过用了几天,发现Linux(Ubuntu...