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

这篇具有很好参考价值的文章主要介绍了如何利用代码快速生成mapper.xml的<resultMap>。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一,问题引入

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

column 和jdbcType分别对应涉及到的表的字段和类型
如何利用代码快速生成mapper.xml的<resultMap>
引出问题:我们在写下面这段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')

得到表的列名和列名对应的类型
如何利用代码快速生成mapper.xml的<resultMap>
我们可以通过给定的数据库名和表名字来查询出这几张表的所有字段和字段类型,
然后通过字符串拼接和处理来拼接出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
如何利用代码快速生成mapper.xml的<resultMap>
点击提交,打开浏览器控制台,可以看到生成的效果
如何利用代码快速生成mapper.xml的<resultMap>

idea控制台也可以看到结果:
如何利用代码快速生成mapper.xml的<resultMap>
HouseRent文章来源地址https://www.toymoban.com/news/detail-424199.html

到了这里,关于如何利用代码快速生成mapper.xml的<resultMap>的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MyBatis核心 - SqlSession如何通过Mapper接口生成Mapper对象

    书接上文 MyBatis – 执行流程 我们通过SqlSession获取到了UserMapper对象,代码如下: 我们看到,往 sqlSession.getMapper 传入UserMapper接口后,得到的是一个 userMapper 对象,这是怎么做到的呢? 查看SqlSession源码发现,SqlSession有两个实现类,在正常情况下使用的当然就是默认的 Default

    2024年02月14日
    浏览(35)
  • 如何利用Mybatis-Plus自动生成代码(超详细注解)

    1、简介 MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 特性 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑 损耗小:启动即会自动注入基本 CURD,性

    2024年02月01日
    浏览(32)
  • 【JeecgBoot-Vue3】第6节 低代码平台如何快速生成代码(上)

    【JeecgBoot-Vue3】零基础入门 - 首页 一、场景 二、代码介绍 1. 后端 1.1 online代码生成器 1.2 数据库配置 1.3 代码生成配置 三、单表 CRUD Step 1:新增表 Step 2:填写 表名  表描述,其它默认 Step 3:新增字段 数据库属性 Step 4:新增字段 页面属性 Step 5:新增字段 校验字段 Step 6:保

    2024年02月15日
    浏览(29)
  • 【JeecgBoot-Vue3】第6节 低代码平台如何快速生成代码(下 - 主附表)

    目录 【JeecgBoot-Vue3】零基础入门 - 首页 一、场景 二、功能介绍 三、主附表CRUD 3.1 建主表-test_class Step 1:新增主表 Step 2:填写 表名  表描述,其它默认 Step 3:新增字段 数据库属性 Step 4:新增字段 页面属性 Step 5:保存 同步数据库 3.2 建附表 -  test_student Step 1:新增附表

    2024年02月09日
    浏览(28)
  • 3秒钟教你如何配置vscode中的vue3代码快速生成模版

    代码如下:  赶快去尝试吧!

    2024年02月09日
    浏览(42)
  • Mapper.xml文件解析

     最近在做一个分布式项目,看到xml文件原先只是上网CV,还是要搞清楚吧! 下面是一个Mybatis的SQL映射文件的配置 这个元素定义了命名空间,用于标识这个映射文件对应的接口。在这里,命名空间指向了 cn.itedus.lottery.infrastructure.dao.IActivityDao 这个接口,表示这个映射文件用

    2024年02月10日
    浏览(29)
  • 报错:Parsed mapper file: ‘file mapper.xml 导致无法启动

    报错 : Logging initialized using \\\'class org.apache.ibatis.logging.stdout.StdOutImpl\\\' adapter. Registered plugin: \\\'com.github.yulichang.interceptor.MPJInterceptor@3b2c8bda\\\' Parsed mapper file: \\\'file [/Mapper.xml]\\\'  application无法启动 我这边产生原因是项目中添加了 mybayis-plus-join插件 导致这个问题 然后本人一顿骚操作:升

    2024年02月04日
    浏览(34)
  • Mybatis|mapper配置文件xml位置

    在核心配置文件mybatis-config.xml中设置映射文件位置 application.yml文件中添加配置: mybatis案例中和springboot中都是一样的,只要目录名和包名相同 需要在pom.xml中添加如下内容 越努力,越幸运! codefishyyf与你一起努力!

    2024年02月06日
    浏览(57)
  • 深入实现 MyBatis 底层机制的任务阶段4 - 开发 Mapper 接口和 Mapper.xml

    😀前言 在我们的自定义 MyBatis 底层机制实现过程中,我们已经深入研究了多个任务阶段,包括配置文件的读取、数据库连接的建立、执行器的编写,以及 SqlSession 的封装。每个任务阶段都为我们揭示了 MyBatis 内部工作原理的一部分,为构建完整的底层框架打下了坚实的基础

    2024年02月09日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包