`
ssxxjjii
  • 浏览: 948259 次
  • 性别: 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     }
复制代码

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

分享到:
评论

相关推荐

    springmvc+mybatis 和一个简单的freemarker代码生成工具

    在实际项目中,一个简单的代码生成工具可能会利用SpringMVC和MyBatis的组合,通过用户输入的表结构信息,自动生成对应的实体类、Mapper接口、Mapper XML文件以及FreeMarker模板。这样的工具可以极大地提高开发效率,...

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

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

    Spring boot + Mybatis + Freemarker

    Spring Boot简化了Spring应用的初始搭建以及开发过程,MyBatis则是一个轻量级的持久层框架,用于处理数据库操作,而FreeMarker则是一个动态模板引擎,用于生成HTML或者其他格式的输出。下面将详细阐述这三个框架的...

    使用freemarker生成controller service impl pojo dao mapper

    - FreeMarker解析模板并生成对应的Java代码或XML文件。 - 将生成的文件引入项目,编译并运行。 通过以上步骤,开发者可以利用FreeMarker自动化生成MVC流程中的各个组件,极大地提高了开发效率,减少了错误和重复...

    spring+mybatis+freemarker

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

    spring boot mybatis freemarker整合项目

    《Spring Boot、MyBatis与Freemarker的深度整合指南》 在当今的Java开发领域,Spring Boot以其简洁的配置和强大的功能集成为开发者所喜爱。而MyBatis作为轻量级的持久层框架,提供了灵活的SQL操作,极大地提高了...

    SpringMVC-Spring-Mybatis-Freemarker整合

    【SpringMVC-Spring-Mybatis-Freemarker整合】是一个常见的Java Web开发技术栈,主要涉及了四个关键组件:Spring MVC(模型-视图-控制器)、Spring(核心框架)、Mybatis(持久层框架)以及Freemarker(模板引擎)。...

    spring4mvc+mybatis3+freemarker+oracle完整框架demo

    这是一个基于Spring4、MyBatis3、FreeMarker和Oracle数据库构建的完整Web应用程序框架的示例项目。这个项目提供了一套快速开发的基础架构,开发者可以在此基础上直接进行业务逻辑的编写,大大节省了项目的初始化时间...

    spring mvc 3.0-mybatis-freemarker整合

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

    maven+springmvc+mybatis+freemarker整合框架

    在"springmvc_mybatis"这个压缩包中,很可能包含了SpringMVC和MyBatis的相关配置文件,如Spring的bean配置文件(xml或Java配置),MyBatis的Mapper接口和XML配置文件,以及Freemarker的模板文件。开发者通常会在这里...

    《Spring MVC MYBatis企业应用实战+源码》

    《Spring MVC MYBatis企业应用实战+源码》是一份深度探讨如何在企业环境中整合并高效使用Spring MVC和MyBatis两大主流Java框架的资源包。这个资源包含了一本PDF电子书《spring+mybatis企业应用实战》以及配套的源...

    Struts+spring+mybatis

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

    Spring+MYBatis企业应用实战pdf

    《Spring+MYBatis企业应用实战》是一本深入解析如何在实际项目中集成并高效使用Spring和MyBatis框架的指南。Spring是一个全面的Java应用框架,提供了丰富的功能,包括依赖注入、AOP(面向切面编程)、MVC(模型-视图...

    springMvc+myBatis+freemarker+maven

    1. **配置Maven**:在pom.xml文件中,添加Spring MVC、MyBatis、Freemarker等相关依赖,确保项目可以正确构建并运行。 2. **Spring MVC配置**:创建Spring的配置文件,如`dispatcher-servlet.xml`,配置...

    【ssm框架】 spring+springMVC+mySQL+myBatis+freemarker+Maven小示例1

    3. `src/main/resources`:存放配置文件,如Spring配置文件、MyBatis的Mapper XML文件等。 4. `src/main/webapp`:Web应用目录,包含静态资源(如HTML、CSS、JavaScript)、Freemarker模板文件和Web应用配置(如WEB-...

    mybatis-plus自定义模板.zip

    在默认情况下,Mybatis-Plus提供了丰富的代码生成器,可以帮助开发者快速生成实体类、Mapper接口、Mapper XML文件以及Service接口和实现类。然而,有时候我们可能需要根据项目需求进行一些定制化,比如修改生成模板...

    基于spring mvc、mybatis、freemarker架构实战大型门户网站源码

    6. **Controller层实现**:编写Controller,处理前端请求,调用Service层方法,并将结果返回给FreeMarker模板进行渲染。 7. **安全性考虑**:了解如何使用Spring Security或者Apache Shiro进行权限控制,保护敏感...

    管理系统系列--系统使用SSM(SpringMVC + Spring + Mybatis + Freemarker .zip

    5. **配置Spring**:设置bean的定义,包括Controller、Service、Mapper等,实现依赖注入。 6. **编写Controller**:处理HTTP请求,调用Service方法,将结果传递给视图层。 7. **设计Freemarker模板**:创建...

    SpringBoot mybatis druid pagehelper freemarker 整合实例

    1. **配置SpringBoot**:在`pom.xml`中添加对应的依赖,包括SpringBoot的starter-web、mybatis-spring-boot-starter、druid-spring-boot-starter以及freemarker-spring-boot-starter。 2. **配置MyBatis**:创建`...

    好用的mybatis代码自动生成插件

    4. **运行插件**:在Eclipse中,右键点击`generatorConfig.xml`文件,选择“Run As” -&gt; "MyBatis Generator",插件会读取配置文件并根据设定自动生成对应的代码。 5. **检查生成的代码**:生成的代码会出现在你在`...

Global site tag (gtag.js) - Google Analytics