自己利用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 }
大致代码就是这么多,我在自己的项目中将这个功能界面化了,
相关推荐
3、可大大提高开发效率,数据表创建完以后,自动生成entity,mapper.xml,dao,service,controller,vo,dto相关代码。 4、本项目集成了spring,aop,mybatis plus,swagger2,异常处理,分页,freemarker等多种技术。 5、操作...
Spring+Mybatis+Freemarker 是一个常见的Java Web开发组合,用于构建高效、灵活的Web应用程序。这个组合中,Spring Boot 提供了便捷的项目初始化和自动配置功能,Mybatis 是一个轻量级的持久层框架,而 Freemarker ...
在本项目中,我们主要探讨的是如何将Spring MVC 3.0、MyBatis 3 和 Freemarker 2.3 这三个强大的技术框架整合在一起,以构建一个高效且灵活的Web应用程序。以下是对这些技术及其整合过程的详细说明: **Spring MVC ...
3. Action类中,Spring的依赖注入帮助获取到所需的Service对象,这些Service对象负责业务逻辑的实现。 4. Service对象会调用MyBatis的SqlSession,执行相应的Mapper XML文件中定义的SQL语句,完成对数据库的数据操作...
**Spring3、Struts2和MyBatis3是Java企业级开发中三个核心的开源框架,它们各自在应用中承担着不同的职责。Spring3作为全面的框架,提供了依赖注入(DI)和面向切面编程(AOP)等功能,极大地简化了Java应用的复杂性...
Struts2.0 主要负责MVC(Model-View-Controller)架构中的控制层,Spring3 提供了全面的依赖注入(DI)和面向切面编程(AOP),以及服务层管理,而MyBatis 是一个轻量级的持久层框架,简化了数据库操作。 首先,...
这里使用的是 mySQL数据库 以及mybatis,ibatis的框架 这个项目主要是为了生成实体和映射文件而建的, 生成的文件有三类 model ,*mapper.xml,interface
Struts2、Spring3和MyBatis是Java Web开发中常用的三大框架,它们结合使用能够构建出高效、灵活的企业级应用程序。在这个项目实例中,我们将深入探讨这三个框架如何协同工作,以及它们各自的核心功能。 首先,...
Struts2、Spring3和MyBatis是Java开发中常用的三大框架,它们分别负责MVC模式中的动作控制、依赖注入和持久层操作。这三大框架的整合能够构建出高效、可维护性强的企业级Web应用。下面将详细阐述这三个框架的核心...
2. **Mapper接口生成**:根据数据库表结构生成对应的Mybatis Mapper接口,包含基本的CRUD操作,并且支持唯一索引和多对一、一对多、多对多等关联查询。 3. **Service层生成**:生成Service接口及其实现类,提供数据...
- **Mapper生成**:根据数据库表结构,自动生成Mybatis的Mapper接口及XML配置文件,包含基本的CRUD操作,以及支持唯一索引的更新和删除。 - **Service生成**:创建服务层接口及实现,便于业务逻辑处理。 - **...
Spring MVC、MyBatis 和 FreeMarker 是三个在Java Web开发中广泛应用的技术框架,它们共同构建了一个高效、灵活的Web应用程序架构。以下是对这三个技术的详细解释: **Spring MVC** Spring MVC是Spring框架的一个...
Struts2、Spring3和MyBatis3是Java开发中常用的三大开源框架,它们的集成应用在企业级项目中非常普遍。Struts2作为MVC(Model-View-Controller)框架,负责处理用户请求和控制应用程序流程;Spring3则是一个全面的...
【Struts2+Spring+Mybatis】框架整合详解 在Java Web开发中,Struts2、Spring和Mybatis是常见的三大框架,它们分别负责表现层、业务层和数据访问层的功能。Struts2作为MVC架构的一部分,负责处理HTTP请求和响应;...
- **数据库映射**:工具能够解析数据库结构,并自动生成对应的POJO(Plain Old Java Object)类,包含set/get方法以及Lombok注解,简化了对象模型的创建。 - **Mybatis映射器**:自动创建Mybatis的Mapper接口和XML...
提供代码生成器根据表名生成对应的Domain(领域对象)、Mapper、MapperXML、Service、Controller等基础代码 没有集成mybatis generator,全部使用freemarker模板生成,模板随便改 代码生成提供Mysql、Sqlse
基于 Spring Boot 的个人博客 ...MyBatis 工具:MyBatis Mapper MVC 框架:Spring MVC 模板引擎:Freemarker 编译辅助插件:Lombok CSS 框架:BootStrap 4.0 Markdown 编辑器:Editor.md 数据库:MySQL
Service层和Controller层的代码也可以自动生成,满足JSON服务和页面渲染的需求。 特别地,Auto Maker的前端界面生成功能包括EasyUI、Bootstrap+JSP和Bootstrap+FreeMarker,为开发者提供了多种选择,以适应不同的...
通过 MyBatis-Plus Generator,你可以自定义模板来自动生成包括 Entity、Mapper、Mapper XML、Service 和 Controller 在内的代码。这通常涉及到以下步骤: 1. 创建一个配置文件(如 `generatorConfig.xml`),指定...