com.gitee.sunchenbin.mybatis.actable.mapping.system.CreateMysqlTablesMapper.xml Maven / Gradle / Ivy
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace="com.gitee.sunchenbin.mybatis.actable.dao.system.CreateMysqlTablesMapper"> <!-- 强制指定查询表结构映射字段,避免被mybatis下划线转驼峰配置影响,导致查询不到值 --> <resultMap id="SysMysqlColumnsResultMap" type="com.gitee.sunchenbin.mybatis.actable.command.SysMysqlColumns"> <result property="table_schema" column="table_schema"/> <result property="table_name" column="table_name"/> <result property="column_name" column="column_name"/> <result property="ordinal_position" column="ordinal_position"/> <result property="column_default" column="column_default"/> <result property="is_nullable" column="is_nullable"/> <result property="data_type" column="data_type"/> <result property="character_maximum_length" column="character_maximum_length"/> <result property="character_octet_length" column="character_octet_length"/> <result property="numeric_precision" column="numeric_precision"/> <result property="numeric_scale" column="numeric_scale"/> <result property="character_set_name" column="character_set_name"/> <result property="collation_name" column="collation_name"/> <result property="column_type" column="column_type"/> <result property="column_key" column="column_key"/> <result property="extra" column="extra"/> <result property="privileges" column="privileges"/> <result property="column_comment" column="column_comment"/> </resultMap> <resultMap id="SysMysqlTableResultMap" type="com.gitee.sunchenbin.mybatis.actable.command.SysMysqlTable"> <result property="table_catalog" column="table_catalog"/> <result property="table_schema" column="table_schema"/> <result property="table_name" column="table_name"/> <result property="table_type" column="table_type"/> <result property="engine" column="engine"/> <result property="version" column="version"/> <result property="row_format" column="row_format"/> <result property="table_rows" column="table_rows"/> <result property="avg_row_length" column="avg_row_length"/> <result property="data_length" column="data_length"/> <result property="max_data_length" column="max_data_length"/> <result property="index_length" column="index_length"/> <result property="data_free" column="data_free"/> <result property="auto_increment" column="auto_increment"/> <result property="create_time" column="create_time"/> <result property="update_time" column="update_time"/> <result property="check_time" column="check_time"/> <result property="table_collation" column="table_collation"/> <result property="checksum" column="checksum"/> <result property="create_options" column="create_options"/> <result property="table_comment" column="table_comment"/> </resultMap> <!-- 抽取出来的公共部分 --> <sql id="commonSql"> <if test="fields.fileTypeLength == 0"> `${fields.fieldName}` ${fields.fieldType} </if> <if test="fields.fileTypeLength == 1"> `${fields.fieldName}` ${fields.fieldType}(${fields.fieldLength}) </if> <if test="fields.fileTypeLength == 2"> `${fields.fieldName}` ${fields.fieldType}(${fields.fieldLength},${fields.fieldDecimalLength}) </if> <if test="fields.fieldIsNull"> NULL </if> <if test="!fields.fieldIsNull"> NOT NULL </if> <if test="fields.fieldIsAutoIncrement"> AUTO_INCREMENT </if> <!-- 不是自增长的才能有默认值 --> <!-- 并且不为null时,因为null是默认的没必要写 --> <if test="!fields.fieldIsAutoIncrement and !fields.fieldIsNull and fields.fieldDefaultValue != null"> <if test="fields.fieldType == 'bit'"> <if test="fields.fieldDefaultValue == 'true'.toString()"> DEFAULT 1 </if> <if test="fields.fieldDefaultValue == 'false'.toString()"> DEFAULT 0 </if> <if test="fields.fieldDefaultValue == '1'.toString()"> DEFAULT 1 </if> <if test="fields.fieldDefaultValue == '0'.toString()"> DEFAULT 0 </if> </if> <if test="fields.fieldType != 'bit'"> DEFAULT #{fields.fieldDefaultValue} </if> </if> <!-- 不是自增长的才能有默认值 --> <!-- 不是非空时,并且默认值不是NUll --> <if test="!fields.fieldIsAutoIncrement and fields.fieldIsNull and fields.fieldDefaultValue != null"> <if test="fields.fieldType == 'bit'"> <if test="fields.fieldDefaultValue == 'true'.toString()"> DEFAULT 1 </if> <if test="fields.fieldDefaultValue == 'false'.toString()"> DEFAULT 0 </if> <if test="fields.fieldDefaultValue == '1'.toString()"> DEFAULT 1 </if> <if test="fields.fieldDefaultValue == '0'.toString()"> DEFAULT 0 </if> </if> <if test="fields.fieldType != 'bit'"> DEFAULT #{fields.fieldDefaultValue} </if> </if> <if test="fields.fieldComment != ''"> COMMENT #{fields.fieldComment} </if> </sql> <!-- 创建表的 --> <select id="createTable" parameterType="java.util.Map"> <foreach collection="tableMap" index="key" item="value"> create table `${key}`( <foreach collection="value.list" item="fields" separator=","> <include refid="commonSql"></include> <if test="fields.fieldIsKey"> ,PRIMARY KEY (`${fields.fieldName}`) </if> </foreach> ) <foreach collection="value.map" index="ckey" item="cvalue"> <if test="ckey == 'table_comment'"> COMMENT = #{cvalue} </if> <if test="ckey == 'table_collation'"> CHARSET = #{cvalue} </if> <if test="ckey == 'engine'"> ENGINE = #{cvalue} </if> </foreach> ; </foreach> </select> <!-- 验证表是否存在 --> <select id="findTableByTableName" resultMap="SysMysqlTableResultMap" parameterType="String"> select * from information_schema.tables where table_name = #{tableName} and table_schema = (select database()) </select> <!-- 根据表名查询表的结构 --> <select id="findTableEnsembleByTableName" resultMap="SysMysqlColumnsResultMap" parameterType="String"> select * from information_schema.columns where table_name = #{tableName} and table_schema = (select database()) </select> <!-- 增加字段 --> <select id="addTableField" parameterType="java.util.Map"> <foreach collection="tableMap" index="key" item="fields" separator=";"> alter table `${key}` add <include refid="commonSql"></include> <if test="fields.fieldIsKey"> PRIMARY KEY </if> </foreach> </select> <!-- 删除字段 --> <select id="removeTableField" parameterType="java.util.Map"> <foreach collection="tableMap" index="key" item="field" separator=";"> alter table `${key}` drop `${field}` </foreach> </select> <!-- 更新表属性 --> <select id="modifyTableProperty" parameterType="java.util.Map"> <foreach collection="tableMap" index="key" item="value"> alter table `${key}` <foreach collection="value.map" index="ckey" item="cvalue"> <if test="ckey == 'table_comment'"> COMMENT #{cvalue} </if> <if test="ckey == 'table_collation'"> CHARSET #{cvalue} </if> <if test="ckey == 'engine'"> ENGINE #{cvalue} </if> </foreach> ; </foreach> </select> <!-- 修改字段 --> <select id="modifyTableField" parameterType="java.util.Map"> <foreach collection="tableMap" index="key" item="fields" separator=";"> alter table `${key}` modify <include refid="commonSql"></include> <if test="fields.fieldIsKey"> PRIMARY KEY </if> </foreach> </select> <!-- 删除主键字段 --> <select id="dropKeyTableField" parameterType="java.util.Map"> <foreach collection="tableMap" index="key" item="fields" separator=";"> alter table `${key}` modify <include refid="commonSql"></include> ,drop primary key </foreach> </select> <!-- 验证表是否存在 --> <select id="dropTableByName" parameterType="String"> DROP TABLE IF EXISTS `${tableName}`; </select> <!-- 查询当前表存在的索引除了主键索引primary --> <select id="findTableIndexByTableName" resultType="String" parameterType="String"> select index_name from information_schema.statistics where table_name = #{tableName} and table_schema = (select database()) and lower(index_name) !='primary' and index_name like 'actable_%' </select> <!-- 删除索引 --> <select id="dropTabelIndex" parameterType="java.util.Map"> <foreach collection="tableMap" index="tableName" item="indexName"> DROP INDEX `${indexName}` on `${tableName}` </foreach> </select> <!-- 创建索引 --> <select id="addTableIndex" parameterType="java.util.Map"> <foreach collection="tableMap" index="tableName" item="fields" separator=";"> CREATE INDEX ${fields.filedIndexName} ON `${tableName}` ( <foreach collection="fields.filedIndexValue" index="index" item="columnName"> <if test="fields.filedIndexValue.size == 1"> ${columnName} </if> <if test="fields.filedIndexValue.size > 1"> ${columnName} <if test="fields.filedIndexValue.size != index + 1"> , </if> </if> </foreach> ) </foreach> </select> <!-- 创建唯一约束 --> <select id="addTableUnique" parameterType="java.util.Map"> <foreach collection="tableMap" index="tableName" item="fields" separator=";"> CREATE UNIQUE INDEX ${fields.filedUniqueName} ON `${tableName}` ( <foreach collection="fields.filedUniqueValue" index="index" item="columnName"> <if test="fields.filedUniqueValue.size == 1"> ${columnName} </if> <if test="fields.filedUniqueValue.size > 1"> ${columnName} <if test="fields.filedUniqueValue.size != index + 1"> , </if> </if> </foreach> ) </foreach> </select> </mapper>