数据库逆向生成实体类和映射文件

首先需要几个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> -->

此处更新一段代码:如此生成java代码后会有个问题,数据库里number型字段会被生成bigdecimal型,
其他也有可能会改变,暂时还没遇到,但是可以有规避方法~
此处是配置你数据库想要的对应的表名:
<table schema="" tableName="NDJFMXK">
    <!-- 此处可以配置上你想要生成的对应的java代码类型,以number类型举例,这样生成的java实体类该列的类型就是integer了 -->
    <columnOverride column="列名" javaType="java.lang.Integer"></columnOverride>
</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映射文件就会自动生成出来,工作效率大增大笑

private void btnCreateEntity_Click(object sender, EventArgs e) { HeaderOfEntity HeaderOfEntity = new HeaderOfEntity(); DataTable dt = new DataTable(); #region 实例化一个实体,并为这个实体类赋值 //实体类名不能为空 if (txtClassName.Text == "") { MessageBox.Show("类名不能为空!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } else { HeaderOfEntity.ClassName = txtClassName.Text.Trim(); } //实体类的说明 if (txtClassExplain.Text != "") { HeaderOfEntity.ClassExplain = txtClassExplain.Text.Trim(); } else { HeaderOfEntity.ClassExplain = ""; } //实体类的作者 if (txtAuthor.Text != "") { HeaderOfEntity.ClassAuthor = txtAuthor.Text.Trim(); } else { HeaderOfEntity.ClassAuthor = ""; } //类的命名空间 if (txtNamespace.Text != "") { HeaderOfEntity.NameSpace = txtNamespace.Text.Trim(); } else { HeaderOfEntity.NameSpace = ""; } #endregion #region 将dataGridView中的数据复制出来,复制到DataTable中,做为参数 //添加列 for (int i = 0; i < dgvAttribute.Columns.Count; i++) { dt.Columns.Add(dgvAttribute.Columns[i].Name); } //添加行 for (int j = 0; j < dgvAttribute.Rows.Count; j++) { DataRow dr = dt.NewRow(); for (int k = 0; k < dgvAttribute.Columns.Count; k++) { dr[k] = dgvAttribute.Rows[j].Cells[k].Value; } dt.Rows.Add(dr); } #endregion string strFileName = "\\" + txtClassName.Text + ".cs"; //实例化一个接口对象 IWriteEntity writeEntity = new WriteEntity(); string strPath = "../../CreateClass"; FileStream fs; if (!File.Exists(strPath + strFileName)) { fs = new FileStream(strPath + strFileName, FileMode.Create,FileAccess.Write); } else { fs = new FileStream(strPath + strFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); } if (writeEntity.Write(fs, dt, HeaderOfEntity) == true) { MessageBox.Show("写入文件成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } else { MessageBox.Show("写入文件失败!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值