SpringBoot学习之生成代码(四)

在templates创建Controeller.java.ftl

package ${packageName}.controller;

import ${packageName}.model.${modelName};
import ${packageName}.service.${serviceName};
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.GetMapping;
import java.util.List;

@RestController
public class ${controllerName}{

@Autowired
${serviceName} ${serviceName?uncap_first};

@GetMapping("/${modelName?lower_case}s")
public List<${modelName}> getAll${modelName}s(){
return ${serviceName?uncap_first}.getAll${modelName}s();
}
}

在templates下创建Mapper.java.ftl

package ${packageName}.mapper;

import ${packageName}.model.${modelName};
import org.apache.ibatis.annotations.Mapper;
import java.util.List;

@Mapper
public interface ${mapperName}{
List<${modelName}> getAll${modelName}s();
}

在templates下创建Mapper.xml.ftl

<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="${packageName}.mapper.${mapperName}">

    <resultMap id="BaseResultMap" type="${packageName}.model.${modelName}">
        <#list columns as column>
            <<#if column.primary??>id<#else>result</#if> column="${column.columnName}" property="${column.propertyName?uncap_first}" jdbcType="<#if column.type='INT'>INTEGER<#elseif column.type='DATETIME'>TIMESTAMP<#elseif column.type='TEXT'>VARCHAR<#else>${column.type}</#if>" />
        </#list>
    </resultMap>

    <select id="getAll${modelName}s" resultMap="BaseResultMap">
        select * from ${tableName};
    </select>
</mapper>

在templates下创建Model.xml.ftl

package ${packageName}.model;

import java.util.Date;

public class ${modelName}{
    <#if columns??>
        <#list columns as column>
            <#if column.type='VARCHAR'||column.type='TEXT'||column.type="CHAR">
                /*
                *${column.remark}
                */
                private String ${column.propertyName?uncap_first};
            </#if>
            <#if column.type='INT'>
                /*
                *${column.remark}
                */
                private Integer ${column.propertyName?uncap_first};
            </#if>
            <#if column.type='DATETIME'>
                /*
                *${column.remark}
                */
                private Date ${column.propertyName?uncap_first};
            </#if>
            <#if column.type='BIGINT'>
                /*
                *${column.remark}
                */
                private Long ${column.propertyName?uncap_first};
            </#if>
            <#if column.type='DOUBLE'>
                /*
                *${column.remark}
                */
                private Double ${column.propertyName?uncap_first};
            </#if>
            <#if column.type='BIT'>
                /*
                *${column.remark}
                */
                private Boolean ${column.propertyName?uncap_first};
            </#if>
        </#list>
    </#if>
    <#if columns??>
        <#list columns as column>
            <#if column.type='VARCHAR'||column.type='TEXT'||column.type="CHAR">
                public String get${column.propertyName}(){
                    return ${column.propertyName?uncap_first};
                }
                public void set${column.propertyName}(String ${column.propertyName?uncap_first} ){
                    this.${column.propertyName?uncap_first}=${column.propertyName?uncap_first};
                }
            </#if>
            <#if column.type='INT'>
                public Integer get${column.propertyName}(){
                    return ${column.propertyName?uncap_first};
                }
                public void set${column.propertyName}(Integer ${column.propertyName?uncap_first} ){
                    this.${column.propertyName?uncap_first}=${column.propertyName?uncap_first};
                }
            </#if>
            <#if column.type='DATETIME'>
                public Date get${column.propertyName}(){
                    return ${column.propertyName?uncap_first};
                }
                public void set${column.propertyName}(Date ${column.propertyName?uncap_first} ){
                    this.${column.propertyName?uncap_first}=${column.propertyName?uncap_first};
                }
            </#if>
            <#if column.type='BIGINT'>
                public Long get${column.propertyName}(){
                    return ${column.propertyName?uncap_first};
                }
                public void set${column.propertyName}(Long ${column.propertyName?uncap_first} ){
                    this.${column.propertyName?uncap_first}=${column.propertyName?uncap_first};
                }
            </#if>
            <#if column.type='DOUBLE'>
                public Double get${column.propertyName}(){
                    return ${column.propertyName?uncap_first};
                }
                public void set${column.propertyName}(Double ${column.propertyName?uncap_first} ){
                    this.${column.propertyName?uncap_first}=${column.propertyName?uncap_first};
                }
            </#if>
            <#if column.type='BIT'>
                public Boolean get${column.propertyName}(){
                    return ${column.propertyName?uncap_first};
                }
                public void set${column.propertyName}(Boolean ${column.propertyName?uncap_first} ){
                    this.${column.propertyName?uncap_first}=${column.propertyName?uncap_first};
                }
            </#if>
        </#list>
    </#if>
}

在templates下创建Service.java.ftl

package ${packageName}.service;

import ${packageName}.model.${modelName};
import ${packageName}.mapper.${mapperName};
import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;

@Service
public class ${serviceName}{

@Autowired
${mapperName} ${mapperName?uncap_first};
public List<${modelName}> getAll${modelName}s(){
return ${mapperName?uncap_first}.getAll${modelName}s();
}
}

创建DbController类

package org.hx.springboot_generatecode_demo10.controller;

import com.google.common.base.CaseFormat;
import org.hx.springboot_generatecode_demo10.model.Db;
import org.hx.springboot_generatecode_demo10.model.RespBean;
import org.hx.springboot_generatecode_demo10.model.TableClass;
import org.hx.springboot_generatecode_demo10.utils.DBUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@RestController
public class DbController {
    @PostMapping("/connect")
    public RespBean connect(@RequestBody Db db){
        Connection con = DBUtils.initDb(db);
        if (con != null)
        {
            return  RespBean.ok("数据库连接成功");
        }
        return RespBean.error("数据库连接失败");
    }
    @PostMapping("/config")
    public RespBean config(@RequestBody Map<String,String > map){
        String packageName = map.get("packageName");
        try {
            //DatabaseMetaData类是java.sql包中的类,利用它可以获取我们连接到的数据库的结构、存储等信息
            Connection connection = DBUtils.getConnection();
            DatabaseMetaData metaData = connection.getMetaData();
            //ResultSet类是一种数据库查询结果存储类,就是当查询数据库的时候,
            // 可以将查询的结果放在具体的ResultSet对象中,
            // 我们把这种存储查询结果的ResultSet对象叫做ResultSet结果集
            ResultSet tables = metaData.getTables(connection.getCatalog(),null,null,null);
            List<TableClass> tableClassList = new ArrayList<>();
            while(tables.next()){
                TableClass tableClass = new TableClass();
                tableClass.setPackageName(packageName);
                String table_name = tables.getString("TABLE_NAME");
                String modelName = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, table_name);
                tableClass.setTableName(table_name);
                tableClass.setModelName(modelName);
                tableClass.setControllerName(modelName+"Controller");
                tableClass.setMapperName(modelName+"Mapper");
                tableClass.setServiceName(modelName+"Service");
                tableClassList.add(tableClass);
            }
            return RespBean.ok("数据库信息读取成功",tableClassList);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return RespBean.error("数据库信息读取失败");
    }
}

创建GenerateCodeController类

package org.hx.springboot_generatecode_demo10.controller;

import org.hx.springboot_generatecode_demo10.model.RespBean;
import org.hx.springboot_generatecode_demo10.model.TableClass;
import org.hx.springboot_generatecode_demo10.service.GenerateCodeService;
import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.List;


@RestController
public class GenerateCodeController {
    @Autowired
    GenerateCodeService generateCodeService;


    @PostMapping("/generateCode")
    public RespBean generateCode(@RequestBody List<TableClass> tableClassList, HttpServletRequest req) {
        return generateCodeService.generateCode(tableClassList, req.getServletContext().getRealPath("/"));
    }
}

创建GenerateCodeService类

package org.hx.springboot_generatecode_demo10.service;

import com.google.common.base.CaseFormat;
import freemarker.cache.ClassTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import org.hx.springboot_generatecode_demo10.model.ColumnClass;
import org.hx.springboot_generatecode_demo10.model.RespBean;
import org.hx.springboot_generatecode_demo10.model.TableClass;
import org.hx.springboot_generatecode_demo10.utils.DBUtils;
import org.springframework.stereotype.Service;

import java.io.*;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

@Service
public class GenerateCodeService {

    Configuration configuration= null;
    {
        configuration = new Configuration(Configuration.VERSION_2_3_0);
        configuration.setTemplateLoader(new ClassTemplateLoader(GenerateCodeService.class,"/templates"));
        configuration.setDefaultEncoding("UTF-8");
    }
    public RespBean generateCode(List<TableClass> tableClassList, String realPath) {
        try {
            Template modeltemplate = configuration.getTemplate("Model.java.ftl");
            Template mapperjavatemplate = configuration.getTemplate("Mapper.java.ftl");
            Template mapperxmltemplate = configuration.getTemplate("Mapper.xml.ftl");
            Template servicetemplate = configuration.getTemplate("Service.java.ftl");
            Template controllertemplate = configuration.getTemplate("Controller.java.ftl");
            Connection connection = DBUtils.getConnection();
            DatabaseMetaData metaData = connection.getMetaData();
            for (TableClass tableClass : tableClassList) {
                ResultSet columns = metaData.getColumns(connection.getCatalog(), null, tableClass.getTableName(), null);
                ResultSet primaryKeys = metaData.getPrimaryKeys(connection.getCatalog(), null, tableClass.getTableName());
                List<ColumnClass> columnClassList = new ArrayList<>();
                while (columns.next())
                {
                    String column_name = columns.getString("COLUMN_NAME");
                    String type_name = columns.getString("TYPE_NAME");
                    String remarks = columns.getString("REMARKS");
                    ColumnClass columnClass = new ColumnClass();
                    columnClass.setRemark(remarks);
                    columnClass.setColumnName(column_name);
                    columnClass.setType(type_name);
                    columnClass.setPropertyName(CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL,column_name));
                    primaryKeys.first();
                    while (primaryKeys.next()){
                        String pkname = primaryKeys.getString("COLUMN_NAME");
                        if (column_name.equals(pkname))
                        {
                            columnClass.setPrimary(true);
                        }
                    }
                    columnClassList.add(columnClass);
                }
                tableClass.setColumns(columnClassList);
                String path = realPath+"/"+tableClass.getPackageName().replace(".","/");
                generate(modeltemplate,tableClass,path+"/model/");
                generate(mapperjavatemplate,tableClass,path+"/mapper/");
                generate(mapperxmltemplate,tableClass,path+"/mapper/");
                generate(servicetemplate,tableClass,path+"/service/");
                generate(controllertemplate,tableClass,path+"/controller/");
            }
            return RespBean.ok("代码已经生成",realPath);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return RespBean.error("代码生成失败");
    }

    private void generate(Template template, TableClass tableClass,  String path) throws IOException, TemplateException {
        File folder = new File(path);
        if (!folder.exists())
        {
            folder.mkdirs();
        }
        String fileName = path+"/"+tableClass.getModelName()+template.getName().replace(".ftl","").replace("Model","");
        FileOutputStream fileOutputStream = new FileOutputStream(fileName);
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream);
        template.process(tableClass,outputStreamWriter);
        fileOutputStream.close();
        outputStreamWriter.close();
    }
}

至此代码生成学习结束,生成的代码粘贴在org.hx.test包下,配置application.properties为:

spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=123456

server.port=8888

在pom.xml文件中的build标签下设置扫描mapper下的xml文件

<resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
            </resource>
</resources>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值