这篇文章主要用来展示jdbc的使用,是为了方便阅读MyBatis源码使用的,为源码分析做一个提前热身;

里面很多关键性的信息在MyBatis源码里面都能找到,本篇不做MyBatis源码的分析,

因为MyBatis源码是一个庞大复杂的工程,不是 一时半会,只言片语就能说完的。

jdbc Demo:

1 public static void main(String[] args) throwsException {2 test1();3 }4

5 public static void test1() throwsException {6 ResultSet rs=null;7 PreparedStatement pst=null;8 Connection conn=null;9 try{10 String sql="select id as sid,name,age,sex from user where id!=? order by id asc ";11 //注册驱动方式1 用反射加载数据库驱动12 //Class.forName("com.mysql.cj.jdbc.Driver");13 //注册驱动方式2 也可以用new MySql的Driver类方式注册驱动14 //new Driver();15 //注册驱动方式3 用反射方式new 一个匿名对象

16 Driver.class.getConstructor().newInstance();17 conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/gys?serverTimezone=UTC","root","gys");18 System.out.println("======查询前========");19 DatabaseMetaData dmd=conn.getMetaData();20 System.out.println("数据库名称:"+dmd.getDatabaseProductName());21 System.out.println("数据库版本:"+dmd.getDatabaseProductVersion());22 System.out.println("是否支持事务:"+dmd.supportsTransactions());23 //DriverManager.setLogWriter();

24 pst=conn.prepareStatement(sql);25 //给sql语句的?赋值

26 pst.setString(1,"5");27

28 System.out.println("======查询时========");29 ParameterMetaData pmd=pst.getParameterMetaData();30 System.out.println("参数数量" +pmd.getParameterCount());31 //1表示入参,2表示出入参,3表示出参(主要用于存储过程)

32 System.out.println("第一个参数mode:"+pmd.getParameterMode(1));33

34 //数据库操作方式1

35 boolean res=pst.execute();36 rs=null;37 if(res){38 rs=pst.getResultSet();39 }else{40 System.out.println("返回影响的行数:"+pst.getUpdateCount());41 return;42 }43

44 //数据库操作方式245 //int resCount= pst.executeUpdate();46 //数据库操作方式347 //rs= pst.executeQuery();

48

49 System.out.println("======查询后========");50 ResultSetMetaData rsm=rs.getMetaData();51 System.out.println("列数量:"+rsm.getColumnCount());52 System.out.println("第1列别名:"+rsm.getColumnLabel(1));53 System.out.println("第1列字段名:"+rsm.getColumnName(1));54

55 User user=null;56 while(rs.next()){57 user=newUser();58 user.setId(rs.getLong("sid"));59 user.setName(rs.getString("name"));60 user.setAge(rs.getInt("age"));61 }62 System.out.println("查询数据:"+user.toString());63 }catch(Exception e){64 e.printStackTrace();65 }finally{66 //6.释放资源

67 if(rs!=null){68 rs.close();69 }70 if(pst!=null){71 pst.close();72 }73 if(conn!=null){74 conn.close();75 }76 }77

78 }

执行结果:

demo解析:

驱动的注册(第12,14,16行):

不要被这个高大上的名词迷惑了,其实就是将MySql包中Driver这个类载入虚拟机,然后执行相应的动作。

那么执行的是什么动作呢?

MySql Driver.java看源码:

1 packagecom.mysql.cj.jdbc;2

3 importjava.sql.SQLException;4

5 public class Driver extends NonRegisteringDriver implementsjava.sql.Driver {6

7 static{8 try{9 java.sql.DriverManager.registerDriver(newDriver());10 } catch(SQLException E) {11 throw new RuntimeException("Can't register driver!");12 }13 }14

15

16 public Driver() throwsSQLException {17 //Required for Class.forName().newInstance()

18 }19 }

static块在类载入的时候就会执行,执行的是jdk中DriverManager.registerDriver()注册服务的方法。

Driver也继承了 java.sql.Driver.这也应验的网上到处都说的:jdbc提供接口,数据库厂商提供实现的说法。

从上面的驱动源码分析第12,14,16行三种方式,哪一种注册写法更好呢?

第12行直接通过反射把驱动类载入虚拟机,但是并没有创建任何的对象;

第14行通过new 一个匿名对象来载入驱动类,同时在堆内存中还需要开辟一个内存空间;

第16行也是创建了一个匿名对象,只不过是通过反射的方式,比new 稍微慢那么一丢丢,同样需要虚拟机在堆中开辟内存空间;

因为我们并不需要这个匿名对象,一段时间过后就会被虚拟机给回收掉。

通过分析还是第12行的写法最完美,其实无论用哪种方式注册服务,对于性能和时间上来说都是微乎其微的。

数据库的三种操作方式:

int executeUpdate():执行写sql的操作,比如insert,update,delete;返回受影响的行数。对于创建数据库,删表的操作返回0

ResultSet executeQuery():执行select查询操作的方法。返回查询结果集

boolean execute();包含上面两种操作。查询后返回true,表示pst.getResultSet()有值,否则无值。

==================追加内容=============

jdbc4.0之后的驱动是不需要写的;在JDBC的DriverManager.getConnection()时是第一次使用,有一个静态代码块

这里的101行代码用的是SPI机制,将驱动进行实例化了。

java的jdbc看不到源码_不了解jdbc,何谈Mybatis的源码解析?相关推荐

  1. android 快传 源码_最新安卓仿茄子快传APP源码包括服务端源码Android开发快传类项目源码全套...

    适使用范围:  安卓APP茄子快传源码 Android项目源码相似茄子快传的快传项目包括服务端 运行环境:  Android app 源码详细: 本项目是一个基于安卓的相似茄子快传的项目源码,包括安卓 ...

  2. java web开发实战经典 源码_李兴华 java_web开发实战经典 源码 完整版收集共享

    李兴华 java_web开发实战经典 源码 完整版收集共享 01f8a7  在  2018-11-07 20:41:33  上传  10.92 MB 第1章 JAVA WEB开发简介 1.1.WEB发 ...

  3. 华为鸿蒙系统源码_鸿蒙系统 IO 栈分析 | 解读鸿蒙源码

    华为的鸿蒙系统开源之后第一个想看的模块就是 FS 模块,想了解一下它的 IO 路径与 linux 的区别.现在鸿蒙开源的仓库中有两个内核系统,一个是 liteos_a 系统,一个是 liteos_m ...

  4. android项目实战博学谷源码_阿里爆款SpringBoot项目实战PDF+源码+视频分享

    前言 关于SpringBoot网络上有太多的博客跟资料,其影响力想必不用我多说了.它作为当前最流行的微服务框架,不但使用更加简单,而且功能更加丰富.性能更加稳定和健壮.其"约定大于配置&qu ...

  5. 1号店案例html源码_手把手教一起写jQuery版mini源码,分析jQuery的优势

    适合人群 本文适合0.5~3年的前端开发人员,以及想了解jQuery是什么的小伙伴们. 前言 谈谈个人对jQuery的看法. 如果你是一个五年以上的开发人员,相信你一定认识了解jQuery.这好比你十 ...

  6. 合成分红游戏源码_旅行世界遛狗养狗恐龙源码,分红龙源码、红包龙、合成龙...

    我们团队已经对系统进行深度开发和优化,修复漏洞和负载能力. 超级经典系统,可以二次开发 本产品有演示,联系店主. 伴随着智能手机的普及,越来越多的互联网企业.电商平台将APP作为销售的主战场之一.越多 ...

  7. 七彩cms云转码_七彩CMS开源程序 2019最新云转码全开源程序源码[带完整安装搭建教程]...

    源码介绍 操作系统:centos7.2 x64 网站环境:Nginx 1.17.2+PhP7.2+Mariadb 硬件参数:硬件信息:4核心处理,8GB ECC内存,1Gbps共享宽带 没错,还是熟悉 ...

  8. thinkphp三级分销小程序源码_山东谷道微信小程序商城源码带后台 公众号平台三级分销系统...

    山东谷道微信小程序商城源码带后台 公众号平台三级分销系统 那么微信二级分销系统与微信三级分销系统到底有什么区别和联系呢?为什么改了个数字地位就天差地别? 1.微信分销模式等级的区别 用简洁的话来说,微 ...

  9. cf飞刀制作源码_(飞刀)KDJ+W%R发出分析家源码

    下面有两个重点内容要讲:KDj的用法说明实战与探讨:KDJ 与W%R运用判断主升浪和主跌浪!!实战总结---对KDJ指标在股票操作中的应用探讨KDJ指标又称超买超卖指标,它反映的是多空双方买卖力量的对 ...

最新文章

  1. appium+python搭建自动化测试框架_TestAPP框架(三)
  2. 算法----有效的括号
  3. AlertDialog的使用(一)
  4. Envoy为什么能战胜Ngnix——线程模型分析篇
  5. Ubuntu常用APT命令参数
  6. (转)elasticsearch6.0版本安装head插件
  7. 字符输出流的基本使用_写出单个字符到文件
  8. javascript 手机手势动作touch触屏原理分析
  9. php自动释放mysql连接,php怎么关闭mysql连接
  10. Unity+SenseAR教程:用手势发射爱心【源码】
  11. 使用STAR方法完善简历
  12. 【转载】在.NET环境中实现每日构建--NAnt篇
  13. linux参考文献_小白爱折腾·其二:手机Linux部署DiscuzX论坛
  14. 微信小程序-基于云开发 CMS + Vant Weapp 电商 Demo 来了!
  15. JAVA基础知识点总结
  16. 笔记本如何正确安装对应显卡驱动
  17. win10双显卡怎么切换amd和英特尔_手把手给你细说win10系统双显卡设置只使用独立显卡的流程...
  18. ghostscript9.26交叉编译
  19. 中小学计算机网络培训心得体会,计算机网络培训心得体会
  20. python连接sap接口_基于Python的SAP流程自动化

热门文章

  1. python 异常 模块 包
  2. 使用RMAN对数据文件进行恢复
  3. Java 基础系列之volatile变量(一)
  4. Codeforces Round #452 (Div. 2)
  5. socket.io插件调用的demo
  6. 学习笔记(01):Oracle数据库-Oracle安装与配置
  7. 接口类的多继承以及抽象类的单继承
  8. JDK+Tomcat+MySql环境配置—linux
  9. PYTHON: PYENV, PYVENV, VIRTUALENV – WHAT’S THE DIFFERENCE?
  10. 20151209小问题