查询一张表的所有数据。

环境:

使用工具IntelliJ IDEA 2018.2版本。

创建Maven工程不用骨架

1.pom.xml

 <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.jxjdemo</groupId>
<artifactId>day33_mybatis1_quicksta</artifactId>
<version>1.0-SNAPSHOT</version> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties> <dependencies>
<!--MySql数据库-->
<dependency><!-- 依赖 -->
<groupId>mysql</groupId><!--公司名/组织名groupId:域名倒写 -->
<artifactId>mysql-connector-java</artifactId><!--项目包/包名 -->
<version>5.1.47</version><!--版本号version:1.0-SNAPSHOT 开发版 1.0-RELEASE稳定发行版 -->
</dependency>
<!--MyBatis的jar包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<!--日志包-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope> <!--加test单元测试只能写在test内-->
</dependency>
</dependencies> </project>

2.表-类

 package com.jxjdemo.domain;

 import java.util.Date;

 public class User {
private Integer id;
private String username;
private Date birthday; //导包,框架自动帮我们转可以这样写。
private String sex;
private String address; @Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", birthday=" + birthday +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
'}';
}
//省略Get与Set方法

3.映射器

 package com.jxjdemo.dao;
import com.jxjdemo.domain.User;
import java.util.List;
/**
* 映射器:dao层的接口
*/
public interface UserDao {
List<User> queryAll();
}

4.映射器配置文件

 <?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:映射器的全限定类名
-->
<mapper namespace="com.jxjdemo.dao.UserDao">
<!--
statement:映射器里面每个方法的配置信息,叫做statement
select标签:用于查询
insert标签:用于插入
update标签:用于修改
delete标签:用于删除 以上四个标签都有的属性:
id:映射器里面写 方法的名称
resultType 结果集封装的类型
-->
<select id="queryAll" resultType="com.jxjdemo.domain.User">
select * from user
</select>
</mapper>

5.数据库核心配置文件

 <?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">
<!--mybatis的核心配置文件,主要配置数据库连接信息-->
<configuration><!--根标签-->
<!--enxironments 可以配置多个数据库环境-->
<environments default="mysql"><!--default 默认使用的数据库-->
<environment id="mysql"><!--environment每一个数据库连接(配置)信息-->
<transactionManager type="JDBC"/><!--事物管理方式-->
<dataSource type="POOLED"><!--数据源。不使用UN连接池POOLED,POOLED使用连接池,JNDI查找数据源配置文件-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:端口号/库名"/>
<property name="username" value="账号"/>
<property name="password" value="密码"/>
</dataSource>
</environment>
</environments>
<mappers><!--映射器-->
<mapper resource="com/jxjdemo/dao/UserDao.xml" />
</mappers>
</configuration>

6.测试类

 package com.jxjtest.test;

 import com.jxjdemo.dao.UserDao;
import com.jxjdemo.domain.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 org.junit.Test; import java.io.IOException;
import java.io.InputStream;
import java.util.List; public class QuickstartTest { //Quickstart快速开始
@Test
public void testQuickStart() throws IOException {
//1.读取配置文件
InputStream is = Resources.getResourceAsStream("sqlMapConfig.xml"); //抛出异常 //2.读取到Sqlsession对象.要从SqlSessionFactory里面生产SqlSession对象
SqlSessionFactory facyory = new SqlSessionFactoryBuilder().build(is);
//new一个工厂,给他传流,返回一个工厂对象
SqlSession session = facyory.openSession();//有了工厂对象,就用openSession得到session //3.操作数据库
UserDao userDao = session.getMapper(UserDao.class);//使用getMapper返回UserDao对象,动态代理有接口就行。创建代理对象
List<User> userList = userDao.queryAll();
for (User user : userList) {
System.out.println(user);
}
//4.释放资源
session.close();
is.close();
}
}

7.项目结构

8..在测试类打断点,开始deBug跟踪,从这里开始。首先得到UserDao,dao对象是一个代理对象。

  UserDao userDao = session.getMapper(UserDao.class);//使用getMapper返回UserDao对象
2 List<User> userList = userDao.queryAll();

9.到MapperProxy.java里的invole方法

  @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
try {
if (Object.class.equals(method.getDeclaringClass())) {//1.
return method.invoke(this, args);
} else if (method.isDefault()) {//2.
return invokeDefaultMethod(proxy, method, args);
}
} catch (Throwable t) {
throw ExceptionUtil.unwrapThrowable(t);
}
final MapperMethod mapperMethod = cachedMapperMethod(method);//3.
return mapperMethod.execute(sqlSession, args);//4.开始执行映射器的方法进入方法
}

10.到了MapperMethod.java中

 public Object execute(SqlSession sqlSession, Object[] args) {
Object result;
switch (command.getType()) {//1.判断登陆类型
case INSERT: {
Object param = method.convertArgsToSqlCommandParam(args);
result = rowCountResult(sqlSession.insert(command.getName(), param));
break;
}
case UPDATE: {
Object param = method.convertArgsToSqlCommandParam(args);
result = rowCountResult(sqlSession.update(command.getName(), param));
break;
}
case DELETE: {
Object param = method.convertArgsToSqlCommandParam(args);
result = rowCountResult(sqlSession.delete(command.getName(), param));
break;
}
case SELECT:
if (method.returnsVoid() && method.hasResultHandler()) {
executeWithResultHandler(sqlSession, args);//2.执行查询,就是select
result = null;
} else if (method.returnsMany()) {//3.根据方法返回值判断,returnsMany()返回多个
result = executeForMany(sqlSession, args);//4.调了executeForMany进入
} else if (method.returnsMap()) {
result = executeForMap(sqlSession, args);
} else if (method.returnsCursor()) {
result = executeForCursor(sqlSession, args);
} else {
Object param = method.convertArgsToSqlCommandParam(args);
result = sqlSession.selectOne(command.getName(), param);
if (method.returnsOptional()
&& (result == null || !method.getReturnType().equals(result.getClass()))) {
result = Optional.ofNullable(result);
}
}
break;

11.到了executeForMany

 private <E> Object executeForMany(SqlSession sqlSession, Object[] args) {
List<E> result;
Object param = method.convertArgsToSqlCommandParam(args);//1.准备方法的参数
if (method.hasRowBounds()) {//2.因为查询全部,没有参数,所以参数是null
RowBounds rowBounds = method.extractRowBounds(args);
result = sqlSession.selectList(command.getName(), param, rowBounds);
} else {
result = sqlSession.selectList(command.getName(), param);//到了这里setlectList与
}

12.剩余请看步骤截图。与https://www.cnblogs.com/jxearlier/p/11625253.html从11步开始。

13.完整流程如下。

Mybatis映射器接口代理对象的方式 运行过程的更多相关文章

  1. Mybatis 映射器接口实现类的方式 运行过程debug分析

    查询一张表的所有数据. 环境: 使用工具IntelliJ IDEA 2018.2版本. 创建Maven工程不用骨架 <?xml version="1.0" encoding= ...

  2. mybatis 映射器(mappers) 配置说明 加载映射文件方式

    映射器(mappers) 既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要定义 SQL 映射语句了.但是首先我们需要告诉 MyBatis 到哪里去找到这些语句. Java 在自动查找这 ...

  3. MyBatis映射器(转载)

    什么是MyBatis映射器? MyBatis框架包括两种类型的XML文件,一类是配置文件,即mybatis-config.xml,另外一类是映射文件,例如XXXMapper.xml等.在MyBatis ...

  4. MyBatis映射器(一)--多参数传递方式

    在mybatis映射器的接口中,一般在查询时需要传递一些参数作为查询条件,有时候是一个,有时候是多个.当只有一个参数时,我们只要在sql中使用接口中的参数名称即可,但是如果是多个呢,就不能直接用参数名 ...

  5. mybatis 映射器

    1 映射器 Mapper 是由java接口和 XML 文件共同组成.它的作用如下 1)定义参数类型 2)描述缓存 3)描述 SQL 语句 4)定义查询结果和POJO的映射关系 2 SqlSession ...

  6. mybatis映射器配置细则

    前面三篇博客我们已经多次涉及到映射器的使用了,增删查基本上都用过一遍了,但是之前我们只是介绍了基本用法,实际上mybatis中映射器可以配置的地方还是非常多,今天我们就先来看看映射器还有哪些需要配置的 ...

  7. 【长文】Spring学习笔记(七):Mybatis映射器+动态SQL

    1 概述 本文主要讲述了如何使用MyBatis中的映射器以及动态SQL的配置. 2 MyBatis配置文件概览 MyBatis配置文件主要属性如下: <settings>:相关设置,键值对 ...

  8. MyBatis映射器元素

     映射器是MyBatis最强大的工具,也是我们使用MyBatis时用的最多的工具,映射器中主要有增删改查四大元素,来满足不同场景的需要: 下面是主要元素的介绍:         select:查询语句 ...

  9. 阶段3 1.Mybatis_03.自定义Mybatis框架_2.自定义Mybatis的分析-创建代理对象的分析

    如何创建代理对象,以及使用设计模式带来的优势 调用的组合关系 不关注的,执行JDBC那一套.第二个是解析XML,解析的技术有很多.

随机推荐

  1. m0n0防火墙安装配置方法

    m0n0防火墙安装配置方法 准备工具: vmware虚拟机 m0n0防火墙安装镜像:M0n0Wall - generic-pc-1.8.1.iso 桥接网卡ip:192.168.43.0/24 hos ...

  2. NLP学习(5)----attention/ self-attention/ seq2seq/ transformer

    目录: 1. 前提 2. attention (1)为什么使用attention (2)attention的定义以及四种相似度计算方式 (3)attention类型(scaled dot-produc ...

  3. django 权限设置-菜单显示

    问题:在用户登录后,如何只显示出用户权限的菜单呢?需要设置显示菜单权限 1.为了显示菜单,需要在models权限上添加is_menu(手动判断是否是查看)的icon(图标字符串) 在rbac中录入另一 ...

  4. @TableName(mybatis-plus中的注解)

    @TableName 描述:表名注解 属性 类型 必须指定 默认值 描述 value String 否 "" 表名 schema String 否 "" sch ...

  5. 11-cmake语法-函数和宏的定义

    cmake语法不仅仅可以适用于 CMakeLists.txt,也适用于 xxx.cmake 文档. 在 OpenCV 的 CMakeLists.txt 中,很多 ocv_XXX() 的函数,都是定义在 ...

  6. PEPE规范 和 垃圾回收

    目录 1.python解释器的种类及特点 2.PEP8规范 3.解释型语言和编译型语言 4.bit.B.KB.MB.GB的关系 5.列举你所了解到python2和python3的区别 6.is和==的 ...

  7. ESA2GJK1DH1K基础篇: 移植官方MQTT包,让TCP实现MQTT功能(以GPRS模块为例)

    前言 这节代码将在这一节的基础上实现 拷贝第一节测试里面的MQTT文件夹到当前工程 当前工程建个MQTT的文件夹,用于存放那个MQTT文件夹里面的内容 添加文件到里面 注意:::: 实际源码拷贝位置 ...

  8. 网络协议 19 - RPC协议综述

    这几年微服务很火,想必各位博友或多或少的都接触过.微服务概念中, 各服务间的相互调用是不可或缺的一环.你知道微服务之间是通过什么方式相互调用的吗?     你可能说,这还不简单,用 socket 呗. ...

  9. Huffman树与Huffman编码

    1.Huffman树 今天复习Huffman树.依稀记得自己被Huffman树虐的经历.还记得是7月份,我刚开始看数据结构与算法,根本看不懂Huffman树的操作.后来我终于悟出了Huffman树是怎 ...

  10. VUE温习:内存泄漏、Vue.$set、key作用与虚拟diff算法

    一.内存泄漏 1.指令绑定了事件,却没有解绑事件,容易产生内存泄漏.(曾经遇到过的案例) 2.v-if指令产生内存泄漏,比如v-if删除了父级元素,却没有删除父级元素里的dom片段 3.跳转到别的路由 ...