? 一、Maven
1.1 非Maven項目的缺點
問題一:
? ? ? ? 項目中的jar包資源需要我們自己從網上下載后,手動導入到項目中使用,不好管理
問題二:
? ? ? ? jar包版本控制麻煩
1.2 Maven介紹
? ? ? ? Maven是使用Java語言編寫的基于項目對象模型(POM)項目管理工具軟件。開發者可以通過一小段描述信息來管理項目構建、報告和文檔。使用Maven可以更好的幫助我們完成項目的管理。
1.3 Maven倉庫
? ? ? ? 中央倉庫(Central Repository):Maven官方服務器。里面存放了絕大多數市面上流行的jar。允許用戶政策后,上傳自己的項目到官方服務器。網址在國外,經常訪問不了。
https://mvnrepository.com/https://mvnrepository.com/? ? ? ? 鏡像倉庫(Mirror Repository):對于國內來說,訪問國外的Maven倉庫會特別慢。鏡像倉庫就是另一臺備份/復制了中央倉庫的服務器。平時使用時國內開發者多使用阿里云鏡像或華為云鏡像,這樣可以大大提升從中央倉庫下載資源的速度。但它的角色仍然是一個遠程庫。
? ? ? ? 本地倉庫(Local Repository):本機的文件夾作為本地倉庫,本地倉庫指本機的一份拷貝,用來緩存遠程下載,包含你尚未發布的臨時構件。
1.4 Maven的資源坐標
<!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j -->
<dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.3.0</version>
</dependency>
GroupId:一般是逆向公司域名com.xxx。同一個公司的GroupId都是相同的。
ArtifactId:一般是項目(jar)名,如:mysql-connector-java。
Version:版本號8.0.28。
1.5?Maven的下載和安裝
? ? ? ? 從maven官網下載Maven,官網地址:
Welcome to Apache Maven – Mavenhttps://maven.apache.org/
1.6 Maven常用配置
(1)配置本地倉庫
? ? ? ? 隨便選擇一個目錄作為本地倉庫
? ? ? ? 在配置文件中指定本地倉庫的位置
配置文件位置:F:\Java-IDEA\apache-maven-3.9.11\conf\settings.xml(就是剛剛1.5中下載的Maven包的路徑中)
(2) 配置鏡像倉庫
配置文件位置:F:\Java-IDEA\apache-maven-3.9.11\conf\settings.xml(就是剛剛1.5中下載的Maven包的路徑中)
<mirror><id>alimaven</id><mirrorOf>central</mirrorOf><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
(3)配置JDK
? ? ? ? 在使用Maven之后,項目由Maven來完成編譯和打包運行,需要指定使用的JDK版本。
配置文件位置:F:\Java-IDEA\apache-maven-3.9.11\conf\settings.xml(就是剛剛1.5中下載的Maven包的路徑中)
<profile><id>jdk-17</id><activation><activeByDefault>true</activeByDefault><jdk>17</jdk></activation><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><maven.compiler.compilerVersion>17</maven.compiler.compilerVersion></properties>
</profile>
1.7 創建Maven項目
(1)降版本操作
? ? ? ? 目前我們下載的Maven版本是3.9.11,JDK的版本是17,由于市面上對于這個版本的配置并不兼容,會出現一系列的問題,所以,我們要將Maven和JDK的版本降低到一個穩定兼容的版本:
manen:切換版本為3.6.3
https://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.zip
https://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.zipJDK:切換版本為8
????????這個鏈接中有所有的JDK下載地址
Index of java-local/jdkhttps://repo.huaweicloud.com/java/jdk/
?(2)創建Maven項目

IDEA集成Maven操作
(3)Maven項目目錄結構
?(4)測試Maven中MySql數據庫鏈接
package com.study.test01;import java.sql.*;public class Test {public static void main(String[] args) throws SQLException, ClassNotFoundException {// 加載驅動:Class.forName("com.mysql.cj.jdbc.Driver");// 獲取連接String url = "jdbc:mysql://127.0.0.1:3306/study?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true";/*=====url中參數含義=====useSSL:是否使用SSL認證機制-不使用 falseuseUnicode:是否使用unicode字符集-使用characterEncoding=UTF-8:使用unicode的utf-8策略serverTimezone:時區參數-東八區allowPublicKeyRetrieval:允許客戶端從服務器獲取公鑰*/String username = "root";String password = "root";Connection conn = DriverManager.getConnection(url, username, password);// 創建會話Statement stmt = conn.createStatement();// 發送SQL(更新操作)ResultSet resultSet = stmt.executeQuery("select * from t_book");// 處理結果while (resultSet.next()) { // 判斷是否有記錄存在System.out.println(resultSet.getString("id") + "----" + resultSet.getString("name") + "----" + resultSet.getString("author") + "----" + resultSet.getDouble("price"));}// 關閉資源stmt.close();conn.close();}
}
二、框架
2.1 框架出現的意義
? ? ? ? 重復/基礎代碼封裝,同時添加額外功能
? ? ? ? 釋放程序員寫代碼精力,更關注業務層面
? ? ? ? 框架是半成品
2.2 框架的優缺點
? ? 優點
? ? ? ? 更好用
? ? ? ? 更強大
? ? ? ? 開發周期短
? ? 缺點
? ? ? ? 更多的學習成本
? ? ? ? 初學者容易出錯
? ? ? ? 對于初學者,出了錯誤更難解決
2.3 常見框架
常見Java框架分類:
(1)持久層框架:MyBatis、Hibernate、Spring Data、iBatis
(2)MVC框架:Spring MVC、Struts1、Struts2
(3)項目管理框架:Spring Framework、Spring Boot
(4)微服務框架:Spring Cloud
(5)權限管理框架:Spring Security、Shiro
三、MyBatis使用
3.1 MyBatis是持久層框架
? ? ? ? 持久層是分層開發中專門負責訪問數據源的一層,Java項目中每一層都由自己的作用,持久層的作用就是訪問數據源,把訪問數據源的代碼和業務邏輯代碼分離開,有利于后期維護和團隊分工開發。同時也增加了數據訪問代碼的復用性。
3.2 MyBatis是ORM框架
? ? ? ? ORM(Object/Relation Mapping),中文名稱:對象/關系映射。是一種解決數據庫發展和面向對象編程語言發展不匹配問題而出現的技術。
3.3 搭建第一個MyBatis框架
(1)創建數據庫表
(2)創建Maven項目
(3)添加依賴
添加MySql依賴(在pom.xml文件中)
?(4)創建MyBatis全局配置文件
參考官網:入門_MyBatis中文網
https://mybatis.net.cn/getting-started.html

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!--連接數據庫--><environments default="mysql"><environment id="mysql"><!--事務配置--><transactionManager type="JDBC"></transactionManager><!--數據源--><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://127.0.0.1:3306/study?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments>
</configuration>
?(5)創建實體類
? ? ? ? 實體類的參數要跟數據庫中的列名保持一致
(6)創建映射文件
創建映射文件
在核心配置文件中進行掃描?
(7)編寫測試類,啟動項目?
package com.study.test;import com.study.pojo.Book;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;
import java.util.List;public class Test {public static void main(String[] args) throws IOException {// 指定核心配置文件的路徑String resource = "mybatis.xml";// 獲取加載配置文件的輸入流InputStream inputStream = Resources.getResourceAsStream(resource);// 加載配置文件:創建工廠類SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 通過工廠類獲取一個會話SqlSession sqlSession = sqlSessionFactory.openSession();// 執行查詢List<Object> list = sqlSession.selectList("a.b.sellectAllBooks");// 遍歷for (int i = 0; i < list.size(); i++) {Book book = (Book) list.get(i);System.out.println(book.getName() + "---" + book.getAuthor() + "---" + book.getPrice());}//關閉資源sqlSession.close();}
}
四、MyBatis配置
4.1 別名設置
? ? ? ? MyBatis提供了別名機制可以對某個類起別名或給某個包下所有類起別名,簡化resultType取值的寫法。
? ? ? ? 在核心配置文件中(mybatis.xml),通過<typeAlias>標簽明確設置類型的別名。
- type:類型全限定路徑
- alias:別名名稱
<typeAliases><typeAlias type="com.study.pojo.Book" alias="book"></typeAlias>
</typeAliases>
? ? ? ? 當類個數比較多時,明確指定別名工作量較大,可以通過<package>標簽指定包下全部類的別名。指定后所有類的別名就是類名。(也不區分大小寫)
<typeAliases><!--單獨設置別名--><typeAlias type="com.study.pojo.Book" alias="book"></typeAlias><!--統一設置別名--><package name="com.study.pojo"/>
</typeAliases>
ps:明確指定別名和指定包的方式可以同時存在
4.2 內置別名
????????MyBatis框架中內置了一些常見類型的別名。這些別名不需要配置?
別名 | 映射的類型 | 別名 | 映射的類型 | 別名 | 映射的類型 |
_byte | byte | string | String | date | Date |
_long | long | byte | Byte | decimal | Decimal |
_short | short | long | Long | bigdecimal | BigDecimal |
_int | int | short | Short | object | Object |
_inerger | int | int | Integer | map | Map |
_double | double | integer | Integer | hashmap | HashMap |
_float | float | double | Double | list | List |
_boolean | boolean | float | Float | arraylist | ArrayList |
boolean | Boolean | collection | Collection | ||
iterator | Iterator |
4.3 屬性文件配置
? ? ? ? MyBatis支持加載屬性文件(.properties文件),可以通過在屬性文件中配置數據庫里娜姬屬性然后加載。這種方式要比直接寫稍微麻煩一點點,但是卻可以把所有的數據庫連接寫道了統一的文件中,以后查看或修改時更加方便。
在src/main/resources目錄中創建db.properties文件:
url=jdbc:mysql://127.0.0.1:3306/study?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
driver=com.mysql.cj.jdbc.Driver
username=root
password=root
修改mybatis.xml文件,設置加載屬性。通過${key}獲取屬性文件中配置的值:
<!-- 加載properties配置文件-->
<properties resource="db.properties"><!--數據源 示例:-->
<dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/>
</dataSource>
4.4 MyBatis啟動日志功能
????????MyBatis框架內置日志工廠。日志工廠負責自動加載項目中的配置的日志。MyBatis支持以下日志:
- SLF4J
- Apache Commons Logging
- Log4j 2
- Log4j(deprecated since 3.5.9)
- JDK logging
(1)在pom.xml文件中配置
<!--Log4j的依賴-->
<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version>
</dependency>
(2)在resources中新建log4j.properties配置文件。名稱必須叫這個名字,擴展名必須是.properties
# log4j中定義的級別:fatal(致命錯誤)>error(錯誤)>warn(警告)>info(普通信息)>debug(調試信息)>trace(跟蹤信息)
log4j.rootLogger = trace,console### console ### 控制臺
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = [%p] [%-d{yyy--MM-dd HH\:mm\:ss}] %C.%M(%L) | %m%n
? ? ? ? 如果說你是想看sql執行過程,那么可以整體調高,局部降低:將整個日志的級別調為ERROR,然后mapper.xml涉及的內容級別降低為TRACE。這樣整體的多余信息不會輸出,然后mapper.xml中的涉及內容會詳細打印,log4j.properties加入:
#log4j.looger是固定的,a.b是命名空間的名字
log4j.logger.a.b = trace
五、接口
(1)類是類,接口是接口。
(2)接口:定義規則。實現類:實現接口,實現規則。
(3)接口:用interface來表示。
(4)在JDK1.8之前,接口中的內容:常量、抽象方法。
(5)實現類實現接口,利用implements關鍵字
(6)實現類實現接口后,重寫接口中當以的抽象方法
(7)接口不能創建對象,需要用接口指向實現類的形式創建對象(多態形式)
六、依據接口綁定方案創建項目
6.1 創建新的Maven項目
6.2 配置pom.xml,引入依賴
<?xml version="1.0" encoding="UTF-8"?>
<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>org.example</groupId><artifactId>TestMyBatis02</artifactId><version>1.0-SNAPSHOT</version><dependencies><!--MySql驅動的依賴--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><!--MyBatis的依賴--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.6</version></dependency><!--Log4j的依賴--><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency></dependencies></project>
6.3 配置全局配置文件MyBatis.xml
?6.4 引入數據庫配置和日志配置
db.properties
url=jdbc:mysql://127.0.0.1:3306/study?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
driver=com.mysql.cj.jdbc.Driver
username=root
password=root
log4j.properties
log4j.rootLogger = error,consolelog4j.logger.a.b = tracelog4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = [%p] [%-d{yyy--MM-dd HH\:mm\:ss}] %C.%M(%L) | %m%n
6.5 創建數據庫的實體類
package com.study.pojo;public class Book {private int id;private String name;private String author;private double price;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 getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}// 構造器public Book(int id, String name, String author, double price) {this.id = id;this.name = name;this.author = author;this.price = price;}
}
6.6 創建接口
6.7 創建映射文件
要求:namespace取值必須是接口的全限定路徑、標簽中的id屬性值必須和方法名對應
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.study.mapper.BookMapper"><select id="selectAllBooks" resultType="Book">select * from t_book</select>
</mapper>
6.8 編寫測試類(通過動態代理模式)
package com.study.test;import com.study.mapper.BookMapper;
import com.study.pojo.Book;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;
import java.util.List;public class Test {public static void main(String[] args) throws IOException {// 指定核心配置文件的路徑String resource = "mybatis.xml";// 獲取加載配置文件的輸入流InputStream inputStream = Resources.getResourceAsStream(resource);// 加載配置文件:創建工廠類SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 通過工廠類獲取一個會話SqlSession sqlSession = sqlSessionFactory.openSession();// 執行查詢// 動態代理模式 = BookMapper mapper = BookMapper (接口 = 實現類)BookMapper mapper = sqlSession.getMapper(BookMapper.class); // 參數:接口List list = mapper.selectAllBooks();// 遍歷操作for (int i = 0; i < list.size(); i++) {Book book = (Book) list.get(i);System.out.println(book.getName());}//關閉資源sqlSession.close();}
}
七、MyBatis的參數傳遞問題
7.1 如何進行參數傳遞
使用接口綁定方案之前:
? ? ? ? (1)如果是一個參數,直接傳遞
? ? ? ? (2)如果是多個參數,封裝成對象/集合
使用接口綁定方案之后:
? ? ? ? 可以直接調用方法傳遞參數即可。?
7.2 獲取數據方式
(1)使用內置名稱進行調用
使用符號:#{}進行獲取
{}中名字的使用規則:
arg0、arg1、argM(M為從0開始的數字,和方法參數順序對應)
或
param1、param2、paramN(N為從1開始的數字,和方法參數順序對應)
<select id="selectOneBook" resultType="Book">select * from t_book where name = #{param1} and author = #{param2}
</select>
(2)使用對象類型傳遞參數
使用符號:#{}進行獲取
直接利用屬性名即可
<select id="selectOneBook2" resultType="Book">select * from t_book where name = #{name} and author = #{author}
</select>
(3)傳遞多個不同類型的參數
使用符號:#{}進行獲取
argM.屬性名
或
paramN.屬性名
PS:argM.或者paramN.不可以省略不寫
<select id="selectOneBook3" resultType="Book">select * from t_book where name = #{param1} and author = #{param2.author}
</select>
7.3 數據庫修改數據
增加操作
????????映射文件
insert(增加)、delete(刪除)、update(修改)
<insert id="insertBook">insert into t_book(id,name,author,price) values (#{id},#{name},#{author},#{price})
</insert>
注意:修改數據庫時有一個事務相關的操作
// 這里會涉及一個跟事務相關的操作:提交(commit)
sqlSession.commit();