如何利用代码快速生成mapper.xml的<resultMap>

news2024/10/6 4:09:09

一,问题引入

当我们开发 mapper.xml ---->dao接层 ---->service接口---->serviceImp ---->controller层,
其中在mapper.xml编写查询语句的sql时会遇到sql查询到的结果
涉及到多张表的字段,或者单张表的字段过多时,
这时候我们就需写一个< resultMap>来封装一下这段sql的返回结果,这个< resultMap>标签长的样子如下面的图:
1.使用这个返回结果时是通过id的值找到这段定义的
请添加图片描述
2.我们还要自定义一个java类来表示这个返回结果,这个java类的字段是property的值,类型是jdbcType所对应的java中的数据类型;
请添加图片描述
type的值等于这个java类的包名路径例如下面的type=“com.house.wym.entity.UserOrder”
请添加图片描述

column 和jdbcType分别对应涉及到的表的字段和类型
请添加图片描述
引出问题:我们在写下面这段xml以及java类时会消耗掉我们大量的时间

<resultMap type="com.house.wym.entity.UserOrder" id="UserOrderMapper">
		    <id column="o_id" 		jdbcType="INTEGER" property="oID" />
		<result column="h_id" 		jdbcType="INTEGER" property="hID"/>
		<result column="order_time" jdbcType="VARCHAR" property="orderTime"/>
		<result column="order_user" jdbcType="VARCHAR" property="orderUser"/>
		<result column="house_desc" jdbcType="VARCHAR" property="houseDesc"/>
		<result column="house_model" jdbcType="VARCHAR" property="houseModel"/>
		<result column="house_area" jdbcType="VARCHAR" property="houseArea"/>
		<result column="house_floor" jdbcType="VARCHAR" property="houseFloor"/>
		<result column="house_type" jdbcType="VARCHAR" property="houseType"/>
		<result column="house_price" jdbcType="INTEGER" property="housePrice"/>
		<result column="house_address" jdbcType="INTEGER" property="houseAddress"/>
		<result column="house_image" jdbcType="INTEGER" property="houseImage"/>
		<result column="community_name" jdbcType="INTEGER" property="communityName"/>
		<result column="house_linkman" jdbcType="INTEGER" property="houseLinkMan"/>
		<result column="house_oriented" jdbcType="INTEGER" property="houseOriented"/>
	</resultMap>
package com.house.wym.entity;

import java.util.Date;

public class UserOrder {
	private int oID;
	private int hID;
	private Date orderTime;
	private String orderUser;
	private String houseDesc;
	private String houseModel;
	private String houseArea;
	private String houseFloor;
	private String houseType;
	private int housePrice;
	private String houseAddress;
	private String houseImage;
	private String communityName;
	private String houseLinkMan;
	private String houseOriented;
	//省略geter,seter以及构造方法
}

我们能不能写一段代码只需要输入库名表名让他们帮我们自动生成
< result column=“h_id” jdbcType=“INTEGER” property=“hID”/>

二,思路

探索:当我们输入下面sql时

select column_name,data_type from information_schema.columns
where table_schema='house' and table_name in ('t_house','t_order')

得到表的列名和列名对应的类型
请添加图片描述
我们可以通过给定的数据库名和表名字来查询出这几张表的所有字段和字段类型,
然后通过字符串拼接和处理来拼接出result和java字段,
然后就可以得到
和 private String 字段名;有了private String 字段名;在idea中直接右击点击generate 就可以生成getter和setter方法

三,代码

于是我们可以写出下面一个的代码来实现字段名和字段类型的读取

<?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.house.wym.dao.UtilMapper">

    <select id="getType" resultType="map" parameterType="map">
        select column_name,data_type
        from information_schema.columns
        where table_schema = #{database} and table_name in
        <foreach item="item" index="index" collection="table_names" open="(" separator="," close=")">
            #{item}
        </foreach>
    </select>


</mapper>
package com.house.wym.dao;

import org.apache.ibatis.annotations.Mapper;

import java.util.List;
import java.util.Map;

@Mapper
public interface UtilMapper {
    public List<Map<String,String>> getType(Map<String,String> param);
}

package com.house.wym.controller;

import com.house.wym.dao.UtilMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

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

@Controller
public class UtilController {
    @Autowired
    UtilMapper utilMapper;
    @RequestMapping("/toGettype")
    public String toGetTypePage(){
        return "getType";
    }
    //http://localhost:8090/generate?database=house&tables=t_house&tables=t_order
    @ResponseBody
    @RequestMapping("/generate")
    public String getType(HttpServletRequest request){
        //数据库名字,可以把house
        String database = request.getParameter("database");
        //数据库的表名字
        String tables = request.getParameter("tables");
        Map map = new HashMap<>();

        map.put("database",database);
        //数据库的表名字
        List list = new ArrayList();
        String[] tables_arr = tables.split(",");

        for (String name : tables_arr){
            list.add(name);
        }
        map.put("table_names",list);

        List result =utilMapper.getType(map);
        Map NameAndType = new HashMap();

        for(Object item : result){
            HashMap hashMap = (HashMap) item;
            String  columnName = (String) hashMap.get("COLUMN_NAME");
            String dataType = ((String) hashMap.get("DATA_TYPE")).toUpperCase();
            NameAndType.put(columnName,dataType);
        }
        StringBuilder stringBuilder =new StringBuilder();

        System.out.println("---------------生成Result 字符串----------------------");
        Iterator <String> iterator = NameAndType.keySet().iterator();
        while (iterator.hasNext()) {
            String key = iterator.next();
            String type = (String) NameAndType.get(key);
            String template ="<result column="+'\"'+key+'\"'+" jdbcType="+'\"'+type+'\"'+ " property="+'\"'+ replaceUnderlineAndfirstToUpper(key,"_","")+'\"'+"/>";
            System.out.println(template);
            stringBuilder.append(template);
            stringBuilder.append(System.getProperty("line.separator"));
        }
        System.out.println("---------------生成Entity字段----------------------");
        Iterator <String> iterator2 = NameAndType.keySet().iterator();
        while (iterator2.hasNext()) {
            String key = iterator2.next();
            String type = (String) NameAndType.get(key);

            String template ="private "+ MysqlToJava(type) + " " + replaceUnderlineAndfirstToUpper(key,"_","")+";";
            System.out.println(template);
            stringBuilder.append(template);
            stringBuilder.append(System.getProperty("line.separator"));
        }

        return  stringBuilder.toString();
    }
        //把mysql类型转成java类型
        public static String MysqlToJava(String type){
        String result="";
        switch(type) {
            case "INT":
                result = "int";
                break;
            case "TINYINT":
                result = "int";
                break;

            case "VARCHAR":
                result = "String";
                break;
            case "CHAR":
                result = "String";
                break;

            case "DATETIME":
                result = "Date";
                break;
            case "TIME":
                result = "Time";
                break;
            case "BIT":
                result = "Boolean";
                break;
        }
            return result;


        }

        /**
         * 首字母大写
         *
         * @param srcStr
         * @return
         */
        public static String firstCharacterToUpper(String srcStr) {
            return srcStr.substring(0, 1).toUpperCase() + srcStr.substring(1);
        }
        /**
         * 替换字符串并让它的下一个字母为大写 例如: create_time ---> createTime
         * @param srcStr
         * @param org
         * @param ob
         * @return
         */
        public static String replaceUnderlineAndfirstToUpper(String srcStr,String org,String ob)
        {
            String newString = "";
            int first=0;
            while(srcStr.indexOf(org)!=-1)
            {
                first=srcStr.indexOf(org);
                if(first!=srcStr.length())
                {
                    newString=newString+srcStr.substring(0,first)+ob;
                    srcStr=srcStr.substring(first+org.length(),srcStr.length());
                    srcStr=firstCharacterToUpper(srcStr);
                }
            }
            newString=newString+srcStr;
            return newString;
        }
    }

getType.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
         pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Insert title here</title>
    <link rel="stylesheet" href="${pageContext.request.contextPath }/static/layui/css/layui.css">
    <link rel="stylesheet" href="${pageContext.request.contextPath }/static/css/admin.css">
</head>
<body>
<ins class="adsbygoogle"
     style="display:inline-block;width:970px;height:90px"
     data-ad-client="ca-pub-6111334333458862"
     data-ad-slot="3820120620"></ins>
-->

<fieldset class="layui-elem-field layui-field-title" style="margin-top: 50px;">
    <legend>赋值和取值</legend>
</fieldset>

<form class="layui-form" action="" lay-filter="example">
    <div class="layui-form-item">
        <label class="layui-form-label">数据库名</label>
        <div class="layui-input-block">
            <input type="text" name="database" lay-verify="title" autocomplete="off" placeholder="请输入数据库名" class="layui-input">
        </div>
    </div>

    <div class="layui-form-item">
        <label class="layui-form-label">表名</label>
        <div class="layui-input-block">
            <input type="text" name="tables" lay-verify="title" autocomplete="off" placeholder="请输入表名" class="layui-input">
        </div>
    </div>

    <div class="layui-form-item">
        <button class="layui-btn" lay-submit="" lay-filter="demo1">提交</button>
    </div>
</form>

<script src="${pageContext.request.contextPath }/static/layui/layui.js"></script>
<script>
    layui.use(['form', 'layedit', 'laydate'], function(){
        var form = layui.form
            ,layer = layui.layer
            ,layedit = layui.layedit
            ,laydate = layui.laydate,
                $ = layui.jquery;
        //监听提交
        form.on('submit(demo1)', function(data){
            console.log(data.field)

            $.post("generate",data.field,function (result) {
                var index = layer.open({
                    type: 1,
                    title: false,
                    closeBtn: 0,
                    shadeClose: true,
                    skin: 'yourclass',
                    content: '<div><pre>'+ result+ '</pre></div>'
                });
                layer.full(index);
                console.log(data.field)
                console.log(result)

            });
            return false
        });

    });
</script>
</body>
</html>

四,效果:

浏览器输入: http://localhost:8090/toGettype
在这里插入图片描述
点击提交,打开浏览器控制台,可以看到生成的效果
在这里插入图片描述

idea控制台也可以看到结果:
在这里插入图片描述
HouseRent

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/457801.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python文件处理

文章目录 1️⃣基本语法2️⃣读取文件⚜️读取整个文件read()⚜️with 关键词⚜️逐行读取 3️⃣写入文件⚜️写入文件write()⚜️写入数字⚜️追加内容到文件 4️⃣读取和写入二进制文件 简介 读完本篇你将学会文件的创建、读取、写入等。 1️⃣基本语法 在Python中使用文件的…

ThreadLocal机制解读和源码分析

目录 线程数据共享和安全 -ThreadLocal 什么是 ThreadLocal 代码演示 创建Dog.java 创建Pig.java T2DAO.java T2DAO T1解读set T1Service 解读 get ThreadLocalTest这个是换一种法 ThreadLocal 原理分析图 1. ThreadLocal 原理分析图(重点 set 和 get) 线程数据共…

Go Fuzzing:发现你未曾发现的漏洞

文章目录 Fuzzing(模糊测试)要求示例模拟crash 总结参考资料 Fuzzing(模糊测试) go fuzz文档 对于软件开发者而言&#xff0c;一项重要的任务就是确保程序的安全性。而其中一种风险就是软件中可能存在的漏洞。传统的测试方法往往需要耗费大量的时间和人力&#xff0c;而使用F…

【C++: 模块二 ---运算符、流程控制语句】

C&#xff1a; 模块二 ---运算符、流程控制语句 一、运算符&#xff1a;1.1算数运算符&#xff1a;1.2赋值运算符&#xff1a;1.3比较运算符&#xff1a;1.4逻辑运算符&#xff1a;1.5三目运算符&#xff1a; 二、程序流程结构2.1顺序结构&#xff1a;2.2选择结构&#xff1a;&…

ChatGPT免费第一版本

最近利用空余时间做了一个供大家免费体验的chatgpt国内可直接访问的版本 输入12345gpt.com可直接访问 贴上GPT给我回复的内容&#xff0c;&#x1f600; 当今社会&#xff0c;交流已经成为人们日常不可或缺的一部分。然而&#xff0c;随着技术的发展&#xff0c;人们对于交流工…

【Linux 裸机篇(七)】I.MX6U 中断系统

目录 一、中断向量表1. 中断向量偏移 二、中断系统简介1. 创建中断向量表 三、GIC 控制器简介1. 中断 ID 四、GIC 逻辑分块1. Distributor(分发器端)2. CPU Interface(CPU 接口端) 五、CP15 协处理器六、中断使能1. IRQ 和 FIQ 总中断使能2. ID0~ID1019 中断使能和禁止 七、中断…

【PXE高效的批量网络装机】

目录 一、PXE的概述1.1、PXE批量部署的优点1.2、搭建PXE满足的以下的前提条件1.3、搭建PXE远程安装 二、搭建PXE远程安装服务器1、安装并启动 TFTP 服务2、安装并启用 DHCP 服务3、准备 Linux 内核、初始化镜像文件4、准备PXE 引导程序5、安装FTP服务&#xff0c;准备CentOS 7 …

SpringMVC使用域对象共享数据

1、SpringMVC中的域对象 此处只有request、session、servletContext被使用&#xff0c;而page是jsp页面的域&#xff0c;不使用jsp。 request&#xff1a;一次请求的范围内session&#xff1a;一次会话的范围内servletContext&#xff1a;整个web的应用范围内 2、向request域…

MySQL高级第十七篇:数据库主从复制原理及保证数据一致性

MySQL高级第十七篇&#xff1a;数据库主从复制原理及保证数据一致性 一、概述1. 提升数据库的并发能力2. 主从复制的作用&#xff1f; 二、主从复制原理三、搭建一主一从环境四、如何解决数据一致性问题&#xff1f;1. 方案一、异步复制2. 方案二、半同步复制3. 方案三、组复制…

3.黑马Springboot原理篇自己修改笔记

原理篇 1.自动配置的工作流程 1.1 bean的加载方式 方式一&#xff1a;配置文件<bean/>标签 缺点&#xff1a;配置bean太繁琐 方式二&#xff1a;配置文件扫描注解定义bean⭐️ 获取bean方式 ①通过配置文件&#xff0c;扫描指定包&#xff0c;加载bean ②通过注解声…

C++ STL之string容器的模拟实现

目录 一、经典的string类问题 1.出现的问题 2.浅拷贝 3.深拷贝 二、string类的模拟实现 1.传统版的string类 2.现代版的string类&#xff08;采用移动语义&#xff09; 3.相关习题* 习题一 习题二 4.写时拷贝 5.完整版string类的模拟实现[注意重定义] MyString.h…

磁珠的工作原理

磁珠是一个耗能元器件&#xff0c;他能把频率相对较高的信号以热量的形式耗散掉&#xff0c;保留频率相对较低的信号。 主要有这种插件的磁珠&#xff0c;还有这种贴片的磁珠。 下面我们来看下磁珠具体工作原理。 磁珠的构造我们可以简单的看成一个导线穿过环形铁氧体的磁性材…

[渗透教程]-015-网络与系统渗透

文章目录 1.0基本概念2.0 网络与系统渗透基本原理2.1 渗透测试2.2 入侵和预防2.3 案例一:从信息收集到入侵提权2.3.1 从域名到ip2.3.2 从IP获取旁站2.3.3 收集系统与⽹络配置详细信息2.3.4 踩点2.3.5发现漏洞2.3.6漏洞利用2.3.7维持系统控制权2.3.8清理访问痕迹2.4 案例二:Goo…

TryHackMe-Jeff(boot2root | Hard?)

Jeff 你能破解杰夫的网络服务器吗&#xff1f; 如果你发现自己在暴力破解SSH&#xff0c;你就做错了。 端口扫描 循例nmap 进80&#xff0c;是一个空页面&#xff0c;查看源代码 将jeff.thm加入hosts 上gobuster /admin是空页面&#xff0c;/backups也没东西&#xff0c;/up…

Centos安全加固策略

目录 密码安全策略 设置密码的有效期和最小长度 设置用户密码的复杂度 登录安全策略 设置用户远程登录的安全策略 安全的远程管理方式 访问控制 限制root用户登录 修改ssh 22端口 设置登录超时时间 限制IP访问 安全审计 审核策略开启 日志属性设置 查看系统登录…

基础巩固、探寻Java装箱和拆箱的奥妙!

前言 今天在逛某知名论坛的时候&#xff0c;看到一篇"请不要使用包装类型&#xff0c;避免造成性能损失"的文章。一下子就吸引了我的注意。大意就是&#xff0c;能用基本数据类型就尽量用基本数据类型&#xff0c;因为包装类型自动拆箱、装箱会带来性能损失尤其是循环…

函数式编程#3纯函数的概念

纯函数的概念 文章目录 纯函数的概念纯函数的两种形式&#xff1a;调用目标本身,不会改变函数内部,不受函数外部影响 函数的副作用如何理解"相同的输入得到相同的输出"不是纯函数的映射关系是纯函数的映射关系 纯函数的两种形式&#xff1a; 调用目标本身,不会改变 …

gcc编译 与交叉编译(x86 to arm) (一)单个文件编译

1.1、gcc编译单个c程序&#xff08;hello.c) gcc hello.c -o hello (hello是生成的可执行程序的名字&#xff09;1.2、交叉编译hello.c 源平台&#xff1a; UOS_X86_64 目标平台&#xff1a;UOS_arm 方法&#xff1a;使用现成的交叉编译工具链 参考资料&#xff1a;交叉编译…

【UE】water插件的简单使用

UE Editor版本&#xff1a;4.26 目录 一、岛屿外观修改 二、波浪参数设置 三、水体海洋的颜色设置 四、 水体河流 五、创建可浮在水体上的actor 一、岛屿外观修改 1. 保证“Landmass”和“Water”插件已启用 启用后&#xff0c;搜索water可以看到如下组件 2. 激活地形编…

LeetCode:6390. 滑动子数组的美丽值

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; &#x1f33b;算法&#xff0c;不如说它是一种思考方式&#x1f340; 算法专栏&#xff1a; &#x1f449;&#x1f3fb;123 一、&#x1f331;6390. 滑动子数组的美丽值 题目描述&#xff1a;给你一个长度为 n 的整…