自己利用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的组合,通过用户输入的表结构信息,自动生成对应的实体类、Mapper接口、Mapper XML文件以及FreeMarker模板。这样的工具可以极大地提高开发效率,...
3、可大大提高开发效率,数据表创建完以后,自动生成entity,mapper.xml,dao,service,controller,vo,dto相关代码。 4、本项目集成了spring,aop,mybatis plus,swagger2,异常处理,分页,freemarker等多种技术。 5、操作...
Spring Boot简化了Spring应用的初始搭建以及开发过程,MyBatis则是一个轻量级的持久层框架,用于处理数据库操作,而FreeMarker则是一个动态模板引擎,用于生成HTML或者其他格式的输出。下面将详细阐述这三个框架的...
- FreeMarker解析模板并生成对应的Java代码或XML文件。 - 将生成的文件引入项目,编译并运行。 通过以上步骤,开发者可以利用FreeMarker自动化生成MVC流程中的各个组件,极大地提高了开发效率,减少了错误和重复...
Spring+Mybatis+Freemarker 是一个常见的Java Web开发组合,用于构建高效、灵活的Web应用程序。这个组合中,Spring Boot 提供了便捷的项目初始化和自动配置功能,Mybatis 是一个轻量级的持久层框架,而 Freemarker ...
《Spring Boot、MyBatis与Freemarker的深度整合指南》 在当今的Java开发领域,Spring Boot以其简洁的配置和强大的功能集成为开发者所喜爱。而MyBatis作为轻量级的持久层框架,提供了灵活的SQL操作,极大地提高了...
【SpringMVC-Spring-Mybatis-Freemarker整合】是一个常见的Java Web开发技术栈,主要涉及了四个关键组件:Spring MVC(模型-视图-控制器)、Spring(核心框架)、Mybatis(持久层框架)以及Freemarker(模板引擎)。...
这是一个基于Spring4、MyBatis3、FreeMarker和Oracle数据库构建的完整Web应用程序框架的示例项目。这个项目提供了一套快速开发的基础架构,开发者可以在此基础上直接进行业务逻辑的编写,大大节省了项目的初始化时间...
在本项目中,我们主要探讨的是如何将Spring MVC 3.0、MyBatis 3 和 Freemarker 2.3 这三个强大的技术框架整合在一起,以构建一个高效且灵活的Web应用程序。以下是对这些技术及其整合过程的详细说明: **Spring MVC ...
在"springmvc_mybatis"这个压缩包中,很可能包含了SpringMVC和MyBatis的相关配置文件,如Spring的bean配置文件(xml或Java配置),MyBatis的Mapper接口和XML配置文件,以及Freemarker的模板文件。开发者通常会在这里...
《Spring MVC MYBatis企业应用实战+源码》是一份深度探讨如何在企业环境中整合并高效使用Spring MVC和MyBatis两大主流Java框架的资源包。这个资源包含了一本PDF电子书《spring+mybatis企业应用实战》以及配套的源...
3. Action类中,Spring的依赖注入帮助获取到所需的Service对象,这些Service对象负责业务逻辑的实现。 4. Service对象会调用MyBatis的SqlSession,执行相应的Mapper XML文件中定义的SQL语句,完成对数据库的数据操作...
《Spring+MYBatis企业应用实战》是一本深入解析如何在实际项目中集成并高效使用Spring和MyBatis框架的指南。Spring是一个全面的Java应用框架,提供了丰富的功能,包括依赖注入、AOP(面向切面编程)、MVC(模型-视图...
1. **配置Maven**:在pom.xml文件中,添加Spring MVC、MyBatis、Freemarker等相关依赖,确保项目可以正确构建并运行。 2. **Spring MVC配置**:创建Spring的配置文件,如`dispatcher-servlet.xml`,配置...
3. `src/main/resources`:存放配置文件,如Spring配置文件、MyBatis的Mapper XML文件等。 4. `src/main/webapp`:Web应用目录,包含静态资源(如HTML、CSS、JavaScript)、Freemarker模板文件和Web应用配置(如WEB-...
在默认情况下,Mybatis-Plus提供了丰富的代码生成器,可以帮助开发者快速生成实体类、Mapper接口、Mapper XML文件以及Service接口和实现类。然而,有时候我们可能需要根据项目需求进行一些定制化,比如修改生成模板...
6. **Controller层实现**:编写Controller,处理前端请求,调用Service层方法,并将结果返回给FreeMarker模板进行渲染。 7. **安全性考虑**:了解如何使用Spring Security或者Apache Shiro进行权限控制,保护敏感...
5. **配置Spring**:设置bean的定义,包括Controller、Service、Mapper等,实现依赖注入。 6. **编写Controller**:处理HTTP请求,调用Service方法,将结果传递给视图层。 7. **设计Freemarker模板**:创建...
1. **配置SpringBoot**:在`pom.xml`中添加对应的依赖,包括SpringBoot的starter-web、mybatis-spring-boot-starter、druid-spring-boot-starter以及freemarker-spring-boot-starter。 2. **配置MyBatis**:创建`...
4. **运行插件**:在Eclipse中,右键点击`generatorConfig.xml`文件,选择“Run As” -> "MyBatis Generator",插件会读取配置文件并根据设定自动生成对应的代码。 5. **检查生成的代码**:生成的代码会出现在你在`...