`
拓子轩
  • 浏览: 208174 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

生成mybatis中所需的javabean和基础配置信息

阅读更多

 如果在项目中使用到了mybatis,那么就需要编写与数据库表对应的javabean对象,还有数据库表的数据列和javabean对象中字段的映射配置,以及一些通用的插入更新数据的配置,这些都可以通过工具自动生成。

 

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import com.cogcn.framework.util.CommonUtil;

/**
 * 把数据库中的表转化为java对象
 * 
 * @author tuozixuan
 * 
 */
public class TableToJavaTool
{
    private static final String DRIVER_NAME_ORACLE = "oracle.jdbc.driver.OracleDriver";

    // 数据库连接-用户名
    private String user;

    // 数据库连接-密码
    private String password;

    // 数据库连接-URL
    private String dbUrl;

    // 表名
    private String tableName;
    
    // 表类别名称
    private String catalog;
    
    private final List<String> primaryKeyList = new ArrayList<String>();
    
    private List<Map<String, Object>> dataList = null;

    public TableToJavaTool()
    {

    }

    public TableToJavaTool(String user, String password, String dbUrl, String tableName)
    {
        this.user = user;
        this.password = password;
        this.dbUrl = dbUrl;
        this.tableName = tableName;
    }
    
    public void process()
    {
        dataList = readData(getTableName());
        
        createJavaBeanFile(getTableName());
        createMybatisColumnConfig(getTableName());
    }

    /**
     * 获取数据库连接
     * 
     * @return Connection 数据库连接对象
     */
    private Connection getConnection()
    {
        Connection conn = null;

        try
        {
            Properties props = new Properties();
            props.put("remarksReporting", "true");
            props.put("user", getUser());
            props.put("password", getPassword());

            Class.forName(DRIVER_NAME_ORACLE);
            conn = DriverManager.getConnection(getDbUrl(), props);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }

        return conn;
    }

    /**
     * 获取数据库指定表的列信息
     * 
     * @param tableName 表名
     * @return List<Map<String, Object>> 列信息列表
     */
    private List<Map<String, Object>> readData(String tableName)
    {
        Connection conn = getConnection();
        List<Map<String, Object>> dataList = new ArrayList<Map<String, Object>>();

        try
        {
            DatabaseMetaData dbmd = conn.getMetaData();

            ResultSet rs = dbmd.getColumns(getCatalog(), null, tableName, null);
            Map<String, Object> map = null;
            while (rs.next())
            {
                map = new HashMap<String, Object>();
                map.put("columnName", rs.getString("COLUMN_NAME"));
                map.put("dataType", rs.getInt("DATA_TYPE"));
                map.put("remarks", rs.getString("REMARKS"));
                dataList.add(map);
            }
            
            ResultSet rs1 = dbmd.getPrimaryKeys(getCatalog(), null, tableName);
            while (rs1.next())
            {
                primaryKeyList.add(rs1.getString("COLUMN_NAME"));
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        } finally {
            CommonUtil.closeConnection(conn);
        }
        return dataList;
    }

    public void createJavaBeanFile(String tableName)
    {
        StringBuffer jbString = new StringBuffer();
        jbString.append("public class ").append(tableName).append("\r\n");
        jbString.append("{").append("\r\n");

        if (dataList != null)
        {
            for (Map<String, Object> map : dataList)
            {
                String fieldName = getFieldName((String) map.get("columnName"));
                String javaType = getJavaType((Integer) map.get("dataType"));
                jbString.append("    // ").append(map.get("remarks")).append("\r\n");
                jbString.append("    private ").append(javaType).append(" ").append(fieldName).append(";").append("\r\n");
                jbString.append("\r\n");
            }

            for (Map<String, Object> map : dataList)
            {
                String fieldName = getFieldName((String) map.get("columnName"));
                String javaType = getJavaType((Integer) map.get("dataType"));
                jbString.append("    public ").append(javaType).append(" get").append(firstUpperCase(fieldName)).append("()").append("\r\n");
                jbString.append("    {").append("\r\n");
                jbString.append("        return ").append(fieldName).append(";").append("\r\n");
                jbString.append("    }").append("\r\n");

                jbString.append("\r\n");

                jbString.append("    public void set").append(firstUpperCase(fieldName)).append("(").append(javaType).append(" ").append(fieldName)
                        .append(")").append("\r\n");
                jbString.append("    {").append("\r\n");
                jbString.append("        this.").append(fieldName).append(" = ").append(fieldName).append(";").append("\r\n");
                jbString.append("    }").append("\r\n");

                jbString.append("\r\n");

            }
        }

        jbString.append("}");

        System.out.println(jbString.toString());
    }

    /**
     * 根据表名获取对应的JavaBean的名称<br/>
     * 
     * 
     * @param tableName 表名
     * @return String JavaBean
     */
    public static String getJavaBeanName(String tableName)
    {

        return tableName;
    }

    /**
     * 把以_分隔的列明转化为字段名
     * 
     * @param columnName 列名
     * @return String 字段名
     */
    private static String getFieldName(String columnName)
    {
        if (columnName == null)
        {
            return "";
        }

        StringBuffer fieldNameBuffer = new StringBuffer();

        boolean nextUpperCase = false;
        columnName = columnName.toLowerCase();
        for (int i = 0; i < columnName.length(); i++)
        {
            char c = columnName.charAt(i);

            if (nextUpperCase)
            {
                fieldNameBuffer.append(columnName.substring(i, i + 1).toUpperCase());
            }
            else
            {
                fieldNameBuffer.append(c);
            }

            if (c == '_')
            {
                nextUpperCase = true;
            }
            else
            {
                nextUpperCase = false;
            }
        }

        String fieldName = fieldNameBuffer.toString();
        fieldName = fieldName.replaceAll("_", "");
        return fieldName;
    }

    /**
     * 字符串的第一个字母大写
     * 
     * @param str 字符串
     * @return String 处理后的字符串
     */
    private static String firstUpperCase(String str)
    {
        if (str == null)
        {
            return "";
        }

        if (str.length() == 1)
        {
            str = str.toUpperCase();
        }
        else
        {
            str = str.substring(0, 1).toUpperCase() + str.substring(1);
        }
        return str;
    }

    /**
     * 将数据库列类型转换为java数据类型
     * 
     * @param dataType 列类型
     * @return String java数据类型
     */
    private static String getJavaType(int dataType)
    {
        String javaType = "";
        if (dataType == Types.INTEGER)
        {
            javaType = "int";
        }
        else if (dataType == Types.BIGINT)
        {
            javaType = "long";
        }
        else if (dataType == Types.CHAR || dataType == Types.VARCHAR || dataType == Types.NVARCHAR || dataType == Types.CLOB)
        {
            javaType = "String";
        }
        else if (dataType == Types.TINYINT)
        {
            javaType = "short";
        }
        else if (dataType == Types.FLOAT)
        {
            javaType = "float";
        }
        else if (dataType == Types.NUMERIC || dataType == Types.DECIMAL || dataType == Types.DOUBLE)
        {
            javaType = "double";
        }
        else if (dataType == Types.DATE || dataType == Types.TIMESTAMP)
        {
            javaType = "Date";
        }
        return javaType;
    }

    public void createMybatisColumnConfig(String tableName)
    {
        StringBuffer buffer = new StringBuffer();
        if (dataList != null)
        {
            buffer.append("<resultMap id=\"BaseResultMap\" type=\"").append(tableName).append("\"> ").append("\r\n");
            for (Map<String, Object> map : dataList)
            {
                // <result column="CI_TYP" jdbcType="CHAR" property="ciTyp" />
                String columnName = (String) map.get("columnName");
                String fieldName = getFieldName(columnName);
                String jdbcType = getMybatisJdbcType((Integer) map.get("dataType"));

                if (primaryKeyList.contains(columnName))
                {
                    buffer.append("    <id column=\"").append(columnName).append("\" ").append("jdbcType=\"").append(jdbcType)
                    .append("\" property=\"").append(fieldName).append("\" />").append("\r\n");
                } else {
                buffer.append("    <result column=\"").append(columnName).append("\" ").append("jdbcType=\"").append(jdbcType)
                        .append("\" property=\"").append(fieldName).append("\" />").append("\r\n");
                }
            }
            buffer.append("</resultMap>").append("\r\n");
        }

        buffer.append("<sql id=\"BaseColumnList\">").append("\r\n");
        int length = dataList.size();
        int count = 0;
        buffer.append("    ");
        for (Map<String, Object> map : dataList)
        {
            count++;
            buffer.append(map.get("columnName"));
            if (count != length)
            {
                buffer.append(", ");
            }
        }
        buffer.append("\r\n");
        buffer.append("</sql>").append("\r\n");
        
        // insert配置
        buffer.append("<insert id=\"insert\" parameterType=\"\">").append("\r\n");
        buffer.append("    insert into ").append(getTableName()).append("\r\n");
        buffer.append("    <trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">").append("\r\n");
        for (Map<String, Object> map : dataList)
        {
            String columnName = (String) map.get("columnName");
            String fieldName = getFieldName(columnName);
            buffer.append("        <if test=\"").append(fieldName).append(" != null\"> \r\n");
            buffer.append("            ").append(columnName).append(",").append("\r\n");
            buffer.append("        </if> \r\n");
        }
        buffer.append("    </trim>").append("\r\n");
        buffer.append("    <trim prefix=\"values (\" suffix=\")\" suffixOverrides=\",\"> \r\n");
        for (Map<String, Object> map : dataList)
        {
            String columnName = (String) map.get("columnName");
            String fieldName = getFieldName(columnName);
            String jdbcType = getMybatisJdbcType((Integer) map.get("dataType"));
            buffer.append("        <if test=\"").append(fieldName).append(" != null\"> \r\n");
            buffer.append("            #{").append(fieldName).append(",jdbcType=").append(jdbcType).append("}, \r\n");
            buffer.append("        </if> \r\n");
        }
        buffer.append("    </trim>").append("\r\n");
        
        // update配置
        buffer.append("<update id=\"update\" parameterType=\"java.util.Map\"> \r\n");
        buffer.append("    update ").append(getTableName()).append("\r\n");
        buffer.append("    <set>").append("\r\n");
        for (Map<String, Object> map : dataList)
        {
            String columnName = (String) map.get("columnName");
            String fieldName = getFieldName(columnName);
            String jdbcType = getMybatisJdbcType((Integer) map.get("dataType"));
            buffer.append("        <if test=\"").append(fieldName).append(" != null\"> \r\n");
            buffer.append("            ").append(columnName).append(" = ").append("#{").append(fieldName).append(",jdbcType=").append(jdbcType).append("}, \r\n");
            buffer.append("        </if> \r\n");
        }
        buffer.append("    </set> \r\n");
        buffer.append("    where ").append("\r\n");
        
//        for (String primaryKey : primaryKeyList)
//        {
//            buffer.append("        ").append(primaryKey).append(" = #{lnNo,jdbcType=CHAR}");
//        }
        
        buffer.append("</update>");
        

        System.out.println(buffer.toString());
    }

    /**
     * 根据列的类型,获取mybatis配置中的jdbcType
     * 
     * @param dataType 列的类型
     * @return String jdbcType
     */
    private static String getMybatisJdbcType(int dataType)
    {
        String jdbcType = "";
        if (dataType == Types.TINYINT)
        {
            jdbcType = "TINYINT";
        }
        else if (dataType == Types.SMALLINT)
        {
            jdbcType = "SMALLINT";
        }
        else if (dataType == Types.INTEGER)
        {
            jdbcType = "INTEGER";
        }
        else if (dataType == Types.BIGINT)
        {
            jdbcType = "BIGINT";
        }
        else if (dataType == Types.FLOAT)
        {
            jdbcType = "FLOAT";
        }
        else if (dataType == Types.DOUBLE)
        {
            jdbcType = "DOUBLE";
        }
        else if (dataType == Types.DECIMAL)
        {
            jdbcType = "DECIMAL";
        }
        else if (dataType == Types.NUMERIC)
        {
            jdbcType = "NUMERIC";
        }
        else if (dataType == Types.VARCHAR)
        {
            jdbcType = "VARCHAR";
        }
        else if (dataType == Types.NVARCHAR)
        {
            jdbcType = "NVARCHAR";
        }
        else if (dataType == Types.CHAR)
        {
            jdbcType = "CHAR";
        }
        else if (dataType == Types.NCHAR)
        {
            jdbcType = "NCHAR";
        }
        else if (dataType == Types.CLOB)
        {
            jdbcType = "CLOB";
        }
        else if (dataType == Types.BLOB)
        {
            jdbcType = "BLOB";
        }
        else if (dataType == Types.NCLOB)
        {
            jdbcType = "NCLOB";
        }
        else if (dataType == Types.DATE)
        {
            jdbcType = "DATE";
        }
        else if (dataType == Types.TIMESTAMP)
        {
            jdbcType = "TIMESTAMP";
        }
        else if (dataType == Types.ARRAY)
        {
            jdbcType = "ARRAY";
        }
        else if (dataType == Types.TIME)
        {
            jdbcType = "TIME";
        }
        else if (dataType == Types.BOOLEAN)
        {
            jdbcType = "BOOLEAN";
        }
        else if (dataType == Types.BIT)
        {
            jdbcType = "BIT";
        }
        else if (dataType == Types.BINARY)
        {
            jdbcType = "BINARY";
        }
        else if (dataType == Types.OTHER)
        {
            jdbcType = "OTHER";
        }
        else if (dataType == Types.REAL)
        {
            jdbcType = "REAL";
        }
        else if (dataType == Types.LONGVARCHAR)
        {
            jdbcType = "LONGVARCHAR";
        }
        else if (dataType == Types.VARBINARY)
        {
            jdbcType = "VARBINARY";
        }
        else if (dataType == Types.LONGVARBINARY)
        {
            jdbcType = "LONGVARBINARY";
        }

        return jdbcType;
    }

    public String getUser()
    {
        return user;
    }

    public void setUser(String user)
    {
        this.user = user;
    }

    public String getPassword()
    {
        return password;
    }

    public void setPassword(String password)
    {
        this.password = password;
    }

    public String getDbUrl()
    {
        return dbUrl;
    }

    public void setDbUrl(String dbUrl)
    {
        this.dbUrl = dbUrl;
    }

    public String getTableName()
    {
        return tableName;
    }

    public void setTableName(String tableName)
    {
        this.tableName = tableName;
    }
    
    public String getCatalog()
    {
        return catalog;
    }

    public void setCatalog(String catalog)
    {
        this.catalog = catalog;
    }
}

 

使用示例:

 

    public static void main(String[] args)
    {
         String dbUrl = "jdbc:oracle:thin:@10.10.16.80:1521/orcl";
         String userName = "user";
         String password = "password";
         String tableName = "MEMBER";
         TableToJavaTool tool = new TableToJavaTool(userName, password, dbUrl, tableName);
         // tool.setCatalog("me");
         tool.process();
    }

 

分享到:
评论

相关推荐

    mybatis-generator javabean

    总结起来,`mybatis-generator javabean` 提供了一种高效的方式,自动从MySQL数据库生成MyBatis所需的Mapper XML、DAO接口和JavaBean实体类,极大地减少了手动编写这些基础代码的工作量,提升了开发效率。...

    mybatis-gennerator插件自动生成mybatis所需要的bean、mapper xml文件

    MyBatis Generator(通常缩写为MBG)是一款强大的工具,用于自动生成MyBatis框架所需的JavaBean、Mapper XML文件以及对应的DAO接口。这个插件极大地简化了开发过程,减少了手动编写这些基础代码的工作量,使得开发者...

    MyBatis + Mapper 代码生成器

    MyBatis + Mapper 代码生成器是一个实用工具,旨在帮助开发者快速生成MyBatis框架所需的JavaBean和Mapper接口以及XML映射文件,从而减少手动编写这些基础代码的时间和错误。这个工具采用tk.mapper模式,实现了动态...

    mybatis-generator-gui

    通过运行这个 jar 文件或在 IDE 中启动该程序,用户可以方便地配置数据库连接信息,选择要生成的表,然后自动生成相应的 MyBatis 框架所需的代码。 1. **MyBatis Generator 基础知识**: - MyBatis Generator 是 ...

    Spring+SpringMVC+MyBatis返回json所需jar包

    3. **MyBatis与Jackson集成**:虽然MyBatis主要处理数据库操作,但如果你需要将查询结果直接转换为JSON,可以在MyBatis的配置中指定使用Jackson。在`mybatis-config.xml`中添加`ObjectMapper`的配置: ```xml ...

    mysql自动生成javaBean和dao代码

    `GeneratorSqlmap.java`是主程序,它读取并解析`generatorConfig.xml`中的配置,然后调用相应的代码生成库或框架(如MyBatis的MyBatis Generator或Apache的DBUtils等)来生成JavaBean和DAO代码。JavaBean通常代表...

    mybatis-generator下载

    MyBatis Generator(MBG...配置好generatorConfig.xml文件后,运行MBG即可生成所需的代码,从而提高开发效率。在实际开发中,MBG是一个非常实用的辅助工具,能帮助开发者专注于核心业务逻辑,而不是基础的数据库操作。

    基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(TableGo v7.0.0.pdf

    TableGo的核心优势在于其低代码编程的实现,能够自动生成SpringBoot项目工程、JavaBean、前后端分离的CRUD代码、MyBatis的Mapper映射配置文件、数据库设计文档(如Word和Excel)以及Swagger2离线API文档等。...

    mybatis源码

    1. **配置加载**: MyBatis首先读取配置文件,解析出SqlSessionFactoryBuilder所需的参数,然后构建SqlSessionFactory。 2. **SqlSession的创建**: SqlSessionFactory创建SqlSession时,会根据配置确定Executor类型...

    mybatis generator可使用

    MyBatis Generator(MBG)是一...总之,MyBatis Generator是MyBatis框架的重要辅助工具,通过它可以快速地生成与数据库交互所需的代码,显著提高开发效率。只要正确配置并合理使用,MBG就能成为项目开发中的得力助手。

    Struts2_Spring3.1_MyBatis3.06整合需要用到的jar包.rar

    本压缩包提供了整合这三大框架所需的核心库文件,下面将详细解释这些库文件及其在整合过程中的作用。 1. **aspectjweaver-1.6.8.jar**:AspectJ是一个面向切面编程(AOP)的扩展,它允许开发者在不改变业务逻辑的情况...

    MyBatis_Generator插件的安装以及简单使用方法(图解)

    MyBatis_Generator是一款强大的自动化代码生成工具,它能够帮助开发者自动生成MyBatis框架所需的Mapper接口、实体类以及XML映射文件,极大地提高了开发效率。本文将详细介绍如何在Eclipse环境中安装和使用MyBatis_...

    SpringMVC基础框架

    接着,设置Tomcat服务器,配置好数据库连接(如MySql),然后创建SpringMVC工程,导入所需的库文件。在项目中,定义DispatcherServlet,配置SpringMVC的配置文件(如spring-mvc.xml),并设置视图解析器(如...

    MybatisCodeHelperPro 2.8.7

    5. **快速导入Mapper**:在编写Java代码时,插件可快速导入所需的Mapper接口,提高编码速度。 6. **模板定制**:用户可以根据自己的开发习惯自定义代码生成模板,包括类的注释、方法前缀、返回类型等,实现个性化...

    基于SpringMVC的报表生成系统(包含数据库)

    在这里,我们使用JDBC来执行用户提供的SQL语句,获取报表所需的数据。 - **ResultSets**:JDBC执行SQL后的结果通常以ResultSet对象的形式返回,该对象包含了查询返回的所有行和列。 3. **数据处理与展示** - **...

    JSP大学生兼职平台,SSM大学生兼职平台

    - **数据库文件**:可能是数据库脚本,用于创建和初始化兼职平台所需的数据表和数据。 - **运行截图**:展示了平台的界面和运行状态,可能包含了功能演示和成功运行的证明。 综合以上信息,这个压缩包是一个基于JSP...

    JSP基于SSM汽车4s店销售库存管理系统可升级SpringBoot毕业源码案例设计.zip

    开发者可以通过Maven的pom.xml文件声明项目所需的库,Maven会自动下载并管理这些库。 7. **前后端交互**:系统使用Ajax技术实现局部刷新,提高用户体验。前端可能使用JQuery和JavaScript进行交互逻辑处理,后端通过...

    基于springboot的老年一站式服务平台源码数据库.zip

    源码数据库是平台的核心部分,它存储了所有服务所需的数据。可能包含老人信息、服务信息、预约记录等表,数据库设计应遵循规范化原则,保证数据的一致性和完整性。可能使用的数据库管理系统如MySQL,因其高效、稳定...

    hrm管理系统

    在hrm管理系统中,Maven使得开发者可以方便地导入和管理所需的库,确保项目的构建一致性。 5. **Tomcat9**:作为Java应用服务器,Tomcat9运行和部署了hrm系统的Web应用。开发者可以将打包后的WAR文件部署到Tomcat中...

    javaweb小项目,也作为考试样例

    6. **Web容器**:JavaWeb应用需要在Web容器(如Tomcat、Jetty)中运行,这些容器提供了运行Servlet和JSP所需的环境。在本项目中,开发者可能已经配置了相应的Web服务器,并部署了应用。 7. **目录结构**:一个标准...

Global site tag (gtag.js) - Google Analytics