本系列文章將整理到我在GitHub上的《Java面試指南》倉庫,更多精彩內(nèi)容請(qǐng)到我的倉庫里查看
喜歡的話麻煩點(diǎn)下Star哈
文章首發(fā)于我的個(gè)人博客:
本文是微信公眾號(hào)【Java技術(shù)江湖】的《走進(jìn)JavaWeb技術(shù)世界》其中一篇,本文部分內(nèi)容來源于網(wǎng)絡(luò),為了把本文主題講得清晰透徹,也整合了很多我認(rèn)為不錯(cuò)的技術(shù)博客內(nèi)容,引用其中了一些比較好的博客文章,如有侵權(quán),請(qǐng)聯(lián)系作者。
該系列博文會(huì)告訴你如何從入門到進(jìn)階,從servlet到框架,從ssm再到SpringBoot,一步步地學(xué)習(xí)JavaWeb基礎(chǔ)知識(shí),并上手進(jìn)行實(shí)戰(zhàn),接著了解JavaWeb項(xiàng)目中經(jīng)常要使用的技術(shù)和組件,包括日志組件、Maven、Junit,等等內(nèi)容,以便讓你更完整地了解整個(gè)Java Web技術(shù)體系,形成自己的知識(shí)框架。為了更好地總結(jié)和檢驗(yàn)?zāi)愕膶W(xué)習(xí)成果,本系列文章也會(huì)提供每個(gè)知識(shí)點(diǎn)對(duì)應(yīng)的面試題以及參考答案。
如果對(duì)本系列文章有什么建議,或者是有什么疑問的話,也可以關(guān)注公眾號(hào)【Java技術(shù)江湖】聯(lián)系作者,歡迎你參與本系列博文的創(chuàng)作和修訂。
前言
學(xué)習(xí)一個(gè)新東西前,如果能對(duì)他有一個(gè)比較直觀的印象與定位,那么接下來的學(xué)習(xí)過程就會(huì)順暢很多。所以本文主要是我對(duì)Mybatis的一個(gè)簡(jiǎn)單入門性的總結(jié)介紹(前提還是需要些必要的概念認(rèn)知)。
PS:文末有參考列表
Mybatis是什么
Mybatis是一個(gè)持久層框架,用于數(shù)據(jù)的持久化。主要表現(xiàn)為將SQL與POJO進(jìn)行一個(gè)映射,將SQL從代碼中解耦?;靖拍钊鐖D:

使用時(shí),以User為例,UserMapper定義了findById接口,該接口返回一個(gè)User對(duì)象,接口的實(shí)現(xiàn)為一個(gè)xml配置文件。該xml文件中定義對(duì)應(yīng)接口中的實(shí)現(xiàn)所需要的SQL。從而達(dá)到將SQL與代碼解耦的目標(biāo)。
<?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="com.mybatis.UserMapper">
<select id="findById" parameterType="int" resultType="User">
select user_id id,user_name userName,user_age age from t_user where user_id=#{id}
</select>
</mapper>
MyBatis 是Apache的一個(gè)Java開源項(xiàng)目,是一款優(yōu)秀的持久層框架,它支持定制化 SQL、存儲(chǔ)過程以及高級(jí)映射。Mybatis可以將Sql語句配置在XML文件中,避免將Sql語句硬編碼在Java類中。
特點(diǎn)
1.Mybatis通過參數(shù)映射方式,可以將參數(shù)靈活的配置在SQL語句中的配置文件中,避免在Java類中配置參數(shù)(JDBC)
2.Mybatis通過輸出映射機(jī)制,將結(jié)果集的檢索自動(dòng)映射成相應(yīng)的Java對(duì)象,避免對(duì)結(jié)果集手工檢索(JDBC)
3.Mybatis可以通過Xml配置文件對(duì)數(shù)據(jù)庫連接進(jìn)行管理
核心類介紹
1.SqlSessionaFactoryBuilder :該類主要用于創(chuàng)建 SqlSessionFactory, 這個(gè)類可以被實(shí)例化、使用和丟棄,一旦創(chuàng)建了 SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 實(shí)例的最佳作用域是方法作用域(也就是局部方法變量)。
2.SqlSessionFactory :該類的作用了創(chuàng)建 SqlSession, 從名字上我們也能看出, 該類使用了工廠模式, 每次應(yīng)用程序訪問數(shù)據(jù)庫, 我們就要通過 SqlSessionFactory 創(chuàng)建 SqlSession, 所以 SqlSessionFactory 和整個(gè) Mybatis 的生命周期是相同的. 這也告訴我們不能創(chuàng)建多個(gè)同一個(gè)數(shù)據(jù)的 SqlSessionFactory, 如果創(chuàng)建多個(gè), 會(huì)消耗盡數(shù)據(jù)庫的連接資源, 導(dǎo)致服務(wù)器夯機(jī). 應(yīng)當(dāng)使用單例模式. 避免過多的連接被消耗, 也方便管理。
3.SqlSession :SqlSession 相當(dāng)于一個(gè)會(huì)話, 每次訪問數(shù)據(jù)庫都需要這樣一個(gè)會(huì)話, 大家可能會(huì)想起了 JDBC 中的 Connection, 很類似, 但還是有區(qū)別的, 何況現(xiàn)在幾乎所有的連接都是使用的連接池技術(shù), 用完后直接歸還而不會(huì)像 Session 一樣銷毀. 注意: 他是一個(gè)線程不安全的對(duì)象, 在設(shè)計(jì)多線程的時(shí)候我們需要特別的當(dāng)心, 操作數(shù)據(jù)庫需要注意其隔離級(jí)別, 數(shù)據(jù)庫鎖等高級(jí)特性, 此外, 每次創(chuàng)建的 SqlSession 都必須及時(shí)關(guān)閉它, 它長(zhǎng)期存在就會(huì)使數(shù)據(jù)庫連接池的活動(dòng)資源減少, 對(duì)系統(tǒng)性能的影響很大, 我們一般在 finally 塊中將其關(guān)閉. 還有, SqlSession 存活于一個(gè)應(yīng)用的請(qǐng)求和操作, 可以執(zhí)行多條 Sql, 保證事務(wù)的一致性。SqlSession在執(zhí)行過程中,有包含了幾大對(duì)象:
3.1.Executor :執(zhí)行器,由它調(diào)度 StatementHandler、ParameterHandler、ResultSetHandler 等來執(zhí)行對(duì)應(yīng)的 SQL。其中 StatementHandler 是最重要的。
3.2.StatementHandler :作用是使用數(shù)據(jù)庫的 Statement(PreparedStatement)執(zhí)行操作,它是四大對(duì)象的核心,起到承上啟下的作用,許多重要的插件都是通過攔截它來實(shí)現(xiàn)的。
3.3.ParamentHandler :用來處理 SQL 參數(shù)的。
3.4.ResultSetHandler :進(jìn)行數(shù)據(jù)集的封裝返回處理的。
4.Mapper :映射器是一些由你創(chuàng)建的、綁定你映射的語句的接口。映射器接口的實(shí)例是從 SqlSession 中獲得的, 他的作用是發(fā)送 SQL, 然后返回我們需要的結(jié)果. 或者執(zhí)行 SQL 從而更改數(shù)據(jù)庫的數(shù)據(jù), 因此它應(yīng)該在 SqlSession 的事務(wù)方法之內(nèi), 在 Spring 管理的 Bean 中, Mapper 是單例的。
功能架構(gòu):我們把Mybatis的功能架構(gòu)分為三層
(1)API接口層:提供給外部使用的接口API,開發(fā)人員通過這些本地API來操縱數(shù)據(jù)庫。接口層一接收到調(diào)用請(qǐng)求就會(huì)調(diào)用數(shù)據(jù)處理層來完成具體的數(shù)據(jù)處理。
(2)數(shù)據(jù)處理層:負(fù)責(zé)具體的SQL查找、SQL解析、SQL執(zhí)行和執(zhí)行結(jié)果映射處理等。它主要的目的是根據(jù)調(diào)用的請(qǐng)求完成一次數(shù)據(jù)庫操作。
(3)基礎(chǔ)支撐層:負(fù)責(zé)最基礎(chǔ)的功能支撐,包括連接管理、事務(wù)管理、配置加載和緩存處理,這些都是共用的東西,將他們抽取出來作為最基礎(chǔ)的組件。為上層的數(shù)據(jù)處理層提供最基礎(chǔ)的支撐。

框架結(jié)構(gòu):
(1)加載配置:配置來源于兩個(gè)地方,一處是配置文件,一處是Java代碼的注解,將SQL的配置信息加載成為一個(gè)個(gè)MappedStatement對(duì)象(包括了傳入?yún)?shù)映射配置、執(zhí)行的SQL語句、結(jié)果映射配置),存儲(chǔ)在內(nèi)存中。
(2)SQL解析:當(dāng)API接口層接收到調(diào)用請(qǐng)求時(shí),會(huì)接收到傳入SQL的ID和傳入對(duì)象(可以是Map、JavaBean或者基本數(shù)據(jù)類型),Mybatis會(huì)根據(jù)SQL的ID找到對(duì)應(yīng)的MappedStatement,然后根據(jù)傳入?yún)?shù)對(duì)象對(duì)MappedStatement進(jìn)行解析,解析后可以得到最終要執(zhí)行的SQL語句和參數(shù)。
(3)SQL執(zhí)行:將最終得到的SQL和參數(shù)拿到數(shù)據(jù)庫進(jìn)行執(zhí)行,得到操作數(shù)據(jù)庫的結(jié)果。
(4)結(jié)果映射:將操作數(shù)據(jù)庫的結(jié)果按照映射的配置進(jìn)行轉(zhuǎn)換,可以轉(zhuǎn)換成HashMap、JavaBean或者基本數(shù)據(jù)類型,并將最終結(jié)果返回。

執(zhí)行流程:
1.獲取SqlsessionFactory:根據(jù)配置文件(全局、sql映射)初始化configuration對(duì)象,
2.獲取sqlSession:創(chuàng)建一個(gè)DefaultSqlSession對(duì)象,包含Configuration及Executor(根據(jù)全局配置文件中defaultExecutorType創(chuàng)建對(duì)應(yīng)的Executor)
3.獲取接口代理對(duì)象MapperProxy:DefaultSqlSession.getMapper拿到Mapper接口對(duì)應(yīng)的MapperProxy
4.執(zhí)行增刪改查
1、調(diào)用DefaultSqlSession增刪改查
2、創(chuàng)建StatementHandler (同時(shí)創(chuàng)建ParameterHandler,ResultSetHandler)
3、調(diào)用StatementHandler預(yù)編譯參數(shù)以及設(shè)置參數(shù)值,使用ParameterHandler給sql設(shè)置參數(shù)
4、調(diào)用StatementHandler增刪改查
5、ResultSetHandler封裝結(jié)果

與Hibernate的異同
Mybatis開始逐漸流行起來,必然有其原因,簡(jiǎn)單了解了一下它與同為持久層框架的Hibernate的異同。
- 映射模式
從上面的簡(jiǎn)單概念可以知道Mybatis實(shí)際上著力點(diǎn)在POJO與SQL的映射。而Hibernate則主要是POJO與數(shù)據(jù)庫表的對(duì)象關(guān)系映射。前者掌控力度更細(xì),代碼量會(huì)相對(duì)多一點(diǎn),后者靈活性則差一點(diǎn),更為自動(dòng)化一些,與PHP里的Eloquent屬于同類型。 - 性能
Mybatis基于原生JDBC,相比于對(duì)JDBC進(jìn)行二次封裝的Hibernate性能會(huì)更好一點(diǎn)。 - 開發(fā)與維護(hù)
Hibernate配置好實(shí)體類后,使用起來是比較簡(jiǎn)潔,舒服的,但是前期學(xué)習(xí)曲線比較陡,后期調(diào)優(yōu)比較麻煩。Mybatis對(duì)SQL掌控的顆粒更細(xì)一點(diǎn),相比較而言看上去簡(jiǎn)陋些。由于直接映射SQL,遷移性是個(gè)問題。
參考文章
https://segmentfault.com/a/1190000009707894
https://www.cnblogs.com/hysum/p/7100874.html
http://c.biancheng.net/view/939.html
https://blog.csdn.net/android_hl/article/details/53228348
微信公眾號(hào)
個(gè)人公眾號(hào):黃小斜
黃小斜是跨考軟件工程的 985 碩士,自學(xué) Java 兩年,拿到了 BAT 等近十家大廠 offer,從技術(shù)小白成長(zhǎng)為阿里工程師。
作者專注于 JAVA 后端技術(shù)棧,熱衷于分享程序員干貨、學(xué)習(xí)經(jīng)驗(yàn)、求職心得和程序人生,目前黃小斜的CSDN博客有百萬+訪問量,知乎粉絲2W+,全網(wǎng)已有10W+讀者。
黃小斜是一個(gè)斜杠青年,堅(jiān)持學(xué)習(xí)和寫作,相信終身學(xué)習(xí)的力量,希望和更多的程序員交朋友,一起進(jìn)步和成長(zhǎng)!
原創(chuàng)電子書:
關(guān)注公眾號(hào)【黃小斜】后回復(fù)【原創(chuàng)電子書】即可領(lǐng)取我原創(chuàng)的電子書《菜鳥程序員修煉手冊(cè):從技術(shù)小白到阿里巴巴Java工程師》
程序員3T技術(shù)學(xué)習(xí)資源: 一些程序員學(xué)習(xí)技術(shù)的資源大禮包,關(guān)注公眾號(hào)后,后臺(tái)回復(fù)關(guān)鍵字 “資料” 即可免費(fèi)無套路獲取。
考研復(fù)習(xí)資料:
計(jì)算機(jī)考研大禮包,都是我自己考研復(fù)習(xí)時(shí)用的一些復(fù)習(xí)資料,包括公共課和專業(yè)的復(fù)習(xí)視頻,這里也推薦給大家,關(guān)注公眾號(hào)后,后臺(tái)回復(fù)關(guān)鍵字 “考研” 即可免費(fèi)獲取。

mybatis新手上路
MyBatis簡(jiǎn)介
Mybatis是Apache的一個(gè)Java開源項(xiàng)目,是一個(gè)支持動(dòng)態(tài)Sql語句的持久層框架。Mybatis可以將Sql語句配置在XML文件中,避免將Sql語句硬編碼在Java類中。與JDBC相比:
- Mybatis通過參數(shù)映射方式,可以將參數(shù)靈活的配置在SQL語句中的配置文件中,避免在Java類中配置參數(shù)(JDBC)
- Mybatis通過輸出映射機(jī)制,將結(jié)果集的檢索自動(dòng)映射成相應(yīng)的Java對(duì)象,避免對(duì)結(jié)果集手工檢索(JDBC)
- Mybatis可以通過Xml配置文件對(duì)數(shù)據(jù)庫連接進(jìn)行管理。
MyBatis整體架構(gòu)及運(yùn)行流程
Mybatis整體構(gòu)造由 數(shù)據(jù)源配置文件、Sql映射文件、會(huì)話工廠、會(huì)話、執(zhí)行器和底層封裝對(duì)象組成。
1.數(shù)據(jù)源配置文件
通過配置的方式將數(shù)據(jù)庫的配置信息從應(yīng)用程序中獨(dú)立出來,由獨(dú)立的模塊管理和配置。Mybatis的數(shù)據(jù)源配置文件包含數(shù)據(jù)庫驅(qū)動(dòng)、數(shù)據(jù)庫連接地址、用戶名密碼、事務(wù)管理等,還可以配置連接池的連接數(shù)、空閑時(shí)間等。
一個(gè)SqlMapConfig.xml基本的配置信息如下:
<pre><configuration>
<properties resource="db.properties"></properties>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="{jdbc.url}"></property>
<property name="username" value="{jdbc.password}" />
</dataSource>
</environment>
</environments>
</configuration></pre>
2.Sql映射文件
Mybatis中所有數(shù)據(jù)庫的操作都會(huì)基于該映射文件和配置的sql語句,在這個(gè)配置文件中可以配置任何類型的sql語句。框架會(huì)根據(jù)配置文件中的參數(shù)配置,完成對(duì)sql語句以及輸入輸出參數(shù)的映射配置。
Mapper.xml配置文件大致如下:
<pre><!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sl.dao.ProductDao">
<select id="selectProductById" resultType="com.sl.po.Product" parameterType="int">
select * from products where id = #{id} </select>
</mapper></pre>
3.會(huì)話工廠與會(huì)話
Mybatis中會(huì)話工廠SqlSessionFactory類可以通過加載資源文件,讀取數(shù)據(jù)源配置SqlMapConfig.xml信息,從而產(chǎn)生一種可以與數(shù)據(jù)庫交互的會(huì)話實(shí)例SqlSession,會(huì)話實(shí)例SqlSession根據(jù)Mapper.xml文件中配置的sql,對(duì)數(shù)據(jù)庫進(jìn)行操作。
4.運(yùn)行流程
會(huì)話工廠SqlSessionFactory通過加載資源文件獲取SqlMapConfig.xml配置文件信息,然后生成可以與數(shù)據(jù)庫交互的會(huì)話實(shí)例SqlSession。
會(huì)話實(shí)例可以根據(jù)Mapper配置文件中的Sql配置去執(zhí)行相應(yīng)的增刪改查操作。
在SqlSession會(huì)話實(shí)例內(nèi)部,通過執(zhí)行器Executor對(duì)數(shù)據(jù)庫進(jìn)行操作,Executor依靠封裝對(duì)象Mappered Statement,它分裝了從mapper.xml文件中讀取的信息(sql語句,參數(shù),結(jié)果集類型)。
Mybatis通過執(zhí)行器與Mappered Statement的結(jié)合實(shí)現(xiàn)與數(shù)據(jù)庫的交互。
執(zhí)行流程圖:

測(cè)試工程搭建
- 新建maven工程

2. 添加依賴pom.xml
<pre><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.sl</groupId>
<artifactId>mybatis-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<junit.version>4.12</junit.version>
<mybatis.version>3.4.1</mybatis.version>
<mysql.version>5.1.32</mysql.version>
<log4j.version>1.2.17</log4j.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>{mybatis.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>{log4j.version}</version>
</dependency>
</dependencies>
</project></pre>
3.編寫數(shù)據(jù)源配置文件SqlMapConfig.xml
<pre><?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">
<configuration>
<properties resource="db.properties"></properties>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="{jdbc.url}"></property>
<property name="username" value="{jdbc.password}" />
</dataSource>
</environment>
</environments>
<!—申明mapper文件 -->
<mappers>
<mapper resource="mapper/productMapper.xml"></mapper>
</mappers>
</configuration></pre>
4.編寫SQL映射配置文件productMapper.xml

<pre><?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="com.sl.mapper.ProductMapper">
<select id="selectAllProduct" resultType="com.sl.po.Product"> select * from products </select>
</mapper></pre>
5.編寫測(cè)試代碼TestClient.java
<pre>//使用productMapper.xml配置文件
public class TestClient { //定義會(huì)話SqlSession
SqlSession session =null;
@Before public void init() throws IOException { //定義mabatis全局配置文件
String resource = "SqlMapConfig.xml"; //加載mybatis全局配置文件 //InputStream inputStream = TestClient.class.getClassLoader().getResourceAsStream(resource);
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(inputStream); //根據(jù)sqlSessionFactory產(chǎn)生會(huì)話sqlsession
session = factory.openSession();
} //查詢所有user表所有數(shù)據(jù)
@Test public void testSelectAllUser() {
String statement = "com.sl.mapper.ProductMapper.selectAllProduct";
List<Product> listProduct =session.selectList(statement); for(Product product:listProduct)
{
System.out.println(product);
} //關(guān)閉會(huì)話
session.close();
}
}</pre>
<pre>public class Product { private int Id; private String Name; private String Description; private BigDecimal UnitPrice; private String ImageUrl; private Boolean IsNew; public int getId() { return Id;
} public void setId(int id) { this.Id = id;
} public String getName() { return Name;
} public void setName(String name) { this.Name = name;
} public String getDescription() { return Description;
} public void setDescription(String description) { this.Description = description;
} public BigDecimal getUnitPrice() { return UnitPrice;
} public void setUnitPrice(BigDecimal unitprice) { this.UnitPrice = unitprice;
} public String getImageUrl() { return Name;
} public void setImageUrl(String imageurl) { this.ImageUrl = imageurl;
} public boolean getIsNew() { return IsNew;
} public void setIsNew(boolean isnew) { this.IsNew = isnew;
}
@Override public String toString() { return "Product [id=" + Id + ", Name=" + Name + ", Description=" + Description + ", UnitPrice=" + UnitPrice + ", ImageUrl=" + ImageUrl + ", IsNew=" + IsNew+ "]";
}
}</pre>
6.運(yùn)行測(cè)試用例

微信公眾號(hào)
個(gè)人公眾號(hào):程序員黃小斜
?
黃小斜是 985 碩士,阿里巴巴Java工程師,在自學(xué)編程、技術(shù)求職、Java學(xué)習(xí)等方面有豐富經(jīng)驗(yàn)和獨(dú)到見解,希望幫助到更多想要從事互聯(lián)網(wǎng)行業(yè)的程序員們。
?
作者專注于 JAVA 后端技術(shù)棧,熱衷于分享程序員干貨、學(xué)習(xí)經(jīng)驗(yàn)、求職心得,以及自學(xué)編程和Java技術(shù)棧的相關(guān)干貨。
?
黃小斜是一個(gè)斜杠青年,堅(jiān)持學(xué)習(xí)和寫作,相信終身學(xué)習(xí)的力量,希望和更多的程序員交朋友,一起進(jìn)步和成長(zhǎng)!
原創(chuàng)電子書:
關(guān)注微信公眾號(hào)【程序員黃小斜】后回復(fù)【原創(chuàng)電子書】即可領(lǐng)取我原創(chuàng)的電子書《菜鳥程序員修煉手冊(cè):從技術(shù)小白到阿里巴巴Java工程師》這份電子書總結(jié)了我2年的Java學(xué)習(xí)之路,包括學(xué)習(xí)方法、技術(shù)總結(jié)、求職經(jīng)驗(yàn)和面試技巧等內(nèi)容,已經(jīng)幫助很多的程序員拿到了心儀的offer!
程序員3T技術(shù)學(xué)習(xí)資源: 一些程序員學(xué)習(xí)技術(shù)的資源大禮包,關(guān)注公眾號(hào)后,后臺(tái)回復(fù)關(guān)鍵字 “資料” 即可免費(fèi)無套路獲取,包括Java、python、C++、大數(shù)據(jù)、機(jī)器學(xué)習(xí)、前端、移動(dòng)端等方向的技術(shù)資料。

技術(shù)公眾號(hào):Java技術(shù)江湖
如果大家想要實(shí)時(shí)關(guān)注我更新的文章以及分享的干貨的話,可以關(guān)注我的微信公眾號(hào)【Java技術(shù)江湖】
這是一位阿里 Java 工程師的技術(shù)小站。作者黃小斜,專注 Java 相關(guān)技術(shù):SSM、SpringBoot、MySQL、分布式、中間件、集群、Linux、網(wǎng)絡(luò)、多線程,偶爾講點(diǎn)Docker、ELK,同時(shí)也分享技術(shù)干貨和學(xué)習(xí)經(jīng)驗(yàn),致力于Java全棧開發(fā)!
Java工程師必備學(xué)習(xí)資源:
關(guān)注公眾號(hào)后回復(fù)”Java“即可領(lǐng)取 Java基礎(chǔ)、進(jìn)階、項(xiàng)目和架構(gòu)師等免費(fèi)學(xué)習(xí)資料,更有數(shù)據(jù)庫、分布式、微服務(wù)等熱門技術(shù)學(xué)習(xí)視頻,內(nèi)容豐富,兼顧原理和實(shí)踐,另外也將贈(zèng)送作者原創(chuàng)的Java學(xué)習(xí)指南、Java程序員面試指南等干貨資源

?