1. 程式人生 > >資料庫逆向生成實體類和對映檔案

資料庫逆向生成實體類和對映檔案

首先需要幾個jar包:freemarker-2.3.23.jar

                                log4j-1.2.16.jar

                                mybatis-3.2.3.jar

                                mybatis-generator-core-1.3.2.jar

                                mysql-connector-java-5.1.28-bin.jar

                                ojdbc14.jar

這些jar包網上都有下載的地方,小編是直接拿過來用的,連結就麻煩大家手動下載了~~~大笑

xml配置檔案:generatorConfig.xml,程式碼如下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
  PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
  "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>
    <context id="testTables" targetRuntime="MyBatis3">
        <commentGenerator>
            <!-- 是否去除自動生成的註釋 true:是 : false:否 -->
            <property name="suppressAllComments" value="true" />
        </commentGenerator>
        <!--資料庫連線的資訊:驅動類、連線地址、使用者名稱、密碼 oracle.jdbc.driver.OracleDriver   com.mysql.jdbc.Driver-->
        <jdbcConnection driverClass="oracle.jdbc.driver.OracleDriver"
            connectionURL="jdbc:oracle:thin:@localhost

:ORACLE埠一般為1521:你的資料庫名稱" userId="自己的ID"
            password="自己的密碼">
        </jdbcConnection>
        <!-- jdbc:mysql://localhost:MySQL埠號/資料庫名稱?characterEncoding=utf-8  -->連線MySQL
        <!-- jdbc:oracle:thin:@localhost:ORACLE埠號:資料庫名稱-->連線Oracle
        <!-- 預設false,把JDBC DECIMAL 和 NUMERIC 型別解析為 Integer,為 true時把JDBC DECIMAL 和
            NUMERIC 型別解析為java.math.BigDecimal -->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>

        <!-- targetProject:生成PO類的位置 -->
        <javaModelGenerator targetPackage="XXX.pojo
"
            targetProject=".\src">
            <!-- enableSubPackages:是否讓schema作為包的字尾 -->
            <property name="enableSubPackages" value="false" />
            <!-- 從資料庫返回的值被清理前後的空格 -->
            <property name="trimStrings" value="true" />
        </javaModelGenerator>
        <!-- targetProject:mapper對映檔案生成的位置 -->
        <sqlMapGenerator targetPackage="XXX.mapper"
            targetProject=".\src">
            <!-- enableSubPackages:是否讓schema作為包的字尾 -->
            <property name="enableSubPackages" value="false" />
        </sqlMapGenerator>
        <!-- targetPackage:mapper介面生成的位置 -->
        <javaClientGenerator type="XMLMAPPER"
            targetPackage="XXX.mapper"
            targetProject=".\src">
            <!-- enableSubPackages:是否讓schema作為包的字尾 -->
            <property name="enableSubPackages" value="false" />
        </javaClientGenerator>
        <!-- 指定資料庫表 -->
        <table schema="" tableName="你的資料庫表名"></table>此地方可以寫多個表名,一起生成檔案
        <!-- <table schema="" tableName="NDJFMXK"></table>
        <table schema="" tableName="SYSB_ZM"></table> -->
    </context>
</generatorConfiguration>

執行Java檔案,程式碼如下

一、FreemarkerUtil.java

public class FreemarkerUtil {

    public static String ControllerPackage  = "XXX.controller";
    
    public static String ServicePackage  = "XXX.service";
    
    public static List<String> TableNames = new ArrayList<String>();
    
    private static FreemarkerUtil fu = new FreemarkerUtil();
    public static void main(String[] args) {
        
        //新增表名
        TableNames.add("你自己的表名");//lzcwbh
        
        
        fu.CreateController();
        fu.CreateService();
    }

    //生成Controller
    public void CreateController(){
        
        for (String tablename : TableNames) {
            String[] split = tablename.toLowerCase().split("_");
            tablename = "";
            for (int i = 0; i < split.length; i++) {
                tablename += split[i].substring(0, 1).toUpperCase() + split[i].substring(1);
            }
            //1、建立資料模型
            Map<String,Object> root = new HashMap<String,Object>();
            //2、為資料模型新增值
            root.put("TableName", tablename);
            root.put("Package",ControllerPackage);
            root.put("ServicePackage", ServicePackage);
            //3、將資料模型和模板組合的資料輸出到控制檯
            //fu.print("controller.ftl", root);
            //生成模板
            fu.fprint("controller.ftl", root, tablename+"Controller.java");
        }
    }
    
        //生成Controller
        public void CreateService(){
            
            for (String tablename : TableNames) {
                String[] split = tablename.toLowerCase().split("_");
                tablename = "";
                for (int i = 0; i < split.length; i++) {
                    tablename += split[i].substring(0, 1).toUpperCase() + split[i].substring(1);
                }
                //1、建立資料模型
                Map<String,Object> root = new HashMap<String,Object>();
                //2、為資料模型新增值
                root.put("TableName", tablename);
                root.put("Package",ServicePackage);
                //3、將資料模型和模板組合的資料輸出到控制檯
                //fu.print("controller.ftl", root);
                //生成模板
                fu.fprint("service.ftl", root, tablename+"Service.java");
                root.put("Package",ServicePackage+".Impl");
                fu.fprint("serviceimpl.ftl", root, tablename+"ServiceImpl.java");
            }
        }
   
    public Template getTemplate(String name) {
        try {
            // 通過Freemaker的Configuration讀取相應的ftl
            Configuration cfg = new Configuration();
            // 設定去哪裡讀取相應的ftl模板檔案
            cfg.setClassForTemplateLoading(this.getClass(), "/ftl");
            // 在模板檔案目錄中找到名稱為name的檔案
            Template temp = cfg.getTemplate(name);
            return temp;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    public void print(String name, Map<String, Object> root) {
        try {
            // 通過Template可以將模板檔案輸出到相應的流
            Template temp = this.getTemplate(name);
            temp.process(root, new PrintWriter(System.out));
        } catch (TemplateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void fprint(String name, Map<String, Object> root, String outFile) {
        FileWriter out = null;
        try {
            String replace = root.get("Package").toString().replace(".", "/");
            String property = System.getProperty("user.dir").replace("\\", "/")+"/src/"+replace;
            File file = new File(property);
            if(!file.exists()){
                file.mkdirs();
            }
            // 通過一個檔案輸出流,就可以寫到相應的檔案中
            out = new FileWriter(new File(property, outFile));
            Template temp = this.getTemplate(name);
            temp.process(root, out);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TemplateException e) {
            e.printStackTrace();
        } finally {
            try {
                if (out != null)
                    out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

二、GeneratorSqlmap.java

public class GeneratorSqlmap {

    public void generator() throws Exception{

        List<String> warnings = new ArrayList<String>();
        boolean overwrite = true;
        //指定 逆向工程配置檔案
        File configFile = new File("generatorConfig.xml");
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(configFile);
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,
                callback, warnings);
        myBatisGenerator.generate(null);

    }
    public static void main(String[] args) throws Exception {
        try {
            GeneratorSqlmap generatorSqlmap = new GeneratorSqlmap();
            generatorSqlmap.generator();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

基本上就XML檔案和第一個Java檔案需要簡單配置,都配置好後在eclipse上本地執行後兩個Java檔案,你想要的實體類和mapper對映檔案就會自動生成出來,工作效率大增大笑