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

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

 
阅读更多

自己利用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 txin0814@sina.com
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 txin0814@sina.com
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     }
复制代码

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

分享到:
评论

相关推荐

    Java一键生成代码到controller层【源码】

    3、可大大提高开发效率,数据表创建完以后,自动生成entity,mapper.xml,dao,service,controller,vo,dto相关代码。 4、本项目集成了spring,aop,mybatis plus,swagger2,异常处理,分页,freemarker等多种技术。 5、操作...

    spring+mybatis+freemarker

    Spring+Mybatis+Freemarker 是一个常见的Java Web开发组合,用于构建高效、灵活的Web应用程序。这个组合中,Spring Boot 提供了便捷的项目初始化和自动配置功能,Mybatis 是一个轻量级的持久层框架,而 Freemarker ...

    spring mvc 3.0-mybatis-freemarker整合

    在本项目中,我们主要探讨的是如何将Spring MVC 3.0、MyBatis 3 和 Freemarker 2.3 这三个强大的技术框架整合在一起,以构建一个高效且灵活的Web应用程序。以下是对这些技术及其整合过程的详细说明: **Spring MVC ...

    Struts+spring+mybatis

    3. Action类中,Spring的依赖注入帮助获取到所需的Service对象,这些Service对象负责业务逻辑的实现。 4. Service对象会调用MyBatis的SqlSession,执行相应的Mapper XML文件中定义的SQL语句,完成对数据库的数据操作...

    SPRING3+STRUTS2+MYBATIS3简单例子

    **Spring3、Struts2和MyBatis3是Java企业级开发中三个核心的开源框架,它们各自在应用中承担着不同的职责。Spring3作为全面的框架,提供了依赖注入(DI)和面向切面编程(AOP)等功能,极大地简化了Java应用的复杂性...

    struts2.0 spring3 MyBatis

    Struts2.0 主要负责MVC(Model-View-Controller)架构中的控制层,Spring3 提供了全面的依赖注入(DI)和面向切面编程(AOP),以及服务层管理,而MyBatis 是一个轻量级的持久层框架,简化了数据库操作。 首先,...

    为mybatis生成映射文件

    这里使用的是 mySQL数据库 以及mybatis,ibatis的框架 这个项目主要是为了生成实体和映射文件而建的, 生成的文件有三类 model ,*mapper.xml,interface

    struts2+spring3+mybatis项目实例

    Struts2、Spring3和MyBatis是Java Web开发中常用的三大框架,它们结合使用能够构建出高效、灵活的企业级应用程序。在这个项目实例中,我们将深入探讨这三个框架如何协同工作,以及它们各自的核心功能。 首先,...

    struts2,spring3,mybatis整合图书

    Struts2、Spring3和MyBatis是Java开发中常用的三大框架,它们分别负责MVC模式中的动作控制、依赖注入和持久层操作。这三大框架的整合能够构建出高效、可维护性强的企业级Web应用。下面将详细阐述这三个框架的核心...

    软件推介:功能强大的代码自动生成工具,Auto,Maker-mybatis自动生成代码 (2).pdf

    2. **Mapper接口生成**:根据数据库表结构生成对应的Mybatis Mapper接口,包含基本的CRUD操作,并且支持唯一索引和多对一、一对多、多对多等关联查询。 3. **Service层生成**:生成Service接口及其实现类,提供数据...

    软件推介:功能强大的代码自动生成工具,Auto,Maker-mybatis自动生成代码.pdf

    - **Mapper生成**:根据数据库表结构,自动生成Mybatis的Mapper接口及XML配置文件,包含基本的CRUD操作,以及支持唯一索引的更新和删除。 - **Service生成**:创建服务层接口及实现,便于业务逻辑处理。 - **...

    springmvc mybatis freemarker

    Spring MVC、MyBatis 和 FreeMarker 是三个在Java Web开发中广泛应用的技术框架,它们共同构建了一个高效、灵活的Web应用程序架构。以下是对这三个技术的详细解释: **Spring MVC** Spring MVC是Spring框架的一个...

    struts2+spring3+mybatis3框架实例代码

    Struts2、Spring3和MyBatis3是Java开发中常用的三大开源框架,它们的集成应用在企业级项目中非常普遍。Struts2作为MVC(Model-View-Controller)框架,负责处理用户请求和控制应用程序流程;Spring3则是一个全面的...

    struts2+spring+mybatis

    【Struts2+Spring+Mybatis】框架整合详解 在Java Web开发中,Struts2、Spring和Mybatis是常见的三大框架,它们分别负责表现层、业务层和数据访问层的功能。Struts2作为MVC架构的一部分,负责处理HTTP请求和响应;...

    软件推介:功能强大的代码自动生成工具,Auto,Maker-mybatis自动生成代码 (2).docx

    - **数据库映射**:工具能够解析数据库结构,并自动生成对应的POJO(Plain Old Java Object)类,包含set/get方法以及Lombok注解,简化了对象模型的创建。 - **Mybatis映射器**:自动创建Mybatis的Mapper接口和XML...

    spring-boot-demo:一个基于Spring Boot & MyBatis的脚手架,代码生成易配置(没有集成mybatis generator,纯freemarker模板),快速开发中小型项目

    提供代码生成器根据表名生成对应的Domain(领域对象)、Mapper、MapperXML、Service、Controller等基础代码 没有集成mybatis generator,全部使用freemarker模板生成,模板随便改 代码生成提供Mysql、Sqlse

    基于spring mvc+mybatis的博客

    基于 Spring Boot 的个人博客 ...MyBatis 工具:MyBatis Mapper MVC 框架:Spring MVC 模板引擎:Freemarker 编译辅助插件:Lombok CSS 框架:BootStrap 4.0 Markdown 编辑器:Editor.md 数据库:MySQL

    软件推介:功能强大的代码自动生成工具,Auto,Maker-mybatis自动生成代码.docx

    Service层和Controller层的代码也可以自动生成,满足JSON服务和页面渲染的需求。 特别地,Auto Maker的前端界面生成功能包括EasyUI、Bootstrap+JSP和Bootstrap+FreeMarker,为开发者提供了多种选择,以适应不同的...

    MyBatis-plus+达梦数据库实现自动生成代码的示例

    通过 MyBatis-Plus Generator,你可以自定义模板来自动生成包括 Entity、Mapper、Mapper XML、Service 和 Controller 在内的代码。这通常涉及到以下步骤: 1. 创建一个配置文件(如 `generatorConfig.xml`),指定...

Global site tag (gtag.js) - Google Analytics