mybatis中 MAPPER接口中定义的接口方法是如何实现的?

eisldkw 2019-07-11 10:29:54


1、PersonMapper.java 文件内容如下:
<?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">

<!-- namespace指用户自定义的命名空间。 -->

<mapper namespace="org.fkit.mapper.PersonMapper">

<!-- 根据id查询Person,返回resultMap -->
<select id="selectPersonById" parameterType="int" resultMap="personMapper">
SELECT * from tb_person where id = #{id}
</select>

<!-- 映射Peson对象的resultMap -->
<resultMap type="org.fkit.domain.Person" id="personMapper">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="sex" column="sex"/>
<result property="age" column="age"/>

</resultMap>

</mapper>

2、PersonMapper.java 文件内容如下:
package org.fkit.mapper;
import org.fkit.domain.Person;

public interface PersonMapper
{
Person selectPersonById(Integer id);
}

3、OneToOneTest.java 文件内容如下:
package org.fkit.test;

public class OneToOneTest {

public static void main(String[] args) throws Exception {

// 读取mybatis-config.xml文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");

// 初始化mybatis,创建SqlSessionFactory类的实例
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

// 创建Session实例
SqlSession session = sqlSessionFactory.openSession();

PersonMapper pm = session.getMapper(PersonMapper.class);
// 直接调用接口的方法,查询id为1的Peson数据
Person p = pm.selectPersonById(1);


}

}


请问:

1、 Person p = pm.selectPersonById(1) 这个用法中 PersonMapper.java 类中只声明了 selectPersonById 方法 但是没有定义 selectPersonById 呀。它是如何实现的,请讲解一下原理。

2、PersonMapper pm = session.getMapper(PersonMapper.class) 这是一种什么用法,请讲解一下。

...全文
567 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
eisldkw 2019-07-12
  • 打赏
  • 举报
回复
引用 2 楼 kevin__p 的回复:
第一个问题:
非常感谢,请问这些知识什么资料上有讲。谢谢。
eisldkw 2019-07-12
  • 打赏
  • 举报
回复
引用 2 楼 kevin__p 的回复:
第一个问题:我们一般在使用mybtis的时候,是把mapper接口和sql语句分开写的,mapper接口和xml之间通过namespace关联,组成一个映射器,一般项目开发的过程中分层,我们一般在service层调用dao层就是mapper层的接口,这个接口的方法其实通过映射器在xml里面实现了,这就是为什么mapper接口的方法名和xml文件的id要保持一致的原因。 第二个:这个是动态代理,我们一般在实际开发中不会用到这个,这个一般用来做测试,可以看你的sql语句写的是否正确,因为mapper接口只是一个抽象接口,不能实例化,所以用动态代理的方式创建实例后就可以调用这个接口里面的方法了;
非常感谢。
maradona1984 2019-07-12
  • 打赏
  • 举报
回复
引用 7 楼 eisldkw 的回复:
[quote=引用 6 楼 maradona1984 的回复:] [quote=引用 4 楼 eisldkw 的回复:] [quote=引用 2 楼 kevin__p 的回复:] 第一个问题:
非常感谢,请问这些知识什么资料上有讲。谢谢。[/quote] 知识来源很多,但几乎都在网上存在,良莠不齐,得你自己甄别,这需要你足够的基础,且掌握了规律,而不仅仅只会用 学会用搜索引擎,你可以慢慢撬动你不熟悉的知识,这是一个慢慢深入的过程[/quote] 非常感谢,难道不用看书吗,不看书,怎么知道去搜哪些资料?谢谢。[/quote] 如果有一定基础,不太建议去看书,而是有针对性的学习,书大而全,反而没有重点,而学会利用搜索引擎,你可以学到你想要的东西
Monday_@@ 2019-07-12
  • 打赏
  • 举报
回复
代理对象实现; 首先我们在执行Mapper接口方法时,实际执行的是MyBatis的代理对象,代理对象在invoke方法内获取Mapper接口类全名和方法名 作为statement的id,然后去通过ID去statement匹配注册的sql,然后使用SqlSession执行这个sql。 大概就是这个样子吧
eisldkw 2019-07-12
  • 打赏
  • 举报
回复
引用 6 楼 maradona1984 的回复:
[quote=引用 4 楼 eisldkw 的回复:] [quote=引用 2 楼 kevin__p 的回复:] 第一个问题:
非常感谢,请问这些知识什么资料上有讲。谢谢。[/quote] 知识来源很多,但几乎都在网上存在,良莠不齐,得你自己甄别,这需要你足够的基础,且掌握了规律,而不仅仅只会用 学会用搜索引擎,你可以慢慢撬动你不熟悉的知识,这是一个慢慢深入的过程[/quote] 非常感谢,难道不用看书吗,不看书,怎么知道去搜哪些资料?谢谢。
maradona1984 2019-07-12
  • 打赏
  • 举报
回复
引用 4 楼 eisldkw 的回复:
[quote=引用 2 楼 kevin__p 的回复:] 第一个问题:
非常感谢,请问这些知识什么资料上有讲。谢谢。[/quote] 知识来源很多,但几乎都在网上存在,良莠不齐,得你自己甄别,这需要你足够的基础,且掌握了规律,而不仅仅只会用 学会用搜索引擎,你可以慢慢撬动你不熟悉的知识,这是一个慢慢深入的过程
kevin__p 2019-07-12
  • 打赏
  • 举报
回复
第一个问题:我们一般在使用mybtis的时候,是把mapper接口和sql语句分开写的,mapper接口和xml之间通过namespace关联,组成一个映射器,一般项目开发的过程中分层,我们一般在service层调用dao层就是mapper层的接口,这个接口的方法其实通过映射器在xml里面实现了,这就是为什么mapper接口的方法名和xml文件的id要保持一致的原因。 第二个:这个是动态代理,我们一般在实际开发中不会用到这个,这个一般用来做测试,可以看你的sql语句写的是否正确,因为mapper接口只是一个抽象接口,不能实例化,所以用动态代理的方式创建实例后就可以调用这个接口里面的方法了;
引用 4 楼 eisldkw 的回复:
[quote=引用 2 楼 kevin__p 的回复:] 第一个问题:
非常感谢,请问这些知识什么资料上有讲。谢谢。[/quote]
引用 4 楼 eisldkw 的回复:
[quote=引用 2 楼 kevin__p 的回复:] 第一个问题:
非常感谢,请问这些知识什么资料上有讲。谢谢。[/quote] 可以看看ssm(Spring+Mybatis+SpringMVC)框架整合的书,其实这个框架弄懂了,hibernate,structs,Springboot也基本会用了
maradona1984 2019-07-11
  • 打赏
  • 举报
回复
动态代理,当然mybatis实现细节肯定不止这么点,但你关心的部分就是动态代理 第二个问题其实就是第一个问题的实现方案 简单代码实现如下

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class Test {
	public interface Hello {
		public void hello();
		public void dazhaohu();
	}
	public static void main(String[] args) {
		Hello hello = (Hello) Proxy.newProxyInstance(Test.class.getClassLoader(), new Class[] { Hello.class },
				new InvocationHandler() {
					@Override
					public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
						System.out.printf("我是方法:" + method.getName());
						return null;
					}
				});
		hello.hello();
		hello.dazhaohu();
	}
}
kevin__p 2019-07-11
  • 打赏
  • 举报
回复
第一个问题:我们一般在使用mybtis的时候,是把mapper接口和sql语句分开写的,mapper接口和xml之间通过namespace关联,组成一个映射器,一般项目开发的过程中分层,我们一般在service层调用dao层就是mapper层的接口,这个接口的方法其实通过映射器在xml里面实现了,这就是为什么mapper接口的方法名和xml文件的id要保持一致的原因。
第二个:这个是动态代理,我们一般在实际开发中不会用到这个,这个一般用来做测试,可以看你的sql语句写的是否正确,因为mapper接口只是一个抽象接口,不能实例化,所以用动态代理的方式创建实例后就可以调用这个接口里面的方法了;

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧