不了解jdbc,何談Mybatis的源碼解析?

2020-04-11 16:04:23來源:博客園 閱讀 ()

容器云強勢上線!快速搭建集群,上萬Linux鏡像隨意使用

不了解jdbc,何談Mybatis的源碼解析?

這篇文章主要用來展示jdbc的使用,是為了方便閱讀MyBatis源碼使用的,為源碼分析做一個提前熱身;

里面很多關鍵性的信息在MyBatis源碼里面都能找到,本篇不做MyBatis源碼的分析,

因為MyBatis源碼是一個龐大復雜的工程,不是 一時半會,只言片語就能說完的。

jdbc Demo: 

 1 public static void main(String[] args) throws Exception {
 2        test1();
 3     }
 4 
 5     public static void test1() throws Exception {
 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             //數據庫操作方式2
45             //int resCount= pst.executeUpdate();
46             //數據庫操作方式3
47             //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=new User();
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 package com.mysql.cj.jdbc;
 2 
 3 import java.sql.SQLException;
 4 
 5 public class Driver extends NonRegisteringDriver implements java.sql.Driver {
 6    
 7     static {
 8         try {
 9             java.sql.DriverManager.registerDriver(new Driver());
10         } catch (SQLException E) {
11             throw new RuntimeException("Can't register driver!");
12         }
13     }
14 
15     
16     public Driver() throws SQLException {
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()有值,否則無值。


 

  


原文鏈接:https://www.cnblogs.com/guoyansi19900907/p/12678438.html
如有疑問請與原作者聯系

標簽:PSmysql驅動all參數update

版權申明:本站文章部分自網絡,如有侵權,請聯系:west999com@outlook.com
特別注意:本站所有轉載文章言論不代表本站觀點,本站所提供的攝影照片,插畫,設計作品,如需使用,請與原作者聯系,版權歸原作者所有

上一篇:JAVA編程不得不看的一本經典書籍:《Java web項目開發案例精髓》

下一篇:MyBatis+Oracle時出現的錯誤: Method oracle/jdbc/driver/Oracl

韩国三级在线看免费