`
geeksun
  • 浏览: 967830 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

数据库表生成MyBatis的Mapping文件

 
阅读更多

       当使用MyBatis的时候,需要每个表建立一个Entity类,还要创建一个Mapping文件,如果表的数量少还好说,当表的数量多的时候,而且以后还会增加的时候,手动创建这些文件就成了一个繁琐而又重复的工作,根据“能用工具不手写”的原则,可以根据Mapping xml的格式,用程序来生成这些对应的文件。

       这里是一个生成Mapping XML文件的demo code:

  

import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 数据表生成mybatis的对应mapping xml
 * Created by usr1999 on 2015/1/30.
 */
public class TableToXml {
    private static final String LINE = "\r\n";
    private static final String TAB = "\t";

    private static Map<String, String> jdbcTypeMap;

    String rootPath = "/Users/jiangzhiqiang/dev";

    static {
        jdbcTypeMap = new HashMap<String, String>();
        jdbcTypeMap.put("DATETIME", "TIMESTAMP");
        jdbcTypeMap.put("TINYINT", "INTEGER");
        jdbcTypeMap.put("SMALLINT", "INTEGER");
        jdbcTypeMap.put("INT", "INTEGER");
    }

    public static void main(String[] args) throws SQLException, ClassNotFoundException {
        String jdbcString = "jdbc:mysql://m3307i.test.db.dmall.com:3307/dmall_ledger";
        Class.forName("com.mysql.jdbc.Driver");
        Connection con = DriverManager.getConnection(jdbcString, "devtest", "WDevTest@Dmall");
        DatabaseMetaData metadata = con.getMetaData();
        ResultSet rs = metadata.getTables("dmall_ledger", null, null, null);
        TableToXml d = new TableToXml();
        while (rs.next()) {
            String tableName = rs.getString(3);
            System.out.println("正在生成XML Mapping的表名: ================ "+tableName);
            d.tableToXml(con, tableName);
        }
    }

    private void tableToXml(Connection conn, String tableName) {
        String entityName = convertTableToEntity(tableName);
        String sql = "select * from " + tableName + " limit 1"; //MySql DB
        StringBuilder xml = new StringBuilder();
        xml.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
        xml.append(LINE);
        xml.append("<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >");
        xml.append(LINE);
        // mapping.xml中要引用的Mapper接口,com.zainagou.supplier.mapper为xml映射的entity类的包名
        String mapperName = "com.dmall.settle.mapper." +entityName+"Mapper";
        xml.append("<mapper namespace=\""+mapperName+"\">");
        xml.append(LINE);
        xml.append(TAB);
        String fullEntityName = "com.dmall.settle.domain."+entityName;
        xml.append("<resultMap id=\"baseResultMap\" type=\""+fullEntityName+"\" >");

        List<String> columeList = new ArrayList<String>();

        try {
            PreparedStatement ps = conn.prepareStatement(sql);
            ResultSet rs = ps.executeQuery();
            ResultSetMetaData metaData = rs.getMetaData();

            int columnCount = metaData.getColumnCount();

            for(int i=1;i<=columnCount;i++){
                xml.append(LINE);
                xml.append(TAB);
                xml.append(TAB);
                String columnName = metaData.getColumnName(i);
                columeList.add(columnName);

                String columnTypeName = metaData.getColumnTypeName(i);
                if(columnTypeName.contains(" ")){
                    columnTypeName = columnTypeName.split(" ")[0];
                }
//                System.out.println("columnName:"+columnName+", columnType:"+columnTypeName);

                if(jdbcTypeMap.containsKey(columnTypeName)){
                    columnTypeName = jdbcTypeMap.get(columnTypeName);
                }
                if(columnName.equals("id")){
                    xml.append("<id column=\"id\" property=\"id\" jdbcType=\"");
                    xml.append(columnTypeName);
                    xml.append("\" />");
                }else{
                    xml.append("<result column=\"");
                    xml.append(columnName);
                    xml.append("\" property=\"");
                    String propertyName = dealName(columnName);
                    xml.append(propertyName);
                    xml.append("\" jdbcType=\"");
                    xml.append(columnTypeName);
                    xml.append("\" />");
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        xml.append(LINE);
        xml.append(TAB);
        xml.append("</resultMap>");
        xml.append(LINE);
        xml.append(TAB);
        xml.append("<sql id=\"base_column_list\" >");
        xml.append(LINE);
        xml.append(TAB);
        xml.append(TAB);
        for(int i=0,size=columeList.size();i<size;i++){
            xml.append(columeList.get(i));
            if(i!=(size-1)){
                xml.append(",");
            }
        }
        xml.append(LINE);
        xml.append(TAB);
        xml.append("</sql>");
        xml.append(LINE);
        xml.append("</mapper>");
//        String rootPath = this.getClass().getClassLoader().getResource("").getPath();
//        String endPath = rootPath + "\\" + (packages.replace("/", "\\")).replace(".", "\\");
        buildXmlFile(rootPath + "/" + entityName + ".xml", xml.toString());
    }

    //生成xml文件
    public void buildXmlFile(String filePath, String fileContent) {
        try {
            File file = new File(filePath);
            FileOutputStream osw = new FileOutputStream(file);
            PrintWriter pw = new PrintWriter(osw);
            pw.println(fileContent);
            pw.close();
        } catch (Exception e) {
            System.out.println("生成xml文件出错:" + e.getMessage());
        }
    }

    //    转换表名为实体名
    public String convertTableToEntity(String tableName){
        tableName = tableName.substring(0, 1).toUpperCase() + tableName.subSequence(1, tableName.length());
        String entityName = dealLine(tableName);

        return entityName;
    }

    private String dealLine(String tableName) {
        // 处理下划线情况,把下划线后一位的字母变大写;
        tableName = dealName(tableName);
        return tableName;
    }

    //下划线后一位字母大写
    private String dealName(String columnName) {
        if (columnName.contains("_")) {
            StringBuffer names = new StringBuffer();
            String arrayName[] = columnName.split("_");
            names.append(arrayName[0]);
            for (int i = 1; i < arrayName.length; i++) {
                String arri = arrayName[i];
                String tmp = arri.substring(0, 1).toUpperCase() + arri.substring(1, arri.length());
                names.append(tmp);
            }
            columnName = names.toString();
        }
        return columnName;
    }

}

 

 

题外话:写这个程序耗费了2个左右小时时间,表面上看上去不如手动创建文件的速度快,但长远看来,节省了未来做这些工作的时间,也是提高了生产力,就像节能灯一次投入较大,从长远来看价值却大一样。

 

分享到:
评论

相关推荐

    Oracle/MySQL生成mybatis文件工具

    本工具“Oracle/MySQL生成mybatis文件工具”旨在为开发者提供便利,自动根据数据库中的表结构生成相应的MyBatis映射文件(Mapper XML)以及实体类(Entity Java),从而提高开发效率,减少手动编写SQL和Java代码的...

    逆向生成工具,有数据库表生成java bean实体类

    MyBatis的SqlMapConfig.xml文件可以引用我们生成的实体类,从而将数据库操作与业务逻辑解耦。这样,当数据库表结构发生变化时,只需要更新实体类,而无需修改大量手动编写的代码,降低了维护成本。 实体类的生成...

    mybatis的Mapping接口和配置文件自动生成

    总结来说,“mybatis的Mapping接口和配置文件自动生成”工具是MyBatis开发中的得力助手,它将数据库表结构转化为Java代码,减少了手动编写工作,提高了开发效率。对于大型项目或频繁迭代的系统,使用这样的自动化...

    JAVA通过实体生成数据库表

    在Java开发中,将实体类(Entity Class)映射到数据库表是一种常见的做法,这通常涉及到ORM(Object-Relational Mapping)技术。ORM允许我们用面向对象的方式处理数据库操作,而无需编写大量的SQL语句。Java中的...

    mybatis_生成mapping工具_mybatis代码生成工具_

    MyBatis 代码生成器是一个强大的辅助工具,它可以分析数据库表结构,并根据表信息自动生成与之对应的Java类和XML映射文件。这些类和文件包括: - **DAO(Data Access Object)层**:包含了与数据库交互的方法,如增...

    MyBatis数据库操作代码自动生成器

    MyBatis数据库操作代码自动生成器是一款非常实用的开发工具,专为简化MyBatis框架下的数据库交互代码编写而设计。这款工具通过自动化的方式,帮助开发者快速生成与数据库交互的各种Java代码,包括DAO(Data Access ...

    java 生成mybatis的xml文件和实体类

    总的来说,这个项目提供了一个便捷的工具,可以帮助开发者快速生成MyBatis的XML配置文件和Java实体类,从而简化了数据库与Java应用之间的数据交互。对于熟悉Java和MyBatis的开发者来说,这个工具可以大大提高他们的...

    Mybatis-Generator自动生成Dao、Model、Mapping相关文件,不依赖maven,直接生成

    Mybatis-Generator是一款强大的工具,它能够帮助Java开发者自动生成Mybatis的DAO层、Model层以及对应的XML映射文件,极大地提高了开发效率,减少了手动编写这些基础代码的时间。这款工具的特点在于,它并不依赖于...

    generator自动生成Mybatis实体以及映射文件

    Mybatis Generator是一款强大的工具,它能够自动化生成Mybatis框架所需的实体类、Mapper接口与XML映射文件,大大减轻了开发人员的手动编码工作,提高了开发效率。本篇将详细介绍generator的使用及其背后的原理。 ...

    mybatis-generator生成数据表的java文件

    - **Mapping文件**:XML格式的文件,定义了SQL查询、插入、更新和删除语句,与Model类对应,MyBatis框架会根据这些文件执行数据库操作。 - **DAO接口**:定义了对数据库进行CRUD(创建、读取、更新、删除)操作的...

    oracle 根据数据库自动生成JAVA代码

    当根据数据库自动生成Java代码时,这些实体类会自动映射数据库表的字段,通常使用ORM(Object-Relational Mapping)框架如Hibernate或MyBatis来实现。ORM框架简化了数据访问层的开发,使得Java对象可以直接操作...

    数据库表生成对应的java类

    一旦配置完成,运行这个工具,它会分析指定的数据库表,生成对应的Java源代码文件,这些文件包含了表示数据库表的实体类,以及可能的getter和setter方法、构造函数等。 生成的Java类通常包含以下元素: 1. 数据库...

    java根据数据库自动生成vo 类

    在MyBatis的配置文件中定义数据库连接和表映射,然后运行生成器,即可得到对应的Java源代码。 除了ORM框架,还有一些独立的代码生成工具,如Apache的`DBUtils`项目中的`codegen`模块,或者第三方的插件如`Alt+Shift...

    Mybatis框架entity、dao、mapping代码自动生成工具

    总结来说,Mybatis-Generator是一个强大的工具,能够帮助开发者快速生成Mybatis项目的Entity、DAO和Mapping文件,减少重复工作,提高开发效率。通过合理的配置和定制,可以适应不同的项目需求,是Java开发中不可或缺...

    使用MybatisGenerator自动生成Dao、Model、Mapping文件工具

    MybatisGenerator是一款强大的工具,它能够自动生成Mybatis框架所需的Dao层、Model层以及Mapper映射文件,极大地提高了开发效率,避免了手动编写这些重复性工作。通过使用此工具,开发者可以专注于业务逻辑的实现,...

    java springmvc mapping 逆向生成

    首先,Mybatis是一个流行的Java持久层框架,它提供了一种灵活的方式来将SQL语句与Java代码绑定,而Mapping文件是Mybatis中非常关键的部分,它定义了数据库表字段与Java对象属性之间的映射关系,以及SQL查询语句。...

    Mybatis-Generator自动生成Dao、Model、Mapping直接可运行

    Mybatis-Generator是一款强大的自动化工具,它可以帮助Java开发者自动生成Mybatis的DAO层、Model层以及Mapper XML映射文件,极大地提高了开发效率。这个压缩包文件"**MybatisGenerator**"提供了一个预先配置好的环境...

    MyBatis自动生成实体类、DAO接口和Mapping映射文件的代码(逆向工程)

    MyBatis是一个流行的持久层框架,提供了逆向工程功能,可以根据数据库表结构自动生成实体类、DAO接口和Mapping映射文件。本文档将详细介绍MyBatis逆向工程的配置和使用方法。 一、MyBatis逆向工程概述 MyBatis逆向...

    使用Mybatis-Generator自动生成Dao、Model、Mapping相关文件(转)

    Mybatis-Generator是一款强大的自动化工具,它可以帮助Java开发者自动生成Mybatis的相关代码,包括DAO(Data Access Object)、Model以及Mapper XML映射文件。这极大地提高了开发效率,避免了手动编写这些重复性工作...

Global site tag (gtag.js) - Google Analytics