Spring3 Mybatis3 freemarker 自动生成对应表的model、mapper、service、controller并自动修改mybatis配

标签: spring3 mybatis3 freemarker | 发表时间:2013-12-29 15:33 | 作者:ssxxjjii
出处:http://www.iteye.com

自己利用spring3、mybatis3进行开发时,前期花费了大量的时间去写对应的model、mapper、service文件,并想到用freemarker来动态生成对应的JAVA文件.

开发思路:

  其实就是将数据库中的表取出来,表名作为类名,并把对应的列名取出来,作为字段名称,然后通过 freemarker定制的模版去生成相关的文件即可。

  我这里只举例说明如何生成对应的model文件,其它的可以直接COPY改改就成,示例代码如下:

      首先定义一个对象SqlColumnData包含两个属性columnName(列名称),columnType(列类型),具体定义如下 :  

 

 1 package org.study.job.domain;
 2 /**
 3  * SqlColumnData.java Create on 2012-6-15上午10:37:47
 4  * 
 5  * 
 6  * Copyright (c) 2012 by MTA.
 7  * 
 8  * @author lmeteor
 9  * @Email [email protected]
10  * @description
11  * @version 1.0
12  */
13 public class SqlColumnData
14 {
15 
16     private String columnName;
17     
18     private String columnType;
19 
20     public String getColumnName()
21     {
22         return columnName;
23     }
24 
25     public void setColumnName(String columnName)
26     {
27         this.columnName = columnName;
28     }
29 
30     public String getColumnType()
31     {
32         return columnType;
33     }
34 
35     public void setColumnType(String columnType)
36     {
37         this.columnType = columnType;
38     }
39     
40     
41 }

     下面三个方法作用如下:

//用来获取指定表的所有列名及类型 
public List<SqlColumnData> getColumnDatas(String tableName)
//将列名生成对应的field 和 method
public String getBeanField(String tableName) throws SQLException
//将数据库类型转换成对应的JAVA类型
publicString getType(String type)
  1 /**
  2      * 获取指定表的所有列名
  3      * 
  4      * @param tableName
  5      * @return
  6      * @throws SQLException
  7      */
  8     public List<SqlColumnData> getColumnDatas(String tableName)
  9             throws SQLException
 10     {
 11         String sqlColumns = "SELECT COLUMN_NAME, DATA_TYPE FROM information_schema.columns WHERE table_name =  '"
 12                 + tableName + "' order by ordinal_position";
 13         Connection conn = null;
 14         PreparedStatement pst = null;
 15         ResultSet rs = null;
 16         List<SqlColumnData> columnList = new ArrayList<SqlColumnData>();
 17         try
 18         {
 19             conn = sqlDialect.getConn();
 20             pst = conn.prepareStatement(sqlColumns);
 21             rs = pst.executeQuery();
 22             while (rs.next())
 23             {
 24                 String name = rs.getString(1);
 25                 String type = rs.getString(2);
 26                 type = this.getType(type);
 27                 SqlColumnData cd = new SqlColumnData();
 28                 cd.setColumnName(name.toLowerCase());
 29                 cd.setColumnType(type);
 30                 columnList.add(cd);
 31             }
 32 
 33         }
 34         catch ( Exception e )
 35         {
 36             e.printStackTrace();
 37         }
 38         finally
 39         {
 40             try
 41             {
 42                 if (conn != null) conn.close();
 43                 if (pst != null) pst.close();
 44                 if (rs != null) rs.close();
 45             }
 46             catch ( SQLException e )
 47             {
 48                 e.printStackTrace();
 49             }
 50         }
 51         return columnList;
 52     }
 53 
 54     /**
 55      * 将列名生成对应的field 和 method
 56      * 
 57      * @param tableName
 58      * @return
 59      * @throws SQLException
 60      */
 61     public String getBeanField(String tableName) throws SQLException
 62     {
 63         List<SqlColumnData> dataList = getColumnDatas(tableName);
 64         StringBuffer str = new StringBuffer();
 65         StringBuffer getset = new StringBuffer();
 66         for (SqlColumnData d : dataList)
 67         {
 68             String name = d.getColumnName().toLowerCase();
 69             String type = d.getColumnType();
 70             String maxChar = name.substring(0, 1).toUpperCase();
 71             str.append("\r\t").append("private ").append(type + " ").append(
 72                     name).append(";\n");
 73             String method = maxChar + name.substring(1, name.length());
 74             getset.append("\r\t").append("public ").append(type + " ").append(
 75                     "get" + method + "()\n\t{\n");
 76             getset.append("\t\t").append("return this.").append(name).append(";\n\t}\n");
 77             getset.append("\r\t").append("public void ").append(
 78                     "set" + method + "(" + type + " " + name + ")\n\t{\n");
 79             getset.append("\t\t").append("this." + name + "=").append(name).append(
 80                     ";\n\t}\n");
 81         }
 82         argv = str.toString();
 83         method = getset.toString();
 84         return argv + method;
 85     }
 86 
 87     private String argv;
 88     private String method;
 89 
 90     /**
 91      * 将数据库类型转换成对应的JAVA类型
 92      * 
 93      * @param type
 94      * @return
 95      */
 96     public String getType(String type)
 97     {
 98         type = type.toLowerCase();
 99         if ("char".equals(type) || "varchar".equals(type)
100                 || "nvarchar".equals(type))
101         {
102             return "String";
103         }
104         else if ("int".equals(type))
105         {
106             return "Integer";
107         }
108         else if ("bigint".equals(type))
109         {
110             return "Long";
111         }
112         else if ("timestamp".equals(type) || "date".equals(type)
113                 || "datetime".equals(type))
114         {
115             return "java.sql.Timestamp";
116         }
117         else if ("decimal".equals(type))
118         {
119             return "Double";
120         }
121         else if ("image".equals(type))
122         {
123             return "byte[]";
124         }
125         else if ("smallint".equals(type))
126         {
127             return "int";
128         }
129         return null;
130     }

 

/**
     * 将表名转成class名称
     * 
     * @param tableName
     * @return
     */
    public String getTableNameToClassName(String tableName)
    {
        String[] splits = tableName.toLowerCase().split("_");
        if (splits.length > 0)
        {
            StringBuffer className = new StringBuffer();
            for (String split : splits)
            {
                String tempTableName = split.substring(0, 1).toUpperCase()
                        + split.substring(1);
                className.append(tempTableName);
            }
            return className.toString();
        }
        else
        {
            String className = splits[0].substring(0, 1).toUpperCase()
                    + splits[0].substring(1);
            return className;
        }
    }

SQL方面就准备的差不多了,现在开始准备对应的模版文件,如下:

我这里使用的freemarker

 1 package org.study.job.domain;
 2 
 3 import java.io.Serializable;
 4 /**
 5  * ${className?default('')}.java Create on ${datetime?default('')}
 6  * 
 7  * 
 8  * Copyright (c) 2012 by MTA.
 9  * 
10  * @author lmeteor
11  * @Email [email protected]
12  * @description
13  * @version 1.0
14  */
15 @SuppressWarnings("serial")
16 public class ${className?default('')} implements Serializable 
17 {
18     ${feilds?default('')}
19 }

用freemarker通过模版创建文件:

 1 /**
 2      * 创建静态文件
 3      * 
 4      * @param templateFileName
 5      *            模板文件名,例如:/WEB-INF/view/temp.ftl
 6      * @param propMap
 7      *            用于处理模板的属性object映射
 8      * @param htmlFilePath
 9      *            要生成的静态文件的路径,例如:/WEB-INF/view/1/2012/5/5
10      * @param htmlFileName
11      *            要生成的文件名:例如:1.html
12      * @param templateFilePath
13      *            模版路径
14      */
15     @SuppressWarnings(
16     { "unchecked" })
17     public static void createHtmlFile(String templateFileName, Map propMap,
18             String htmlFilePath, String htmlFileName, String templateFilePath)
19     {
20         try
21         {
22             Template t = getFreemarkerCFG(templateFilePath).getTemplate(
23                     templateFileName);
24             //createDirs(htmlFilePath);
25             File file = null;
26             if(StringTools.isEmpty(htmlFileName))file = new File(htmlFilePath);
27             else file = new File(htmlFilePath + "/" + htmlFileName);
28             if(!file.exists())file.createNewFile();
29             else file.delete();
30             Writer out = new BufferedWriter(new OutputStreamWriter(
31                     new FileOutputStream(file),"UTF-8"));
32             t.process(propMap, out);
33             out.flush();
34             out.close();
35             logger.info("文件:"+htmlFilePath+"生成成功。");
36         }
37         catch ( IOException e )
38         {
39             e.printStackTrace();
40         }
41         catch ( TemplateException e )
42         {
43             e.printStackTrace();
44         }
45     }

 

现在该准备的都准备好了,准备开始实际调用如下

 1 /**
 2      * 生成JAVAMODULE文件
 3      * @param tableName
 4      */
 5     public static void createJavaModuleFile(String tableName)
 6     {
 7         String className = sqlutil.getTableNameToClassName(tableName);
 8         // 生成到指定的目录下
 9         String modelPath = "domain\\" + className + ".java";
10         Map<String,Object> context = new HashMap<String,Object>();
11         context.put("className", className); //
12         context.put("tableName", tableName);
13         context.put("datetime", DateTools.getDateTools().format(new Date()));
14         /****************************** 生成bean字段 *********************************/
15         try
16         {
17             context.put("feilds", sqlutil.getBeanField(tableName)); // 生成bean
18             logger.info("请稍侯,正在生成Bean属性及GET、SET方法");
19         }
20         catch ( Exception e )
21         {
22             e.printStackTrace();
23         }
24         // -------------------生成文件代码---------------------/
25         CreateHtml.createHtmlFile("TempBean.ftl", context, PCKPATH+modelPath, null, TEMPLATE_FILEPATH);
26     }

大致代码就是这么多,我在自己的项目中将这个功能界面化了,



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [spring3 mybatis3 freemarker] 推荐:

Spring3 Mybatis3 freemarker 自动生成对应表的model、mapper、service、controller并自动修改mybatis配

- - 互联网 - ITeye博客
自己利用spring3、mybatis3进行开发时,前期花费了大量的时间去写对应的model、mapper、service文件,并想到用freemarker来动态生成对应的JAVA文件..   其实就是将数据库中的表取出来,表名作为类名,并把对应的列名取出来,作为字段名称,然后通过 freemarker定制的模版去生成相关的文件即可.

freemarker生成word

- - 开源软件 - ITeye博客
freemarker生成word.          利用freemarker生成word,在项目中有用到,就单独写个测试以及用法列出来,欢迎圈错,共同学习.       一、应用场景和效果图.             1.应用场景:.                    a.xx项目里面需要定期生成xx报告,记录最近xx情况.

剖析Spring3.x的“自动性”

- -
《剖析Spring3.x的“自动性”》. 其实这篇博文,只是有感而发,或者说是对之前博客(. 详解SSJ(Spring3.x mvc + Spring3.x Core + JPA2.x)轻量级集成开发目录汇总. )不全面或者遗漏的一种补充. 算了,不扯那么远了,直接进入正题. 二、自动装配时如果被装配的对象构造带参数怎么办.

maven工程下整合spring+mybatis+freemarker

- - CSDN博客架构设计推荐文章
博客地址:http://zhengyinhui.com/?p=142. 由于工作主要是前端开发,做后端的项目比较少,最近自己做个项目,发觉好多的都忘了,这里写篇博客整理下maven工程下整合spring+mybatis+freemarker相关内容. 新建个Archetype为maven-archetype-webapp的maven项目(安装maven插件:http://download.eclipse.org/technology/m2e/releases),在pom文件添加相关依赖:.

java导出word之freemarker导出

- - 企业架构 - ITeye博客
       一,简单模板导出(不含图片, 不含表格循环).          1, 新建一个word文档, 输入如下类容:.          2, 将该word文件另存为xml格式(注意是另存为,不是直接改扩展名).          3, 将xml文件的扩展名直接改为ftl.          4, 用java代码完成导出(需要导入freemarker.jar).

Spring整合freemarker发送邮件

- - CSDN博客推荐文章
在上一篇博文:  使用JavaMail发送邮件和接受邮件, 我们学习了原生的JavaApi发送邮件, 我们会发现代码比较多, 特别是当邮件内容很丰富的时候, 我们需要在Java中拼装Html, 是不是觉得非常麻烦. . 下面我们使用一种比较简单的方法: spring + javaMail + freemarker, 使用freemarker模板引擎后, 我们就不用再在Java中拼装html..

struts2中使用freemarker 生成静态页面

- - CSDN博客推荐文章
2.导入struts2的相关jar文件. 3.在web.xml中配置如下:. 4.创建struts.xml文件,具体内容如下:. 在配置视图类型时,也可以直接用type="freemarker"这个访问指定的模板,在这里我用的是动态访问生成的html页面. 5,创建javaBean  User.java.

基于springboot的freemarker创建指定格式的word文档

- - 互联网 - ITeye博客
       在web或其他应用中,经常我们需要导出或者预览word文档,比较实际的例子有招聘网站上预览或者导出个人简历,使用POI导出excel会非常的方便,但是如果想导出word,由于其格式控制非常复杂,故而使用POI将会非常麻烦,而FreeMarker则可以较好的解决这个问题;并且,根据FreeMarker的实现原理,预览word也会变得非常简单.

使用FreeMarker替换JSP的10个理由

- - ImportNew
你还在使用 Java 服务器页面(俗称JSP)吗. 我曾经也是,但是几年前我抛弃了它们,并且再也没有用过JSP了. JSP 是个很好的概念,但是它却剥夺了 web 开发的乐趣. 对我而言,这些都是小事,比如无法在页面模板上使用单独的文件header.jsp 和 footer.jsp,不能调用表达式语言的方法,在运行时无法合并,重新排列页面的各个部分.

FreeMarker 快速入门 - JavaEE教程 - SegmentFault 思否

- -
FreeMarker 快速入门. FreeMarker是一个很值得去学习的模版引擎. 它是基于模板文件生成其他文本的通用工具. 本章内容通过如何使用FreeMarker生成Html web 页面 和 代码自动生成工具来快速了解FreeMarker. FreeMarker是一款用java语言编写的模版引擎,它虽然不是web应用框架,但它很合适作为web应用框架的一个组件.