MySQL生成Mapper映射类的存储过程

  • Post author:
  • Post category:mysql



生成Mapper类名称: generate_class_mapperClass_name

CREATE DEFINER=`admin`@`%` PROCEDURE `generate_class_mapperClass_name`(in t_name varchar(255),in split_joint_str varchar(255), out property_name varchar(255))
BEGIN -- 原来的 procedure - sql5java,现在改名为  generate_class_mapperClass_name,用于生成类名称或者是映射类的名称
   DECLARE n   int  DEFAULT 0; -- 特殊字符总个数
	 DECLARE i   int  DEFAULT 0; -- 循环变量
	 DECLARE ind int  DEFAULT 0; -- 得到特殊字符的下标
	 DECLARE left_str  varchar(255); -- 左边的字符串
	 DECLARE right_str varchar(255); -- 右边的字符串
	 DECLARE midd_char varchar(255); -- 中间的那个需要修改的字符
	 DECLARE str       varchar(1024); -- 用于拼接的变量
	 DECLARE first_str varchar(255); -- 第一个字符
	 DECLARE join_str  varchar(255); -- 拼接进来的字符串
	 SET i = 1;
	 SET str = t_name;
	 SET join_str = split_joint_str;
	 SET n = length(str)-length(REPLACE(str,"_",""))+1; -- 总共有多少次需要进行替换以及大小写变化
    WHILE i < n DO 
		    SET ind = LENGTH(SUBSTRING_INDEX(str,'_',i)); -- 特殊字符的下标
			  SET left_str = CONCAT(SUBSTRING_INDEX(str,'_',i),'_'); -- 特殊字符左边的字符串
				SET right_str = 
				SUBSTRING(SUBSTRING_INDEX(str,'_',i-(n)),2,LENGTH(SUBSTRING_INDEX(str,'_',i-(n)))); -- 特殊字符右边的字符串
				SET midd_char = UPPER(SUBSTRING(SUBSTRING_INDEX(str,'_',i-(n)),1,1)); -- 需要变化成大写的字符
				SET str = concat(left_str,midd_char,right_str); -- 对str字符串变量进行重新赋值
				SET i = i+1;
    END WHILE;
		SET first_str = UPPER(SUBSTRING(str,1,1));
		SET str = SUBSTRING(REPLACE(str,"_",""),2);
		SET property_name = CONCAT(first_str,str,join_str);
END


通过逗号分隔开字段取值:fieldValue_split_by_comma

CREATE DEFINER=`admin`@`%` PROCEDURE `fieldValue_split_by_comma`(in splitContent varchar(255))
BEGIN -- 原来的procedure - sql9java,现在改名为 field_split_by_comma
   DECLARE n   int  DEFAULT 0; -- 特殊字符总个数
	 DECLARE test_n   int  DEFAULT 0; -- 特殊字符总个数
	 DECLARE i   int  DEFAULT 0; -- 循环变量
	 DECLARE ind int  DEFAULT 0; -- 得到特殊字符的下标
	 DECLARE left_str  varchar(30); -- 左边的字符串
	 DECLARE str_value varchar(30); -- value变量
	 DECLARE str       varchar(255); -- 用于拼接的变量
	 create temporary table if not exists tmp_sql5java(num int,s_id varchar(255));
	 delete from tmp_sql5java;-- 将拆分出来的那个供应商编号新增入该表					
	 SET i = 1;
	 SET str = splitContent;
	 SET n = length(str)-length(REPLACE(str,",",""))+1; -- 总共有多少次需要进行替换以及大小写变化
	 SET max_sp_recursion_depth = 3000;
    WHILE i <= n DO 
		    SET ind = LENGTH(SUBSTRING_INDEX(str,',',i)); -- 特殊字符的下标
			  SET left_str = SUBSTRING_INDEX(str,',',i); -- 特殊字符左边的字符串
				SET test_n =  LENGTH(SUBSTRING_INDEX(left_str,',',i)); -- 查看截取了的内容是否还有特殊字符
				if(test_n<0) then
				SET str_value = left_str;
				else   
				SET str_value = SUBSTRING_INDEX(left_str,',',-1);
				end if;
				insert into tmp_sql5java values(i,str_value);
				SET i = i+1;
    END WHILE;
END


生成Mapper文件内容:generate_base_mapper


存储过程

generate_property_name

在这里


generate_property_name

CREATE DEFINER=`admin`@`%` PROCEDURE `generate_base_mapper`(in t_name char(255))
BEGIN  -- 原来的 procedure - sql6java,现在改名为 generate_base_mapper
		-- t_name 即table_name 上送参数为表名称
		DECLARE columnName varchar(5000);         -- 原型字段名称
		DECLARE property varchar(255);           -- 大小写驼峰字段名称
		DECLARE mapper varchar(255);             -- 表映射名称
		DECLARE class varchar(255);              -- 类名称
		DECLARE varClass varchar(255);           -- 变量类名称
		DECLARE str text(50000);               -- 字符串变量
		DECLARE columnsStr varchar(5000);                -- 列字符串变量
		DECLARE insertColumnsStr varchar(5000);                -- 列字符串变量
		DECLARE propertyStr varchar(5000);               -- 属性字符串变量
		DECLARE columnPropertyStr varchar(5000); -- 列属性字符串变量
		DECLARE findByIdStr varchar(5000);       -- 通过主键查找对象方法
		DECLARE insertRecord varchar(5000);      -- 新增记录
		DECLARE selectCount varchar(5000);      -- 新增记录
		DECLARE findAll varchar(5000);      -- 新增记录
		DECLARE head varchar(5000);              -- 新增记录
		DECLARE resultMapper text(10000);             -- 新增记录
		DECLARE n  int  DEFAULT 0 ;             -- 总共的字段数
		DECLARE i  int  DEFAULT 0;              -- 循环时的变量
		create temporary table if not exists tmp_sql2java(property_name varchar(255));
		delete from tmp_sql2java;
		SET i = 1;
		SET str = '';
		SET columnsStr = '';
		SET insertColumnsStr = '';
		SET propertyStr = '';
		SET columnPropertyStr = '';
		SET findByIdStr = '';
		SET insertRecord = '';
		SET selectCount ='';      -- 新增记录
		SET findAll ='';
		SET property = '';
		SET mapper = '';
		SET class = '';
		SET varClass = '';
		SET resultMapper = '';
		CALL generate_class_mapperClass_name(t_name,'Mapper',@mapperName);       -- 通过表名称获取得到Mapper类名称
		CALL generate_class_mapperClass_name(t_name,'',@className);  -- 通过表名称获取得到Model类名称
		SET mapper = @mapperName;
		SET class = @className;
		SET head = CONCAT(
										'<?xml version="1.0" encoding="UTF-8"?>\n',
										'<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">\n',
										'<mapper namespace="com.yourshares.entity.dao.',
										mapper,
										'">\n',
										'<resultMap id="BaseResultMap" type="com.yourshares.entity.model.',
										class,
										'">\n'
										);
		select COUNT(*) into n from information_schema.columns where table_name = t_name; -- 总共的字段
WHILE i <= n DO 	                          -- 循环
select column_name into columnName from information_schema.`columns` where table_name = t_name and ordinal_position=i;
CALL generate_property_name(columnName,@propertyName);    -- 通过表字段获取得到属性名称
SET  property = @propertyName;              -- 赋值
CALL generate_class_mapperClass_name(columnName,'Mapper',@varClassName);
SET  varClass = @varClassName;
select 
		CONCAT(
					columnPropertyStr,
					case
					when column_key in ('PRI') then  '<id column="' 
					when column_key not in  ('PRI','MUL')   then  '<result column="'
					when column_key in ('MUL') then  '<association column="'
					end,
					column_name,
					CONCAT('" property="', property, '"  '),
					case
					when column_key in ('PRI') then 
																	CONCAT(
																	'jdbcType="' ,
																	case
																	when data_type in ('int','smallint') then 'INTEGER'
																	else UPPER(data_type)
																	end,
																	'"  />\n'
																	)
				  when column_key not in ('PRI','MUL') then 
																	CONCAT(
																	'jdbcType="' ,
																	case
																	when data_type in ('int','smallint') then 'INTEGER'
																	else UPPER(data_type)
																	end,
																	'"  />\n'
																	)
					when column_key in ('MUL') then 
																	CONCAT(
																	'select="com.yourshares.entity.dao.',
																	@varClassName,
																	'.findById"></association>\n'
																	)
					else ''
					end
		) into columnPropertyStr 
		from
				information_schema.columns
		where
				table_name = t_name and ordinal_position=i;
				
SET str = CONCAT(str,columnPropertyStr); -- 拼接resultMap节点当中的子节点
select CONCAT(columnsStr,'a.',column_name,',') into columnsStr from  information_schema.columns where table_name = t_name and ordinal_position=i; -- 所有字段列
select CONCAT(insertColumnsStr,column_name,',') into insertColumnsStr from  information_schema.columns where table_name = t_name and ordinal_position=i; -- 所有字段列
select CONCAT(propertyStr,'#{',property,'},') into propertyStr from  information_schema.columns where table_name = t_name and ordinal_position=i; -- 所有属性列
SET i = i+1;
END WHILE; 
SET columnsStr = SUBSTRING(columnsStr,1,LENGTH(columnsStr)-1);
SET propertyStr = SUBSTRING(propertyStr,1,LENGTH(propertyStr)-1);
SET findByIdStr = CONCAT(
											'<select id="findById" parameterType="java.lang.Integer" resultMap="BaseResultMap">\n',
											'select ', columnsStr, ' from ', t_name, ' a where a.id=#{value} \n',
											'</select>\n'
											);  -- 查询语句
SET insertRecord = CONCAT(
											'<insert id="insertRecord" parameterType="com.yourshares.entity.model.', class, '">\n',
											' insert into ',t_name, '\n','(',insertColumnsStr,')\n', 'values\n', '(',propertyStr,')\n',
											'</insert>\n'
											);  -- 新增语句
SET selectCount = CONCAT(
												'','',''
											);
SET selectCount = CONCAT(
												'','',''
											);
SET resultMapper = CONCAT(	
														head,
														columnPropertyStr,
														'</resultMap>\n',
														findByIdStr,
														insertRecord,
												    '</mapper>'
													);
select resultMapper;
END

生成原型Model层内容不区分大小写

CREATE DEFINER=`admin`@`%` PROCEDURE `generate_model_not_case`(in t_name char(30))
begin -- 原来的procedure - sql2java,现在改名为 generate_model_not_case,用于生成model层的注释以及属性,属性名称未做驼峰处理
select
    concat(
         '/*',
         column_comment,
         '*/\n',
        'private  ',
        case
    when data_type in ('varchar', 'char', 'text') then
        'String'
    when data_type in ('int', 'tinyint') then
        'Integer'
    when data_type in ('bigint') then
        'Long'
    when data_type in ('datetime') then
        'Date'
    when data_type in ('bit', 'boolean') then
        'Boolean'
    else
        '类型不确定'
    end,
    '  ',
    column_name,
    ';'
    ) as java
from
    information_schema. columns
where
    table_name = t_name;
end

下面这个存储过程是david让给前段弄的,也是model的差不多的意思

CREATE DEFINER=`admin`@`%` PROCEDURE `generate_view_interface_model`(in t_name char(125))
BEGIN  -- 原来的procedure - sql7java, 用于前端生成基本属性映射,现在改名为  generate_view_interface_model
DECLARE columnName varchar(1000); -- 字段名称
DECLARE class varchar(125);
DECLARE property varchar(5000);   -- 字段名称
DECLARE columnPropertyStr varchar(5000); -- 列属性字符串变量
DECLARE resultInterface varchar(5000);             -- 新增记录
DECLARE str varchar(5000);       -- 字段名称
DECLARE n  int  DEFAULT 0 ;     -- 总共的字段数
DECLARE i  int  DEFAULT 0;      -- 循环时的变量
create temporary table if not exists tmp_sql2java(property_name varchar(5000));
delete from tmp_sql2java;
SET i = 1;
SET columnPropertyStr = '';
SET str = '';
SET resultInterface = '';
CALL generate_class_mapperClass_name(t_name,'',@className);
SET class = @className;
select count(*) into n from information_schema.columns where table_name = t_name;
WHILE i <= n DO 	
select column_name into columnName from information_schema.`columns` where table_name = t_name and ordinal_position=i;
CALL generate_property_name(columnName,@propertyName);
SET property = @propertyName;
select
    concat(
		     '/*',
         column_comment,
         '*/\n',
        property,
		case
    when is_nullable in ('YES') then
        '?'
    else
        ''
		end,
		":",
    case
    when data_type in ('varchar', 'char', 'text') then
        'string'
    else
        'number'
    end,
    ';\n'
    ) as java into columnPropertyStr 
from
    information_schema. columns
where
    table_name = t_name and ordinal_position=i;
		SET str = CONCAT(str,columnPropertyStr);
SET i = i+1;
END WHILE;
SET resultInterface = CONCAT('export interface ',class,' {\n',str,'}');
		select resultInterface;
END

后面就是一些关于业务逻辑的一些存储过程,这里就不贴了;

贴出来也不太好;

存储过程一般最好不去用在业务上面;

别问,问就是我不知道;



版权声明:本文为qq_43409111原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。