Mybatis的SqlRunner执行流程

news2024/12/22 17:53:49

 Mybatis的SqlRunner执行流程

    SqlRunner exec = new SqlRunner(connection);    
    Map<String, Object> row = exec.selectOne("SELECT * FROM PRODUCT WHERE PRODUCTID = ?", "FI-SW-01");
    connection.close();
    assertEquals("FI-SW-01", row.get("PRODUCTID"));

TypeHandlerRegistry类中TYPE_HANDLER_MAP 的初始化过程

  public TypeHandlerRegistry() {
    //构造函数里注册系统内置的类型处理器
	  //以下是为多个类型注册到同一个handler
    register(Boolean.class, new BooleanTypeHandler());
    register(boolean.class, new BooleanTypeHandler());
    register(JdbcType.BOOLEAN, new BooleanTypeHandler());
    register(JdbcType.BIT, new BooleanTypeHandler());

    register(Byte.class, new ByteTypeHandler());
    register(byte.class, new ByteTypeHandler());
    register(JdbcType.TINYINT, new ByteTypeHandler());

    register(Short.class, new ShortTypeHandler());
    register(short.class, new ShortTypeHandler());
    register(JdbcType.SMALLINT, new ShortTypeHandler());

    register(Integer.class, new IntegerTypeHandler());
    register(int.class, new IntegerTypeHandler());
    register(JdbcType.INTEGER, new IntegerTypeHandler());

    register(Long.class, new LongTypeHandler());
    register(long.class, new LongTypeHandler());

    register(Float.class, new FloatTypeHandler());
    register(float.class, new FloatTypeHandler());
    register(JdbcType.FLOAT, new FloatTypeHandler());

    register(Double.class, new DoubleTypeHandler());
    register(double.class, new DoubleTypeHandler());
    register(JdbcType.DOUBLE, new DoubleTypeHandler());

	  //以下是为同一个类型的多种变种注册到多个不同的handler
    register(String.class, new StringTypeHandler());
    register(String.class, JdbcType.CHAR, new StringTypeHandler());
    register(String.class, JdbcType.CLOB, new ClobTypeHandler());
    register(String.class, JdbcType.VARCHAR, new StringTypeHandler());
    register(String.class, JdbcType.LONGVARCHAR, new ClobTypeHandler());
    register(String.class, JdbcType.NVARCHAR, new NStringTypeHandler());
    register(String.class, JdbcType.NCHAR, new NStringTypeHandler());
    register(String.class, JdbcType.NCLOB, new NClobTypeHandler());
    register(JdbcType.CHAR, new StringTypeHandler());
    register(JdbcType.VARCHAR, new StringTypeHandler());
    register(JdbcType.CLOB, new ClobTypeHandler());
    register(JdbcType.LONGVARCHAR, new ClobTypeHandler());
    register(JdbcType.NVARCHAR, new NStringTypeHandler());
    register(JdbcType.NCHAR, new NStringTypeHandler());
    register(JdbcType.NCLOB, new NClobTypeHandler());

    register(Object.class, JdbcType.ARRAY, new ArrayTypeHandler());
    register(JdbcType.ARRAY, new ArrayTypeHandler());

    register(BigInteger.class, new BigIntegerTypeHandler());
    register(JdbcType.BIGINT, new LongTypeHandler());

    register(BigDecimal.class, new BigDecimalTypeHandler());
    register(JdbcType.REAL, new BigDecimalTypeHandler());
    register(JdbcType.DECIMAL, new BigDecimalTypeHandler());
    register(JdbcType.NUMERIC, new BigDecimalTypeHandler());

    register(Byte[].class, new ByteObjectArrayTypeHandler());
    register(Byte[].class, JdbcType.BLOB, new BlobByteObjectArrayTypeHandler());
    register(Byte[].class, JdbcType.LONGVARBINARY, new BlobByteObjectArrayTypeHandler());
    register(byte[].class, new ByteArrayTypeHandler());
    register(byte[].class, JdbcType.BLOB, new BlobTypeHandler());
    register(byte[].class, JdbcType.LONGVARBINARY, new BlobTypeHandler());
    register(JdbcType.LONGVARBINARY, new BlobTypeHandler());
    register(JdbcType.BLOB, new BlobTypeHandler());

    register(Object.class, UNKNOWN_TYPE_HANDLER);
    register(Object.class, JdbcType.OTHER, UNKNOWN_TYPE_HANDLER);
    register(JdbcType.OTHER, UNKNOWN_TYPE_HANDLER);

    register(Date.class, new DateTypeHandler());
    register(Date.class, JdbcType.DATE, new DateOnlyTypeHandler());
    register(Date.class, JdbcType.TIME, new TimeOnlyTypeHandler());
    register(JdbcType.TIMESTAMP, new DateTypeHandler());
    register(JdbcType.DATE, new DateOnlyTypeHandler());
    register(JdbcType.TIME, new TimeOnlyTypeHandler());

    register(java.sql.Date.class, new SqlDateTypeHandler());
    register(java.sql.Time.class, new SqlTimeTypeHandler());
    register(java.sql.Timestamp.class, new SqlTimestampTypeHandler());

    // issue #273
    register(Character.class, new CharacterTypeHandler());
    register(char.class, new CharacterTypeHandler());
  }

回到流程中

 

 

 

 

原始的jdbc代码 

/*
	执行DQL语句
*/

import java.sql.*;
import java.util.*;

public class JDBCTest05 {
	public static void main(String[] args) {
		// 1、注册驱动
		// 2、建立连接
		// 3、获取数据库操作对象
		// 4、执行sql语句
		// 5、获取查询结果集
		// 6、释放资源
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;
		
		try{
			ResourceBundle rb = ResourceBundle.getBundle("jdbc");
			String driver = rb.getString("driver");
			String url = rb.getString("url");
			String user = rb.getString("user");
			String password = rb.getString("password");

			Class.forName(driver);

			conn = DriverManager.getConnection(url,user,password);

			stmt = conn.createStatement();

			rs = stmt.executeQuery("select empno,ename,sal from emp");
	
			while(rs.next()){
				/*
				String empno = rs.getString(1);
				String ename = rs.getString(2);
				String sal = rs.getString(3);
				System.out.println(empno + "," + ename + "," + sal);
				*/
				
				/*
				// 按下标取出,程序不健壮
				String empno = rs.getString("empno");
				String ename = rs.getString("ename");
				String sal = rs.getString("sal");
				System.out.println(empno + "," + ename + "," + sal);
				*/
				
				/*
				// 以指定的格式取出
				int empno = rs.getInt(1);
				String ename = rs.getString(2);
				double sal = rs.getDouble(3);
				System.out.println(empno + "," + ename + "," + (sal + 100));
				*/

				int empno = rs.getInt("empno");
				String ename = rs.getString("ename");
				double sal = rs.getDouble("sal");
				System.out.println(empno + "," + ename + "," + (sal + 200));
			}

		} catch(Exception e){
			e.printStackTrace();
		}finally{
			if(rs != null){
				try{
					rs.close();
				} catch (Exception e){
					e.printStackTrace();
				}
			}
			if(stmt != null){
				try{
					stmt.close();
				} catch (Exception e){
					e.printStackTrace();
				}
			}
			if(conn != null){
				try{
					conn.close();
				} catch (Exception e){
					e.printStackTrace();
				}
			}
		}
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1121199.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

YOLOv5算法改进(19)— 手把手教你去更换NMS(DIoU-NMS/CIoU-NMS/EIoU-NMS/GIoU-NMS/SIoU-NMS)

前言:Hello大家好,我是小哥谈。YOLOv5中的NMS指非极大值抑制(Non-Maximum Suppression),它是一种用于目标检测算法中的后处理技术。在检测到多个重叠的边界框时,NMS可以帮助选择最佳的边界框。NMS的工作原理是首先根据预测边界框的置信度对它们进行排序,然后从置信度最高…

iOS逆向工程之Theos

如果你对iOS逆向工程有所了解&#xff0c;那么你对Tweak并不陌生。那么由Tweak我们又会引出Theos, 那么什么是Theos呢&#xff0c;简单一句话&#xff0c;Theos是一个越狱开发工具包&#xff0c;Theos是越狱开发工具的首先&#xff0c;因为其最大的特点就是简单。大道至简&…

python中多行注释与取消注释

在小白学习python编程的过程中&#xff0c;我们经常会发现很多同学们喜欢问的一个问题&#xff1a; 怎么多行注释呢&#xff1f; 怎么取消多行注释呢&#xff1f; 以上种种问题我相信来到这里都会得到相应答案 那我们接下来开始吧&#xff01; 文章目录 单行注释多行注释取消多…

c初阶检测题

选择题 1.局部变量的作用域是&#xff1a;&#xff08;D&#xff09; A.main函数内部 B.整个程序 C.main函数之前 D.局部变量所在的局部范围 2.字符串的结束标志是&#xff1a;&#xff08;A&#xff09; 作业内容 A.是’0’ B.是EOF C. 是’\0’ D.是空格 3.下面那个不是…

精选六个大学生可以做的兼职副业,学习赚钱两不误

在当今的社会中&#xff0c;大学生们面临着学业压力和生活开销。为了减轻家庭的负担&#xff0c;同时也为了更好地拓宽自己的视野和实践能力&#xff0c;许多大学生开始寻找一种既可以学习又能赚钱的副业。这样的选择&#xff0c;不仅可以弥补金钱上的不足&#xff0c;还可以提…

【java计算机毕设】博客管理系统 javaweb springboot vue mysql

目录 1.项目功能截图​ 2.项目简介 3.源码下载地址 1.项目功能截图 2.项目简介 博客管理系统 idea mysql5.7/8 vue html jdk1.8 系统功能&#xff1a; 前台功能&#xff1a;文章信息&#xff0c;相册信息&#xff0c;留言板&#xff0c;个人中心&#xff0c;后台管理 后…

闭包(函数)

把内部函数通过return扔出去 必要条件

靶机 DC-2

DC_2 信息搜集 存活检测 详细扫描 添加 host 后台网页扫描 网页信息搜集 主页面 找到 flag1&#xff0c;提示使用 cewl 密码生成工具 wp 登陆界面 使用 wpscan 扫描用户 wpscan --url http://dc-2/ --enumerate u 扫描出用户 tom、jerry、admin 将三个用户名写入文件中…

一文解密网络背后的秘密

一文解密网络背后的秘密 网络的发展史从键入网址到网页进行显示期间法上了什么&#xff1f;首先我们需要了解一下URLDNS解析建立连接什么是三次握手&#xff0c;可不可以两次呢&#xff1f; 本地发送请求&#xff0c;服务器处理请求断开连接 实践一下 相信大家对网络都不陌生了…

《认知觉醒:开启自我改变的原动力》

目录 第一章 大脑 — 一切问题的起源 第二章 潜意识 — 生命留给我们的彩蛋 第三章 元认知 — 人类的终极能能力 第四章 专注力——情绪和智慧的交叉地带 第五章 学习力——学习不是一味地努力 第六章 行动力 — 没有行动世界只是个概念 第七章 情绪力 — 情绪是多角度看…

【JavaScript】深入讲解浏览器渲染原理

一. 浏览器是如何渲染页面的&#xff1f; 当浏览器的网络线程收到 HTML 文档后&#xff0c;会产生一个渲染任务&#xff0c;并将其传递给渲染主线程的消息队列。 在事件循环机制的作用下&#xff0c;渲染主线程取出消息队列中的渲染任务&#xff0c;开启渲染流程。 渲染&…

Python数据分析实战-使用numpy.where方法基于条件替换某列的值(附源码和实现效果)

实现功能 在Pandas中&#xff0c;replace方法默认是基于精确匹配进行替换&#xff0c;而不是基于条件匹配。要实现基于条件的替换&#xff0c;可以使用numpy.where函数。将DataFrame中某一列的指定的两个值分别替换为0和1&#xff0c;其他值替换为2 实现代码 import pandas …

【tg】3:线程模型:4个主要线程

media :调用主线程worker therad 、network thread 是webrtc要求的module thread 也是webrtc的moudle需要的代码分布 G:\CDN\P2P-DEV\tdesktop-offical\Telegram\ThirdParty\tgcalls\tgcalls\StaticThreads.hgetThreads 触发创建线程 分别获取,看起来是分别只有1个的 Threads…

不愧是疑问解决神器(二)!你强任你强

不愧是疑问解决神器(二)&#xff01;你强任你强&#x1f44d;&#x1f44d;&#x1f44d; 第3章 代码的坏味道 1.神秘命令(Mysterious Name)? 整洁代码中最重要的一环就是有一个好名字&#xff0c;使他们能够清晰地表明自己的功能和用法。但正因为如此&#xff0c;命名就成了…

17.Tensor Product Spaces

同样&#xff0c;本文仍采用非标准 的符号。 在之前的文章里&#xff0c;已经展示了&#xff1a; 使用张量积将向量和协向量组合在一起可以为我们提供线性映射&#xff0c;这个线性映射的系数实际上只是一个数组的条目。 还展示了&#xff1a;使用张量积组合两个协向量&#x…

Linux系统之部署WBO在线协作白板

Linux系统之部署WBO在线协作白板 一、WBO白板工具介绍1.1 WBO白板简介1.2 WBO白板特点 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、检查本地环境3.1 检查本地操作系统版本3.2 检查系统内核版本 四、部署Node.js环境4.1 下载Node.js安装包4.2 解压Node.js安装包4.3 …

进制转换(二进制、八进制、十进制、十六进制)

目录 一&#xff1a;十进制转换为二进制、八进制、十六进制 &#xff08;1&#xff09;整数转换 &#xff08;2&#xff09;小数转换 1&#xff09;十进制转二进制 2&#xff09;十进制转八进制 3&#xff09;十进制转十六进制 二&#xff1a;二进制、八进制、十六进制转…

数据库实验二:图书信息管理系统数据查询与数据更新

实验项目名称&#xff1a;图书信息管理系统数据查询与数据更新 实验目的与要求实验原理与内容1&#xff0e; 实验原理&#xff1a;2 . 实验内容&#xff1a;2. 数据查询 实验设备与软件环境实验过程与结果1. 数据更新图书信息表t_book新增馆藏可借图书c_book借书证表t_libraryC…

offsetof宏计算某变量相对于首地址的偏移量

宏&#xff1a;offsetof的使用 //offsetof (type,member) //type是结构体的类型名&#xff0c;member是结构体中的成员名。struct Student {char name[5]; // 姓名int age; // 年龄float score; // 成绩 };int main() {struct Student s;printf("%zd\n", off…

MyBatis Generator - 快速生成 实体类 和 映射文件

目录 一、MyBatis Generator 的使用 1.1、生成类和映射文件 1.1.1、在 pom.xml 中引入依赖 1.1.2、根据 configurationFile 标签中配置的路径 创建 generatorConfig.xml 文件 1.1.3、自动生成类 和 映射文件 1.1.4、在 Insert 标签中添加获取主键值的选项 1.1.5、扫描配置…