首页 > 作文

原理分析Java Mybatis中的Mapper

更新时间:2023-04-04 10:34:21 阅读: 评论:0

目录
准备1.pom文件2.ur类-数据库3.实体类4.dao 层5.mapper 文件源码分析1.断点2.查看源码总结

准备

1.pom文件

 <dependencies>        <!--mybatis坐标-->        <dependency>            <groupid>org.mybatis</groupid>            <artifactid>mybatis</artifactid>            <version>3.4.5</version>        </dependency>        <!--mysql驱动坐标-->        <dependency>            <groupid>mysql</groupid>            <artifactid>mysql-connector-java&世界史专业lt;/artifactid>            <version>5.1.6</version>            <scope>runtime</scope>        </dependency>        <!--单元测试坐标-->        <dependency>            <groupid>junit</groupid>            <artifactid>junit</artifactid>            <version>4.12</version>            <scope>test</scope>        </dependency>        <!--日志坐标-->        <dependency>            <groupid>log4j</groupid>            <artifactid>log4j</artifactid>            <version>1.2.12</version>        </dependency>        <dependency>            <groupid>org.projectlombok</groupid>            <artifactid>lombok</artifactid>            <version>1.18.2</version>            <scope>provided</scope>        </dependency>    </dependencies>

2.ur类-数据库

3.实体类

@getter@tter@tostring@noargsconstructorpublic class ur {    private int id;    private string urname;    private string password;}

4.dao 层

public interface urdao {    list<ur> findall();}

5.mapper 文件

<?xml version="1.0" encoding="utf-8" ?><!doctype mapper        public "-//my三年级上册数学期末测试卷人教版batis.org//dtd mapper 3.0//en"        "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="dao.urdao">    <lect id="findall" resulttype="mode.ur">        lect * from ur    </lect></mapper>

核心配置文件

<?xml version="1.0" encoding="utf-8" ?><!doctype configuration public "-//mybatis.org//dtd config 3.0//en" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration>    <!--通过properties标签加载外部properties文件-->    <properties resource="jdbc.properties"></properties>    <!--自定义别名-->    <typealias>        <typealias type="mode.ur" alias="ur"></typealias>    </typealias>    <!--数据源环境-->    <environments default="developement">        <environment id="developement">            <transactionmanager type="jdbc"></transactionmanager>            <datasource type="pooled">                <property name="driver" value="${jdbc.driver}"/>                <property name="url" value="${jdbc.url}"/>                <property name="urname" value="${jdbc.urname}"/>                <property name="password" value="${jdbc.password}"/>            </datasource>        </environment>    </environments>    <!--加载映射文件-->    <mappers>        <mapper resource="urmapper.xml"></mapper>    </mappers></configuration>

核心代码

import dao.urdao;import mode.ur;import org.apache.ibatis.io.resources;import org.apache.ibatis.ssion.sql小学德育总结ssion;import org.apache.ibatis.ssion.sqlssionfactory;import org.apache.ibatis.ssion.sqlssionfactorybuilder;import java.io.ioexception;import java.io.inputstream;import java.util.list;public class testmapper {    public static void main(string[] args) throws ioexception {        //加载核心配置文件        inputstream resourceasstream = resources.getresourceasstream("sqlmapconfig.xml");        //获得sqlssion工厂对象        sqlssionfactory sqlssionfactory = new                sqlssionfactorybuilder().build(resourceasstream);        //获得sqlssion对象        sqlssion sqlssion = sqlssionfactory.openssion();        //执行sql语句        urdao mapper = sqlssion.getmapper(urdao.class);        list<ur> urlist = mapper.findall();        //打印结果        system.out.println(urlist);        //释放资源        sqlssion.clo();    }}

源码分析

1.断点

2.查看源码

defaultsqlssion:

configuration:

这是configuration 类。我们主要看getmapper()方法

mapperregistry:

关键代码:mapperproxyfactory.newinstance(sqlssion);

mapperproxyfactory:

返回的是mapperproxy 对象

mapperproxy:

源码:

// source code recreated from a .class file by intellij idea// (powered by fernflower decompiler)//package org.apache.ibatis.binding;import java.io.rializable;import java.lang.invoke.methodhandles.lookup;import java.lang.reflect.constructor;import java.lang.reflect.invocationhandler;import java.lang.reflect.method;import java.util.map;import org.apache.ibatis.lang.usjava7;import org.apache.ibatis.reflection.exceptionutil;import org.apache.ibatis.ssion.sqlssion;public class mapperproxy<t> implements invocationhandler, rializable {    private static final long rialversionuid = -6424540398559729838l;    private final sqlssion sqlssion;    private final class<t> mapperinterface;    private final map<method, mappermethod> methodcache;    public mapperproxy(sqlssion sqlssion, class<t> mapperinterface, map<method, mappermethod> methodcache) {        this.sqlssion = sqlssion;        this.mapperinterface = mapperinterface;        this.methodcache = methodcache;    }    public object invoke(object proxy, method method, object[] args) throws throwable {        try {            if (object.class.equals(method.getdeclaringclass())) {                return method.invoke(this, args);            }            if (this.isdefaultmethod(method)) {                return this.invokedefaultmethod(proxy, method, args);            }        } catch (throwable var5) {            throw exceptionutil.unwrapthrowable(var5);        }        mappermethod mappermethod = this.cachedmappermethod(method);        return mappermethod.execute(this.sqlssion, args);    }    private mappermethod cachedmappermethod(method method) {        mappermethod mappermethod = (mappermethod)this.methodcache.get(method);        if (mappermethod == null) {            mappermethod = new mappermethod(this.mapperinterface, method, this.sqlssion.getconfiguration());            this.methodcache.put(method, mappermethod);        }        return mappermethod;    }    @usjava7    private object invokedefaultmethod(object proxy, method method, object[] args) throws throwable {        constructor<lookup> constructor = lookup.class.getdeclaredconstructor(class.class, integer.type);        if (!constructor.isaccessible()) {            constructor.taccessible(true);        }        class<?> declaringclass = method.getdeclaringclass();        return ((lookup)constructor.newinstance(declaringclass, 15)).unreflectspecial(method, declaringclass).bindto(proxy).invokewitharguments(args);    }    private boolean isdefaultmethod(method method) {        return (method.getmodifiers() & 1033) == 1 && method.getdeclaringclass().isinterface();    }}

在invoke方法中可以看到,如果我们调用的是object中的方法,不做任何处理,直接调用,否则员工转正自我鉴定执行:

mappermethod.execute(this.sqlssion, args);

mappermethod:

在mappermethod 中清朝有多少位皇帝对sql语句进行分类反射

总结

mapperproxyfactory中,使用jdk的动态代理生成mapper接口的代理代理类由动态处理器mapperproxy中调用mappermethod中的方法处理执行sql最后,在mappermethod中根据执行的方法返回值决定调用sqlssion中的对应方法执行sql

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注www.887551.com的更多内容!

本文发布于:2023-04-04 10:34:18,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/63e187c574f41c7c1711a7ed7208c95b.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:原理分析Java Mybatis中的Mapper.doc

本文 PDF 下载地址:原理分析Java Mybatis中的Mapper.pdf

标签:文件   方法   源码   坐标
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图
  • 我要关灯
    我要开灯
  • 返回顶部