文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何进行Java Mybatis中的Mapper原理分析

2023-06-26 03:49

关注

如何进行Java Mybatis中的Mapper原理分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

准备

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</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.user类-数据库

如何进行Java Mybatis中的Mapper原理分析

3.实体类

@Getter@Setter@ToString@NoArgsConstructorpublic class user {    private int id;    private String username;    private String password;}

4.dao 层

public interface userDao {    List<user> findAll();}

5.Mapper 文件

<?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="dao.userDao">    <select id="findAll" resultType="mode.user">        select * from user    </select></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>    <!--自定义别名-->    <typeAliases>        <typeAlias type="mode.user" alias="user"></typeAlias>    </typeAliases>    <!--数据源环境-->    <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="username" value="${jdbc.username}"/>                <property name="password" value="${jdbc.password}"/>            </dataSource>        </environment>    </environments>    <!--加载映射文件-->    <mappers>        <mapper resource="userMapper.xml"></mapper>    </mappers></configuration>

核心代码

import dao.userDao;import mode.user;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;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");        //获得sqlSession工厂对象        SqlSessionFactory sqlSessionFactory = new                SqlSessionFactoryBuilder().build(resourceAsStream);        //获得sqlSession对象        SqlSession sqlSession = sqlSessionFactory.openSession();        //执行sql语句        userDao mapper = sqlSession.getMapper(userDao.class);        List<user> userList = mapper.findAll();        //打印结果        System.out.println(userList);        //释放资源        sqlSession.close();    }}

源码分析

1.断点

如何进行Java Mybatis中的Mapper原理分析

2.查看源码

DefaultSqlSession:

如何进行Java Mybatis中的Mapper原理分析

Configuration:

如何进行Java Mybatis中的Mapper原理分析

这是Configuration 类。我们主要看getMapper()方法

如何进行Java Mybatis中的Mapper原理分析

MapperRegistry:

如何进行Java Mybatis中的Mapper原理分析

关键代码:mapperProxyFactory.newInstance(sqlSession);

MapperProxyFactory:

如何进行Java Mybatis中的Mapper原理分析

返回的是MapperProxy 对象

MapperProxy:

源码:

// Source code recreated from a .class file by IntelliJ IDEA// (powered by FernFlower decompiler)//package org.apache.ibatis.binding;import java.io.Serializable;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.UsesJava7;import org.apache.ibatis.reflection.ExceptionUtil;import org.apache.ibatis.session.SqlSession;public class MapperProxy<T> implements InvocationHandler, Serializable {    private static final long serialVersionUID = -6424540398559729838L;    private final SqlSession sqlSession;    private final Class<T> mapperInterface;    private final Map<Method, MapperMethod> methodCache;    public MapperProxy(SqlSession sqlSession, Class<T> mapperInterface, Map<Method, MapperMethod> methodCache) {        this.sqlSession = sqlSession;        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.sqlSession, args);    }    private MapperMethod cachedMapperMethod(Method method) {        MapperMethod mapperMethod = (MapperMethod)this.methodCache.get(method);        if (mapperMethod == null) {            mapperMethod = new MapperMethod(this.mapperInterface, method, this.sqlSession.getConfiguration());            this.methodCache.put(method, mapperMethod);        }        return mapperMethod;    }    @UsesJava7    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.setAccessible(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();    }}

如何进行Java Mybatis中的Mapper原理分析

在invoke方法中可以看到,如果我们调用的是Object中的方法,不做任何处理,直接调用,否则执行:

mapperMethod.execute(this.sqlSession, args);

MapperMethod:

如何进行Java Mybatis中的Mapper原理分析

在MapperMethod 中对SQL语句进行分类反射

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网行业资讯频道,感谢您对编程网的支持。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯