Beispiel #1
0
def jsp_export(
    entity_name,
    package_name='medicare',
    input_file='output.txt',
):
    """
    jsp导出
    :param entity_name: 传入实体类名称
    :param package_name: 实体类的包名
    :param input_file: 传入数据库字段名称txt文件
    :return:
    """
    entity_name = util.low_case_first_letter(entity_name)
    with open(entity_name + 'Export.jsp', 'w', encoding='utf-8') as f:
        f.write('            //数据导出功能\n')
        f.write('            $(\'#exportBtn\').click(function () {\n')
        with open(input_file, 'r', encoding='utf-8') as f2:
            column = util.entity_attributes_standardize(f2.readline().strip())
            while column:
                f.write('               $(\'#export input[name="' + column +
                        '"]\').val($.trim($("#dataTableBar #' + column +
                        '").val()));\n')
                column = util.entity_attributes_standardize(
                    f2.readline().strip())
        f.write('               $("#export").submit();\n')
        f.write('            });\n\n')
        f.write(
            '    <form id="export" enctype="application/x-www-form-urlencoded" method="post" style="display: none" '
            'target="_blank" action="${ctx}/' + package_name + '/' +
            entity_name + '/export.json">\n')
        with open(input_file, 'r', encoding='utf-8') as f2:
            column = util.entity_attributes_standardize(f2.readline().strip())
            while column:
                f.write('        <input name="' + column + '">\n')
                column = util.entity_attributes_standardize(
                    f2.readline().strip())
        f.write('    </form>\n\n')
        f.write(
            '            <a id="exportBtn" href="javascript:void(0)" class="easyui-linkbutton" '
            'iconCls="icon-save" plain="true">数据导出</a>')
Beispiel #2
0
def xml_export(table_name,
               input_file='output.txt',
               output_file='export_xml.txt'):
    """
    创建xml语句
    :param table_name: 传入表名称 驼峰式命名/下划线命名
    :param input_file: 传入数据库字段名称txt文件
    :param output_file: 输出xml文件
    :return:
    """
    table_name = util.table_name_standardize(table_name)
    with open(output_file, 'w', encoding='utf-8') as f:
        f.write(
            '    <select id="getExport" parameterType="Map" resultMap="BaseResultMap">\n'
        )
        f.write('        SELECT <include refid="sql" /> FROM ' + table_name +
                '\n')
        f.write('        <where>\n')
        f.write('            <if test="pkId != null and pkId != \'\'">\n')
        f.write('                ' + table_name +
                '.PK_ID = #{pkId,jdbcType=INTEGER}\n')
        f.write('            </if>\n')
        with open(input_file, 'r', encoding='utf-8') as f2:
            column = f2.readline().strip()
            attribute = util.entity_attributes_standardize(column)
            while column:
                f.write('            <if test="' + attribute +
                        ' != null and ' + attribute + ' != \'\'">\n')
                f.write('                AND ' + table_name + '.' + column +
                        ' LIKE \'%\' + #{' + attribute +
                        ',jdbcType=VARCHAR} + \'%\'\n')
                f.write('            </if>\n')
                column = f2.readline().strip()
                attribute = util.entity_attributes_standardize(column)
        f.write('        </where>\n')
        f.write('        order by ' + table_name + '.PK_ID\n    </select>\n')
Beispiel #3
0
def create_search(search_file="search.txt"):
    """
    添加搜索条件
    :param search_file: 搜索条件文本文件
    :return:
    """
    with open('search.jsp', 'w', encoding='utf-8') as f:
        with open(search_file, 'r', encoding='utf-8') as f2:
            search = f2.readlines()
        for i in range(len(search)):
            item = search[i].split(' ')
            item[-1] = util.entity_attributes_standardize(item[-1].strip())
            if i % 3 == 0:
                f.write('                <tr>\n')
            f.write('                    <th>' + item[0] + ':</th>\n')
            f.write('                    <td><input type="text" name="' +
                    item[-1] + '" id="' + item[-1] + '"/></td>\n')
            if i % 3 == 2:
                f.write('                </tr>\n')
        if len(search) % 3 != 0:
            f.write('                </tr>\n')
def reader_import(table_name, columns_for_read, start_row_num):
    """
    生成readerHelper文件
    :param table_name: 表名称
    :param columns_for_read: 要读取的excel列数
    :param start_row_num: 要读取的excel开始的行数
    :return:
    """
    entity_name = table_name
    entity_name = util.entity_attributes_standardize(entity_name)
    entity_name = util.up_case_first_letter(entity_name)
    columns_for_read = str(columns_for_read)
    start_row_num = str(start_row_num)
    with open(entity_name + 'ExcelHelper.java', 'w', encoding='utf-8') as f:
        f.write('package com.yibo.modules.medicare.reader;\n\n')
        f.write('import com.yibo.core.common.utils.excel.XLSConvertCSVUtil;\n')
        f.write('import com.yibo.core.common.utils.excel.XLSXCovertCSVUtil;\n')
        f.write('import com.yibo.modules.medicare.dao.' + entity_name + 'Dao;\n')
        f.write('import com.yibo.modules.medicare.entity.FileImport;\n')
        f.write('import com.yibo.modules.medicare.others.WorkConfig;\n')
        f.write('import org.apache.ibatis.session.SqlSession;\n')
        f.write('import org.apache.shiro.util.CollectionUtils;\n')
        f.write('import org.mybatis.spring.SqlSessionTemplate;\n\n')
        f.write('import java.io.File;\n')
        f.write('import java.sql.Connection;\n')
        f.write('import java.sql.PreparedStatement;\n')
        f.write('import java.util.List;\n\n')
        f.write('public class ' + entity_name + 'ExcelHelper implements SqlStatement {\n\n')
        f.write('    public static long insert(String originalFilename, File dataFile, FileImport fileImport, '
                'SqlSessionTemplate sqlSessionTemplate) throws Exception {\n\n')
        f.write('        while(WorkConfig.getDataImportIsWorkingLock()) {\n')
        f.write('            //wait for other-ExcelHelper finishing the job\n        }\n')
        f.write('        WorkConfig.setDataImportIsWorkingLock(true);\n')
        f.write('        long count;\n')
        f.write('        try (SqlSession session = sqlSessionTemplate.getSqlSessionFactory().openSession();\n')
        f.write('             Connection con = session.getConnection();\n')
        f.write('             PreparedStatement ps = con.prepareStatement(INSERT_INTO_' + table_name + ')) {\n')
        f.write('            int columnsForRead = ' + columns_for_read + ';\n')
        f.write('            String yearMonth = String.format("%s%s",\n')
        f.write('                    fileImport.getYear(), fileImport.getMonth() < 10 ? '
                '"0" + fileImport.getMonth() : fileImport.getMonth());\n')
        f.write('            if (1 == fileImport.getRecover()) {\n')
        f.write('                sqlSessionTemplate.getMapper(' + entity_name + 'Dao.class).'
                'deleteByYearMonth(yearMonth);\n            }\n')
        f.write('            List<List<String>> list;\n')
        f.write('            if (originalFilename.toLowerCase().endsWith(XLSX)) {\n')
        f.write('                list = XLSXCovertCSVUtil.readXLSX(dataFile, 1, '
                '' + start_row_num + ', columnsForRead);\n')
        f.write('            } else {\n')
        f.write('                list = XLSConvertCSVUtil.readXLS(dataFile, 1, '
                '' + start_row_num + ', columnsForRead);\n')
        f.write('            }\n')
        f.write('            con.setAutoCommit(false);\n')
        f.write('            long blankRow = 0L;\n')
        f.write('            long rowsCount = 0L;\n')
        f.write('            final int commitSize = 1000;\n')
        f.write('            for (List<String> row : list) {\n')
        f.write('                if (CollectionUtils.isEmpty(row)) {\n')
        f.write('                    blankRow++;\n')
        f.write('                } else {\n')
        f.write('                    rowsCount++;\n')
        f.write('                    for (int j = 1; j < columnsForRead; j++) {\n')
        f.write('                        ps.setString(j, row.get(j));\n')
        f.write('                    }\n')
        user = int(columns_for_read) - 1
        f.write('                    ps.setString(' + str(user) + ', fileImport.getUser());\n')
        f.write('                    ps.setString(' + columns_for_read + ', yearMonth);\n')
        f.write('                    ps.addBatch();\n')
        f.write('                }\n')
        f.write('                if (rowsCount % commitSize == 0) {\n')
        f.write('                    ps.executeBatch();\n')
        f.write('                    con.commit();\n')
        f.write('                }\n')
        f.write('            }\n')
        f.write('            if (blankRow != list.size()) {\n')
        f.write('                ps.executeBatch();\n')
        f.write('                con.commit();\n')
        f.write('            }\n')
        f.write('            count = rowsCount - blankRow;\n')
        f.write('        } catch(Exception e) {\n')
        f.write('            e.printStackTrace();\n')
        f.write('            throw e;\n')
        f.write('        } finally {\n')
        f.write('            WorkConfig.setDataImportIsWorkingLock(false);\n')
        f.write('        }\n')
        f.write('        return count;\n    }\n}\n')
def create_jsp(table_name, output_file='output.txt'):
    """
    生成jsp文件
    :param table_name: 传入表名
    :param output_file: 传入字段名文件
    :return:
    """
    file_name = 'import.jsp'
    entity_name = util.up_case_first_letter(util.entity_attributes_standardize(table_name))
    with open(file_name, 'w', encoding='utf-8') as f:

        f.write('            $(\'#importBtn\').bind(\'click\', function () {  \n')
        f.write('                $(\'#file-action\').form(\'clear\');   \n')
        f.write('                $(\'#file-action\').form(\'reset\');   \n')
        f.write('                $(\'#file-action #filecontainer input\').val(\'\');\n')
        f.write('                $(\'#dataType\').val(\'' + table_name + '\');\n')
        f.write('                $(\'#import-dialog\').dialog(\'open\');\n')
        f.write('            });\n\n')
        f.write('            $(\'#import\').bind(\'click\', function () {\n')
        f.write('                var isValid = $(\'#file-action\').form(\'validate\');\n')
        f.write('                if (isValid) {\n                    $(\'#file-action\').submit();\n')
        f.write('                    $.messager.progress();\n                }\n')
        f.write('            });\n\n')
        f.write('        function ajaxFormCallback(json) {\n')
        f.write('            var isjson = Object.prototype.toString.call(json).toLowerCase() == "[object object]";\n')
        f.write('            if (isjson && json.success) {\n')
        f.write('                $(\'#import-dialog\').dialog(\'close\');\n')
        f.write('                $.messager.alert(\'消息\', json.message, \'info\');\n')
        f.write('                setTimeout(function () {\n')
        f.write('                    $(\'#dataTable\').datagrid(\'load\', {\n')
        with open(output_file, 'r', encoding='utf-8') as f2:
            columns = f2.readlines()
            for column in columns:
                column = util.entity_attributes_standardize(column.strip())
                f.write('                        ' + column + ': $(\'#' + column + '\').val(),\n')
        f.write('                    });\n                }, 2);\n')
        f.write('            } else {\n')
        f.write('                $.messager.alert(\'错误\', json.message, \'error\');\n            }\n')
        f.write('            $.messager.progress(\'close\');\n        }\n\n')
        f.write('        <a id="importBtn" href="javascript:void(0)" class="easyui-linkbutton" iconCls="icon-add" '
                'plain="true">导入</a>\n\n')
        f.write('    <div id="import-dialog" class="easyui-dialog"\n')
        f.write('         title="Excel导入"\n')
        f.write('         buttons="#import-tools"\n')
        f.write('         closed="true"\n')
        f.write('         cache="false"\n')
        f.write('         style="width:450px; height:300px"\n')
        f.write('         iconCls="icon-edit"\n')
        f.write('         modal="true">\n')
        f.write('        <iframe id="file-target" name="file-target" style="display: none"></iframe>\n')
        f.write('        <div class="modal-body">\n')
        f.write('            <form action="${ctx}/file/multipart.json" id="file-action" method="post" '
                'enctype="multipart/form-data"\n')
        f.write('                  class="form-horizontal" target="file-target">\n')
        f.write('                <input name="user" type="hidden" value="${login_name}"/>\n')
        f.write('                <div class="control-group">\n')
        f.write('                    <label class="control-label">是否覆盖:</label>\n')
        f.write('                    <div class="controls">\n')
        f.write('                        <select id="recover" name="recover" class="easyui-combobox" '
                'style="width:150px;"\n')
        f.write('                                required="required">\n')
        f.write('                            <option value="0">否</option>\n')
        f.write('                            <option value="1">是</option>\n')
        f.write('                        </select>\n')
        f.write('                    </div>\n                </div>\n')
        f.write('                <div class="control-group" style="display:none">\n')
        f.write('                    <label class="control-label">数据类型:</label>\n')
        f.write('                    <div class="controls">\n')
        f.write('                        <input id="dataType" name="dataType" class="easyui-textbox" '
                'style="width:150px;" type="text"/>\n')
        f.write('                    </div>\n                </div>\n')
        f.write('                <div class="control-group">\n')
        f.write('                    <label class="control-label">年份:</label>\n')
        f.write('                    <div class="controls">\n')
        f.write('                        <select class="easyui-combobox" name="year" style="width:150px;" '
                'required="required">\n')
        f.write('                            <c:forEach items="${years}" var="d">\n')
        f.write('                                <option value="${d}">${d}年</option>\n')
        f.write('                            </c:forEach>\n')
        f.write('                        </select>\n')
        f.write('                    </div>\n')
        f.write('                </div>\n')
        f.write('                <div class="control-group">\n')
        f.write('                    <label class="control-label">月份:</label>\n')
        f.write('                    <div class="controls">\n')
        f.write('                        <select class="easyui-combobox" name="month" style="width:150px;" '
                'required="required">\n')
        f.write('                            <c:forEach items="1,2,3,4,5,6,7,8,9,10,11,12" var="m" step="1">\n')
        f.write('                                <option value="${m}">${m}月</option>\n')
        f.write('                            </c:forEach>\n')
        f.write('                            <option value="13">全年</option>\n')
        f.write('                        </select>\n')
        f.write('                    </div>\n')
        f.write('                </div>\n')
        f.write('                <div class="control-group">\n')
        f.write('                    <label class="control-label">数据文件:</label>\n')
        f.write('                    <div class="controls">\n')
        f.write('                        <input name="file" type="file" style="width:200px" required="required"\n')
        f.write('                               value="选择..."/>\n')
        f.write('                    </div>\n')
        f.write('                </div>\n')
        f.write('            </form>\n')
        f.write('        </div>\n    </div>\n')
        f.write('    <div id="import-tools">\n')
        f.write('        <a id="import" href="javascript:void(0)" class="easyui-linkbutton" '
                'iconCls="icon-save">保存</a>\n')
        f.write('        <a href="javascript:void(0)" class="easyui-linkbutton" iconCls="icon-cancel"\n')
        f.write('           onclick="javascript:$(\'#importDialog\').dialog(\'close\')">关闭</a>\n')
        f.write('    </div>\n\n')
        f.write('    void deleteByYearMonth(@Param("yearMonth") String yearMonth);\n\n')
        f.write('    <delete id="deleteByYearMonth" parameterType="java.lang.String">\n')
        f.write('        DELETE FROM ' + table_name + ' WHERE YEAR_MONTH = #{yearMonth, jdbcType = VARCHAR}\n')
        f.write('    </delete>\n\n')
        f.write('							case ' + table_name + ':\n')
        f.write('								count = ' + entity_name + 'ExcelHelper.insert(originalFilename, file, '
                'fileImport, sqlSessionTemplate);\n')
        f.write('								break;\n')
Beispiel #6
0
def create_jsp(entity_name,
               package_name='medicare',
               columns_file='output.txt',
               comments_file='comment.txt'):
    """
    生成jsp文件
    :param entity_name: 实体类名
    :param package_name: 包名
    :param columns_file: 传入字段名文件
    :param comments_file: 传入注释名文件
    :return:
    """
    entity_name = util.low_case_first_letter(entity_name)
    file_name = entity_name + 'List.jsp'
    url = package_name + '/' + entity_name
    with open(file_name, 'w', encoding='utf-8') as f:
        f.write('<%--\n')
        f.write('  User: [email protected]\n')
        f.write('  Date: ' + time.strftime("%Y/%m/%d", time.localtime()))
        f.write('\n  Time: ' + time.strftime("%H:%M", time.localtime()))
        f.write('\n--%>\n')
        f.write(
            '<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>\n'
        )
        f.write(
            '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" '
            '"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n')
        f.write('<html xmlns="http://www.w3.org/1999/xhtml">\n')
        f.write('<head>\n')
        f.write('    <title></title>\n')
        f.write('    <%@include file="/WEB-INF/views/include/head.jsp" %>\n')
        f.write('    <style>\n')
        f.write('        #searchForm table{\n')
        f.write('            width: 100%;\n')
        f.write('        }\n')
        f.write('        #searchForm table tr td,\n')
        f.write('        #searchForm table tr th\n')
        f.write('        {\n')
        f.write('            padding: 5px;\n')
        f.write('        }\n')
        f.write('        #searchForm table tr td input{\n')
        f.write('            width: 90%;\n')
        f.write('            margin-right: 15px;\n')
        f.write('        }\n')
        f.write('        #searchForm table tr th{\n')
        f.write('            width: 80px;\n')
        f.write('            padding-left:10px;\n')
        f.write('            text-align: right;\n')
        f.write('        }\n')
        f.write('        th{\n')
        f.write('            font-weight: normal;\n')
        f.write('        }\n')
        f.write('        .breadcrumb{\n')
        f.write('            padding-left:0;\n')
        f.write('            margin-bottom: 0;\n')
        f.write('        }\n')
        f.write('        #searchForm table tr td input.search-btn{\n')
        f.write('            width: 80%;\n')
        f.write('            margin: 0;\n')
        f.write('        }\n')
        f.write('        #searchForm table tr td input.combo-text{\n')
        f.write('            margin-right: 0;\n')
        f.write('        }\n')
        f.write('    </style>\n')
        f.write('    <script type="text/javascript">\n\n')
        f.write('        $(function () {\n')
        f.write('            $(\'#dataTable\').datagrid({\n')
        f.write('                rownumbers: true,\n')
        f.write('                loading: true,\n')
        f.write('                fit: true,\n')
        f.write('                toolbar: "#dataTableBar",\n')
        f.write('                url: \'${ctx}/' + url + '/list.do\',\n')
        f.write('                pagination: true,\n')
        f.write('                pageSize: 20,\n')
        f.write('                columns: [[\n')
        with open(columns_file, 'r', encoding='utf-8') as f2:
            fields = f2.readlines()
        with open(comments_file, 'r', encoding='utf-8') as f3:
            titles = f3.readlines()
        for i in range(len(fields)):
            f.write('                    {field: \'' +
                    util.entity_attributes_standardize(fields[i]) +
                    '\', title: \'' + titles[i].strip() + '\', width: 120},\n')
        f.write('                ]]\n            });\n\n')
        f.write('            new CrudForm({datagrid: \'dataTable\'});\n\n')
        f.write('            $("#search").click(function() {\n')
        f.write(
            '                $(\'#dataTable\').datagrid("load", yibo.util.formJson($("#searchForm")));\n'
        )
        f.write('            });\n        });\n')
        f.write('    </script>\n</head>\n')
        f.write('<body class="easyui-layout">\n')
        f.write(
            '<div data-options="region:\'center\'" style="padding:0px;border:0px;" data-options="fit:true">\n'
        )
        f.write('    <table id="dataTable"></table>\n')
        f.write('    <div id="dataTableBar">\n')
        f.write(
            '        <a class="easyui-linkbutton" id="tool-search-btn" '
            'data-options="plain: true, iconCls: \'layout-button-up\'">查询</a>\n'
        )
        f.write('        <!-- 查询条件 -->\n')
        f.write(
            '        <form id="searchForm" class="breadcrumb form-search" style="display:none" method="post">\n'
        )
        f.write('            <table>\n')
        f.write('                <tr>\n')
        f.write(
            '                    <td style="text-align: center"><input id="search" '
            'class="btn btn-primary search-btn" type="button" value="查询" style="line-height:15px"/></td>\n'
        )
        f.write('                </tr>\n')
        f.write('            </table>\n')
        f.write('        </form>\n')
        f.write('    </div>\n</div>\n</body>\n</html>\n\n')
Beispiel #7
0
def create_xml(entity_name,
               table_name,
               package_name='medicare',
               input_file='output.txt'):
    """
    生成Mybatis的xml文件
    :param entity_name: 实体类名
    :param table_name: 表名
    :param package_name: 包名
    :param input_file: 传入字段名文件
    :return:
    """
    output_file = entity_name + '.xml'
    with open(output_file, 'w', encoding='utf-8') as f:
        f.write('<?xml version="1.0" encoding="UTF-8"?>\n')
        f.write('<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" '
                '"http://mybatis.org/dtd/mybatis-3-mapper.dtd">\n')
        f.write('<mapper namespace="com.yibo.modules.' + package_name +
                '.dao.' + entity_name + 'Dao">\n\n')
        f.write('    <sql id="sql">\n')
        f.write('        ' + table_name + '.PK_ID AS ' + table_name +
                '_PK_ID, \n')
        columns = []
        attributes = []
        with open(input_file, 'r', encoding='utf-8') as f1:
            column = f1.readline().strip()
            while column:
                columns.append(column)
                attributes.append(util.entity_attributes_standardize(column))
                column = f1.readline().strip()
        leng = len(columns)
        for i in range(leng - 1):
            f.write('        ' + table_name + '.' + columns[i] + ' AS ' +
                    table_name + '_' + columns[i] + ', \n')
        f.write('        ' + table_name + '.' + columns[-1] + ' AS ' +
                table_name + '_' + columns[-1] + '\n')
        f.write('    </sql>\n\n')
        f.write('    <resultMap id="BaseResultMap" '
                'type="com.yibo.modules.' + package_name + '.entity.' +
                entity_name + '">\n')
        f.write('        <id column="' + table_name +
                '_PK_ID" jdbcType="BIGINT" property="pkId"/>\n')
        with open(input_file, 'r', encoding='utf-8') as f1:
            column = f1.readline().strip()
            while column:
                attribute = util.entity_attributes_standardize(column)
                f.write('        <result column="' + table_name + '_' +
                        column + '" jdbcType="VARCHAR" property="' +
                        attribute + '"/>\n')
                column = f1.readline().strip()
        f.write('    </resultMap>\n\n')
        f.write(
            '    <select id="findPage" parameterType="java.util.Map" resultMap="BaseResultMap">\n'
        )
        f.write('        SELECT\n')
        f.write('        <include refid="sql"/>\n')
        f.write('        FROM ' + table_name + '\n')
        f.write('        <where>\n')
        f.write('            <if test="pkId != null and pkId != \'\' ">\n')
        f.write('                ' + table_name +
                '.PK_ID = #{pkId,jdbcType=VARCHAR}\n')
        f.write('            </if>\n')
        with open(input_file, 'r', encoding='utf-8') as f1:
            column = f1.readline().strip()
            while column:
                attribute = util.entity_attributes_standardize(column)
                f.write('            <if test="' + attribute +
                        ' != null and ' + attribute + ' != \'\' ">\n')
                f.write('                AND ' + table_name + '.' + column +
                        ' LIKE \'%\' + #{' + attribute +
                        ',jdbcType=VARCHAR} + \'%\'\n')
                f.write('            </if>\n')
                column = f1.readline().strip()
        f.write('        </where>\n')
        f.write('        ORDER BY ' + table_name + '.PK_ID\n')
        f.write('    </select>\n\n')
        f.write('    <delete id="delete" parameterType="java.lang.Long">\n')
        f.write('       DELETE FROM ' + table_name + ' WHERE ' + table_name +
                '.PK_ID = #{pkId,jdbcType=BIGINT}\n')
        f.write('    </delete>\n\n')
        f.write('    <insert id="insert" parameterType="com.yibo.modules.' +
                package_name + '.entity.' + entity_name + '">\n')
        f.write('        INSERT INTO ' + table_name + ' (\n')
        for i, x in enumerate(columns):
            if i != len(columns) - 1:
                f.write('        ' + x + ', \n')
                continue
            f.write('        ' + x + '\n')
        f.write('        )\n')
        f.write('        VALUES\n        (\n')
        for i, x in enumerate(attributes):
            if i != len(attributes) - 1:
                f.write('        #{' + x + ', jdbcType = VARCHAR}, \n')
                continue
            f.write('        #{' + x + ', jdbcType = VARCHAR}\n')
        f.write('        )\n')
        f.write('    </insert>\n\n')
        f.write(
            '    <update id="updateNull" parameterType="com.yibo.modules.' +
            package_name + '.entity.' + entity_name + '">\n')
        f.write('        UPDATE ' + table_name + '\n')
        f.write('        <set>\n')
        for i in range(leng - 1):
            f.write('            ' + columns[i] + ' = #{' + attributes[i] +
                    ', jdbcType = VARCHAR}, \n')
        f.write('            ' + columns[-1] + ' = #{' + attributes[-1] +
                ', jdbcType = VARCHAR}\n')
        f.write('        </set>\n')
        f.write('        WHERE ' + table_name +
                '.PK_ID = #{pkId, jdbcType = BIGINT}\n')
        f.write('    </update>\n\n')
        f.write('    <update id="update" parameterType="com.yibo.modules.' +
                package_name + '.entity.' + entity_name + '">\n')
        f.write('        UPDATE ' + table_name + '\n')
        f.write('        <set>\n')
        for i in range(leng - 1):
            f.write('            <if test="' + attributes[i] +
                    ' != null and ' + attributes[i] + ' != \'\'">\n')
            f.write('                ' + table_name + '.' + columns[i] +
                    ' = #{' + attributes[i] + ', jdbcType = VARCHAR}, \n')
            f.write('            </if>\n')
        f.write('            <if test="' + attributes[-1] + ' != null and ' +
                attributes[-1] + ' != \'\'">\n')
        f.write('                ' + table_name + '.' + columns[-1] + ' = #{' +
                attributes[-1] + ', jdbcType = VARCHAR}\n')
        f.write('            </if>\n')
        f.write('        </set>\n')
        f.write('        WHERE ' + table_name +
                '.PK_ID = #{pkId,jdbcType=BIGINT}\n')
        f.write('    </update>\n\n')
        f.write(
            '    <select id="queryBySql" parameterType="java.lang.String" resultType="java.util.Map">\n'
        )
        f.write('        ${executeSql}\n')
        f.write('    </select>\n\n')
        f.write(
            '    <delete id="deleteByIds" parameterType="java.lang.String">\n')
        f.write('        DELETE FROM ' + table_name + ' WHERE PK_ID IN\n')
        f.write(
            '        <foreach collection="list" item="id" open="(" separator="," close=")">\n'
        )
        f.write('            #{id}\n')
        f.write('        </foreach>\n')
        f.write('    </delete>\n\n')
        f.write('</mapper>')