主頁 > 後端開發 > myBatis 入門學習

myBatis 入門學習

2020-10-10 22:10:49 後端開發

myBatis 入門學習

0. 相關概念

0.1 框架和工具類

  • 工具類

    • 對程式中一小段代碼的封裝,專案中大多數代碼還是需要我們寫,

  • 框架

    • 通俗理解框架

    • 可以看做一個半成品的軟體/專案,使用框架開發專案,專案中半數以上代碼就不需要 我們撰寫了,

    • 我們一般需要配置(大多數框架都是重配置輕編碼的)+少量編碼,就可完成專案中的需求,

    • 框架的目的 就是為了簡化編碼eg:Mybatis 我們在學習完Mybatis之后,dao層會更簡單,你只需要寫一個dao介面,然后寫一個SQL陳述句,dao層就已經寫完了,

  • 學習步驟

    • 這個框架能干什么?

    • 導包+配置

    • 框架少量的API,少量編碼

0.2 ORM

  • Object Relational Mapping 物件關系映射的思想

  • 物件 - Java中的物件 關系-關系型資料庫中表的記錄 映射 - 一對一關聯起來

  • java專案中的每一個物體類,對應資料庫中的一個 java類中的屬性,對應資料庫表中的欄位 java類中的一個物體物件,對應一個資料表中的一條記錄

  • 全自動ORM框架:hibernate

    通過操作物體物件,就可以完成對資料庫表中記錄的操作,復雜業務性能低下,不可定制,學習成本高,

  • 半自動的ORM框架:Mybatis,ibatis

    基于ORM,但是SQL陳述句需要我們自己撰寫,自己優化SQL,可定制性強,效率高,

 

0.3 Mybatis&原生JDBC

  • 原生jdbc

    • 注冊驅動,設定連接引數

    • 獲取連接

    • 獲取執行物件

    • 設定SQL引數并執行SQL陳述句

    • 封裝結果集并封裝成物體物件

    • 釋放資源

    相同的內容已經抽取到工具類中(上述洗掉線標識的步驟)

    模板化(步驟不變,部分步驟相同,上述加粗的內容)的操作,也是可以抽取封裝的,

    但是相同的步驟中又有不同的地方,不同的地方如果也要實作解耦,需要通過配置來實作

  • Mybatis解決方案

    • 連接復用:使用資料庫連接池初始化并管理連接

    • 解耦:將SQL陳述句和設定到SQL中的引數抽取到xml組態檔中

    • 自動封裝:通過反射內省等技術,實作查詢結果集欄位物體屬性自動映射并賦值

  • Mybatis框架抽取后的樣子

 

 

 

 

 

 

  • Mybatis簡介

    • 是一個資料持久層(DAO)框架,封裝共性內容讓使用者只關注SQL本身,結合了ORM思想,是一個ORM半自動的框架,

    • 使用Mybatis之后,我們只需要定義一個Dao層介面+存盤SQL的組態檔(Mybatis映射組態檔),就可以完成Dao層內容,

 

1. Mybatis快速入門

1.1 Mybatis快速入門步驟

  • 匯入Jar包

    • mybatis-3.5.3.jar

    • mysql-connector-java-5.1.37-bin.jar

    • log4j-1.2.17.jar

  • 撰寫Mybatis核心組態檔:mybatis-config.xml

    • 連接資料庫四要素

    • <mapper>標簽中映射檔案路徑不是. 是/ 建議復制,不要手敲

  • 撰寫映射檔案:StudentDao.xml

  • 撰寫POJO類和Dao層介面,初始化資料庫表及資料

  • SQL

  • 物體類

  • 介面

  • 測驗

  • 小經驗

    • 直接生成mybatis的兩類xml檔案

       

    • Mybatis映射組態檔和介面之間相互跳轉

核心組態檔

 
 1 <?xml version="1.0" encoding="UTF-8" ?>
 2  <!DOCTYPE configuration
 3          PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 4          "http://mybatis.org/dtd/mybatis-3-config.dtd">
 5  <configuration>
 6      <environments default="development">
 7          <environment id="development">
 8              <transactionManager type="JDBC"/>
 9              <dataSource type="POOLED">
10                  <!-- 連接資料庫四要素 -->
11                  <property name="driver" value="https://www.cnblogs.com/sonyan/p/com.mysql.jdbc.Driver"/>
12                  <property name="url" value="https://www.cnblogs.com/sonyan/p/jdbc:mysql:///web17_mybatis01"/>
13                  <property name="username" value="https://www.cnblogs.com/sonyan/p/root"/>
14                  <property name="password" value="https://www.cnblogs.com/sonyan/p/root"/>
15              </dataSource>
16          </environment>
17      </environments>
18  ?
19  ?
20      <!-- 加載映射組態檔 -->
21      <mappers>
22          <mapper resource="com/itheima/dao/StudentDao.xml"/>
23      </mappers>
24  </configuration>

 

 

映射組態檔

 
 1 <?xml version="1.0" encoding="UTF-8" ?>
 2  <!--
 3      xml檔案第一行是檔案宣告,必須在首行
 4      接下來是:命名空間,作用如下:
 5          1. 引入dtd檔案
 6          2. 對檔案中標簽及其屬性進行約束
 7   -->
 8  <!DOCTYPE mapper
 9          PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
10          "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
11  ?
12  <!-- 把當前這個xml組態檔當做對應介面的實作類
13          通過namespace屬性指向要被實作的介面,介面代理的方式必須這樣寫
14  ?
15   -->
16  <mapper namespace="com.itheima.dao.StudentDao">
17      <!--
18          標簽名:select  表示查詢
19              id屬性   id唯一標識,要配置被實作的介面中的方法
20              resultType屬性    方法的結果(集合中泛型)的型別,全限定類名,不能省略
21              parameterType屬性,方法發引數的型別,全限定類名,可以省略
22              標簽體中書寫SQL陳述句
23          整個標簽被稱之為:statement
24  ?
25       -->
26          <select id="findById" resultType="com.itheima.domain.Student">
27              select * from student where  id = 1;
28          </select>
29  </mapper>

 

介面StudentDao.java

 
1 public interface StudentDao {
2      Student findById();
3  }

 

 

測驗類MybatisTest.java

View Code

 

 

 

2. API

2.1 Resources

讀取配置的檔案的工具類

InputStream getResourceAsStream("組態檔相對于類路徑的相對路徑");

2.2 SqlSessionFactoryBuilder

 

獲取SqlSessionFactory工廠物件的功能類,

 // 通過構建的方式構建了一個SqlSessionFactory
         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
 ?
 //xxxBuilder.build()

2.3 SqlSessionFactory

org.apache.ibatis.session.SqlSessionFactory:獲取 SqlSessi 物件的工廠介面,

SqlSession openSession() 獲取SqlSession物件,并開啟手動提交事務

SqlSession openSession(boolean autoCommit) 獲取SqlSession物件,true表示自動提交

 

2.4SqlSession

org.apache.ibatis.session.SqlSession:sql會話物件介面,用于執行SQL管理事務介面代理

   
void commit() 提交事務
void rollback() 回滾事務
T getMapper(Class cls) 獲取指定介面的代理實作類物件
void close() 釋放資源

3. 映射組態檔

編碼完成如下需求:



1 // 需求1:查詢id為1的學生(強制要求)
2 // 需求2:創建一個Student物件并保存到資料庫(引數和成員變數名保持一致)(成功了嗎?)
3 // 需求3:根據學生姓名和年齡查詢用戶,傳兩個引數(多個引數怎么辦?)
4 // 需求4:完成需求3,傳一個引數,

 

映射組態檔StudentDao.xml保證這個檔案的名字和介面名完全一致,且在同一個包下,

View Code

 

 

核心組態檔

1  <!-- 加載映射組態檔  這里使用的是/ -->
2  <mappers>
3      <mapper resource="com/itheima/dao/StudentDao.xml"/>
4  </mappers>

 

 

Dao層介面StudentDao

 1 public interface StudentDao {
 2     @Select("select * from student where  id = 1")
 3     Student findById();
 4 
 5     // 需求1:查詢id為1的學生(強制要求)
 6     Student findById2(@Param("id") Integer id);
 7 
 8     // 需求2:創建一個Student物件并保存到資料庫
 9     void save(Student stu);
10 
11     // 需求3:根據學生姓名和年齡查詢用戶,傳兩個引數(多個引數怎么辦?)
12     List<Student> findByNameAndAge(@Param("name") String name, @Param("agex") Integer age);
13 
14     // 需求4:完成需求3,傳一個引數,
15     // 4.1 把兩個引數封裝成一個物體物件
16     // 如果把多個引數封裝到一個物體物件中,引數型別有局限性,不能是兩個一樣的條件做范圍查詢
17     List<Student> findByStudent(Student stu);
18 
19     // 4.2 把兩個引數封裝到Map集合中
20     List<Student> findByMap(Map<String,Object> map);
21 }

 

 

測驗類

 1 /**
 2  * @Author sonyan
 3  * @Date 2020/8/7 11:19
 4  * @Description: 測驗類
 5  */
 6 public class MybatisDemo {
 7     public static void main(String[] args) throws Exception {
 8 
 9         // 指定核心組態檔
10         String resource = "mybatis-config.xml";
11         // 把核心組態檔加載成流  Resources為我們提供的方便讀取組態檔的工具類
12         InputStream inputStream = Resources.getResourceAsStream(resource);
13 
14         // 通過構建的方式構建了一個SqlSessionFactory
15         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
16 
17         // SqlSession 就相當于我們之前的 Connection
18         // JDK7新特性  try-with-resource
19         // 需要釋放資源的動作,自動釋放在try()中開啟的一些流、會話......
20         try (SqlSession session = sqlSessionFactory.openSession(true)) {
21 
22             // getMapper  getDao   獲取一個指定介面的實作類物件
23             // 底層是動態代理
24             // 動態代理可以增強有介面的類、介面(增強介面,就是現實介面)
25             // 就相當于我們自己new StudentDaoImpl();
26             // 這個StudentDaoImpl是Mybatis通過動態代理幫我們自動生成并且賦值給了studentDao
27             StudentDao studentDao = session.getMapper(StudentDao.class);
28 
29             /*List<Student> students = studentDao.findAll();
30             System.out.println("students = " + students);*/
31 
32 
33             // 測驗根據id查詢
34             /*Student student = studentDao.findById(1);
35             System.out.println("student = " + student);*/
36 
37             // 測驗添加學生
38             //studentDao.saveStudent(new Student(null,"鳳姐",20));
39 
40             // 根據名稱和年齡查詢用戶,引數是兩個基本型別
41             //List<Student> students = studentDao.findByNameAndAge("美女", 20);
42             //System.out.println("students = " + students);
43 
44             // 根據名稱和年齡查詢用戶,引數是一個student物件
45             //List<Student> students = studentDao.findByUser(new Student(null, "鳳姐", 20));
46             //System.out.println("students = " + students);
47 
48             // 根據名稱和年齡查詢用戶,引數是一個map集合
49 
50             HashMap<String, Object> map = new HashMap<>();
51             map.put("name", "王二蛋");
52             map.put("age", 20);
53 
54             System.out.println("studentDao.findByMap(map) = " + studentDao.findByMap(map));
55 
56 
57             // 手動提交
58             //session.commit();
59 
60             // session.close();
61         }
62 
63     }
64 }

 

 

4. 核心組態檔

4.1 properties(重要)

引入外部的properties檔案,一般用作引入資料庫鏈接引數的配置,

核心組態檔

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE configuration
 3         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 4         "http://mybatis.org/dtd/mybatis-3-config.dtd">
 5 <!-- 這是一個mybatis的核心組態檔,名字任意-->
 6 <configuration>
 7     <!-- -->
 8     <properties resource="jdbc.properties"/>
 9 
10     <environments default="development">
11         <environment id="development">
12             <transactionManager type="JDBC"/>
13             <dataSource type="POOLED">
14                 <property name="driver" value="https://www.cnblogs.com/sonyan/p/${jdbc.driver}"/>
15                 <property name="url" value="https://www.cnblogs.com/sonyan/p/${jdbc.url}"/>
16                 <property name="username" value="https://www.cnblogs.com/sonyan/p/${jdbc.username}"/>
17                 <property name="password" value="https://www.cnblogs.com/sonyan/p/${jdbc.password}"/>
18             </dataSource>
19         </environment>
20     </environments>
21 
22     <!-- 加載映射組態檔 -->
23     <mappers>
24         <mapper resource="com/itheima/dao/StudentDao.xml"/>
25     </mappers>
26 </configuration>

 

jdbc.properties

1 jdbc.driver=com.mysql.jdbc.Driver
2 jdbc.url=jdbc:mysql://192.168.115.130:3306/db1
3 jdbc.username=root
4 jdbc.password=root

 

 

4.2 Settings(重要)

 1 <!-- 極為重要的設定 -->
 2 <settings>
 3     <!--
 4         指定 MyBatis 所用日志的具體實作,未指定時將自動查找,
 5         LOG4J  要求:1. 匯入log4j的jar包  2. 有一個log4j.properties檔案
 6         建議顯式的配置上,可配可不配的,建議配上,
 7      -->
 8     <setting name="logImpl" value="https://www.cnblogs.com/sonyan/p/LOG4J"/>
 9 
10 
11     <!--
12         mapUnderscoreToCamelCase
13         是否開啟駝峰命名自動映射,即從經典資料庫列名 A_COLUMN 映射到經典 Java 屬性名 aColumn,
14 
15         Java中多個單詞的屬性名  使用駝峰命名   lastName
16         MySQL不缺分大小寫      底杠命名       last_name
17 
18 
19         Mybatis可以幫我們自動完成結果集和物體的自動轉換封裝,原因是結果集的欄位名和物體屬性名一致,
20 
21     -->
22     <!--<setting name="mapUnderscoreToCamelCase" value="https://www.cnblogs.com/sonyan/p/true"/>-->
23 </settings>

 

 

4.3 TypeAliases(了解)

 1 <!-- 起別名 -->
 2 <typeAliases>
 3     <!--
 4         type 全限定類名
 5         alias 別名
 6         別名不區分大小寫
 7      -->
 8     <!--<typeAlias type="com.itheima.domain.Student" alias="student"/>-->
 9 
10     <!-- 為包下所有的物體類起別名,不區分大小寫 -->
11     <!--<package name="com.itheima.domain"/>-->
12 
13 </typeAliases>

 

起別名后,在映射組態檔中可以直接使用別名

1 <select id="findByMap" resultType="Student">
2        select * from student where first_username=#{name}
3        and
4        age=#{age}
5 </select>
6  

 

系統為常見的型別起好了別名

4.4 Environments(了解)

 1 <environments default="dev">
 2     <environment id="dev">
 3         <transactionManager type="JDBC"/>
 4         <dataSource type="POOLED">
 5             <!-- 連接資料庫四要素 -->
 6             <property name="driver" value="https://www.cnblogs.com/sonyan/p/${jdbc.driver}"/>
 7             <property name="url" value="https://www.cnblogs.com/sonyan/p/${jdbc.url}"/>
 8             <property name="username" value="https://www.cnblogs.com/sonyan/p/${jdbc.username}"/>
 9             <property name="password" value="https://www.cnblogs.com/sonyan/p/${jdbc.password}"/>
10         </dataSource>
11     </environment>
12     <environment id="test">
13         <transactionManager type="JDBC"/>
14         <dataSource type="POOLED">
15             <!-- 連接資料庫四要素 -->
16             <property name="driver" value="https://www.cnblogs.com/sonyan/p/${jdbc.driver}"/>
17             <property name="url" value="https://www.cnblogs.com/sonyan/p/${jdbc.url}"/>
18             <property name="username" value="https://www.cnblogs.com/sonyan/p/${jdbc.username}"/>
19             <property name="password" value="https://www.cnblogs.com/sonyan/p/${jdbc.password}"/>
20         </dataSource>
21     </environment>
22 </environments>

 

 

4.5 Mappers(重點)

 1 <!-- 加載映射組態檔 -->
 2 <mappers>
 3     <!--
 4         使用相對于類路徑的資源參考 可以用
 5         每個標簽引入一個Mapper的XML檔案
 6      -->
 7     <!--<mapper resource="com/itheima/dao/StudentDao.xml"/>-->
 8     <!--<mapper resource="com/itheima/dao/CourseDao.xml"/>-->
 9     <!--<mapper resource="com/itheima/dao/OrderDao.xml"/>-->
10 
11     <!--
12         使用完全限定資源定位符(URL) 不推薦使用
13         http://   file://
14      -->
15     <!--<mapper url="file:///var/mappers/AuthorMapper.xml"/>-->
16 
17     <!--
18         加載指定某個的介面,識別介面中的注解 可以用
19      -->
20     <!--<mapper />-->
21     <!--<mapper />-->
22     <!--<mapper />-->
23 
24     <!--
25         把包下所有的映射組態檔和介面全部加載進來  最推薦使用
26      -->
27     <package name="com.itheima.dao"/>
28 </mappers>
29  

 

 

 

 

 

5. 經驗分享

5.1 生成Mybatis組態檔

本質是新建了一個檔案模板,按照下面的方式新建兩個模板即可(Mybatis-configMybatis-Mapper

 

 

 

 

5.2 介面映射組態檔跳轉

使用一個插件free-idea-mybatis

這個插件是個zip包,不要解壓,直接安裝即可,

已知bug:

多個模塊之間有相同內容會提示/跳轉錯誤,卸載其他模塊即可,

 

5.3 ${}和#{}區別(面試題)

##{} MyBatis 會創建 PreparedStatement 引數占位符,并通過占位符安全地設定引數(就像使用 ? 一樣), 這樣做更安全,更迅速,通常也是首選做法

${} 會做字串的拼接,將{}中直接拼直接在 SQL 陳述句中,可能會有SQL注入的風險,效率更低,但是,如果你需要在SQL陳述句中直接插入一個不轉義的字串,可以使用這種方式,一般情況下會把表名或者欄位名通過這方方式傳遞到SQL陳述句中,比方說 ORDER BY后面的列名,

 

5.4 MybatisUtils工具類抽取

 1 public class MybatisUtills {
 2 
 3     // 獲取工廠物件SQLSessionFactory,這個物件一個就可
 4     private static SqlSessionFactory ssf = null;
 5 
 6     // 靜態代碼塊中初始化該物件
 7     static {
 8         InputStream is = null;
 9         try {
10             is = Resources.getResourceAsStream("MyBatisConfig.xml");
11         } catch (IOException e) {
12             e.printStackTrace();
13         }
14         ssf = new SqlSessionFactoryBuilder().build(is);
15     }
16 
17     public static SqlSessionFactory getFactory() {
18         return ssf;
19     }
20 
21 
22     // 獲取SQLSession物件,這個連接物件可以有多個
23     public static SqlSession getSqlSession() {
24         return ssf.openSession(true);
25     }
26 
27 
28     // 獲取Mapper物件
29     public static <T> T getMapper(Class<T> tClass) {
30         return ssf.openSession(true).getMapper(tClass);
31     }
32 
33 }

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/166756.html

標籤:Java

上一篇:mybatis_8使用注解開發

下一篇:JAVA學習線路:day11-IO流[1]

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more