前言
為了鞏固所學(xué)的知識,作者嘗試著開始發(fā)布一些學(xué)習(xí)筆記類的博客,方便日后回顧。當(dāng)然,如果能幫到一些萌新進(jìn)行新技術(shù)的學(xué)習(xí)那也是極好的。作者菜菜一枚,文章中如果有記錄錯誤,歡迎讀者朋友們批評指正。
(博客的參考源碼以可以在我主頁的資源里找到,如果在學(xué)習(xí)的過程中有什么疑問歡迎大家在評論區(qū)向我提出)
發(fā)現(xiàn)寶藏
前些天發(fā)現(xiàn)了一個巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家?!緦毑厝肟凇俊?/p>
一、認(rèn)識mybatis
1.mybatis是什么
MyBatis 是一款優(yōu)秀的持久層框架,它支持自定義 SQL、存儲過程以及高級映射。MyBatis 免除了幾乎所有的 JDBC 代碼以及設(shè)置參數(shù)和獲取結(jié)果集的工作。MyBatis 可以通過簡單的 XML 或注解來配置和映射原始類型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 對象)為數(shù)據(jù)庫中的記錄。
2.jdbc缺點(diǎn)
-
數(shù)據(jù)庫連接,使用時就創(chuàng)建,不使用就釋放,對數(shù)據(jù)庫進(jìn)行頻繁連接開關(guān)和關(guān)閉,造成數(shù)據(jù)庫資源浪費(fèi),影響數(shù)據(jù)庫的性能
-
sql語句使用硬編碼在java程序中,修改sql語句,就需要重新編譯java代碼,不利于系統(tǒng)維護(hù)
-
向預(yù)編譯語句PreparedStatement中設(shè)置參數(shù),對占位符位置和設(shè)置參數(shù)值,硬編碼,修改sql語句也不需要重新編譯java代碼
-
從result中遍歷結(jié)果集數(shù)據(jù)時,存在硬編碼,將獲取表的字段進(jìn)行硬編碼
-
示例代碼
3.mybatis優(yōu)點(diǎn)
-
靈活性:MyBatis允許您直接編寫原生的SQL語句,提供了很高的靈活性。您可以根據(jù)需要編寫任何復(fù)雜的SQL,從而滿足各種業(yè)務(wù)需求。
-
易于使用:MyBatis通過XML配置文件和注解,讓您可以輕松地將SQL語句與Java代碼分離,使得代碼結(jié)構(gòu)更清晰、易于維護(hù)。
-
映射簡單:MyBatis提供了簡單的映射方式,可以將數(shù)據(jù)庫表中的字段自動映射到Java對象的屬性上,降低了數(shù)據(jù)轉(zhuǎn)換的復(fù)雜性。
-
良好的擴(kuò)展性:MyBatis提供了豐富的插件接口,您可以通過編寫自定義插件來擴(kuò)展MyBatis的功能,以滿足特定需求。
-
與其他框架集成:MyBatis可以與Spring、Spring Boot等流行框架無縫集成,提供更加完整的解決方案。
-
社區(qū)支持:MyBatis有一個活躍的開發(fā)者社區(qū),為使用者提供了豐富的文檔、教程和支持。這有助于在遇到問題時快速找到解決方案。
4.MyBatis框架解決JDBC劣勢
針對JDBC編程的劣勢,MyBatis提供了以下解決方案,具體如下。
- 問題一:數(shù)據(jù)庫鏈接創(chuàng)建、釋放頻繁會造成系統(tǒng)資源浪費(fèi),從而影響系統(tǒng)性能。
解決方案:在SqlMapConfig.xml中配置數(shù)據(jù)鏈接池,使用連接池管理數(shù)據(jù)庫鏈接。
- 問題二:SQL語句在代碼中硬編碼,造成代碼不易維護(hù)。在實(shí)際應(yīng)用的開發(fā)中,SQL變化的可能較大。在傳統(tǒng)JDBC編程中,SQL變動需要改變Java代碼,違反了開閉原則。
解決方案:MyBatis將SQL語句配置在MyBatis的映射文件中,實(shí)現(xiàn)了與Java代碼的分離。
- 問題三:使用preparedStatement向占位符傳參數(shù)存在硬編碼,因?yàn)镾QL語句的where條件不一定,可能多也可能少,修改SQL需要修改代碼,造成系統(tǒng)不易維護(hù)。
解決方案:MyBatis自動將Java對象映射至SQL語句,通過Statement中的parameterType定義輸入?yún)?shù)的類型。
- 問題四:JDBC對結(jié)果集解析存在硬編碼(查詢列名),SQL變化導(dǎo)致解析代碼變化,造成系統(tǒng)不易維護(hù)。
解決方案:MyBatis自動將SQL執(zhí)行結(jié)果映射至Java對象,通過Statement中的resultType定義輸出結(jié)果的類型。
- 示例代碼
二、mybatis入門案例
(詳細(xì)代碼見個人主頁mybatis源碼re_mb_mapper模塊)
1.需求分析與操作步驟
2.創(chuàng)建表tb_user、實(shí)體類和Mapper接口
- 創(chuàng)建數(shù)據(jù)庫表
- 查詢語句
create database mybatis;
use mybatis;
drop table if exists tb_user;
create table tb_user(
id int primary key auto_increment,
username varchar(20),
password varchar(20),
gender char(1),
addr varchar(30)
);
INSERT INTO tb_user VALUES (1, 'zhangsan', '123', '男', '北京');
INSERT INTO tb_user VALUES (2, '李四', '234', '女', '天津');
INSERT INTO tb_user VALUES (3, '王五', '11', '男', '西安');
- 效果展示
- 創(chuàng)建實(shí)體類及其對應(yīng)的Mapper接口
- 創(chuàng)建實(shí)體類
//省略setter、getter方法和toString方法
public class User {
private Integer id;
private String username;
private String password;
private String gender;
private String addr;
- 創(chuàng)建對應(yīng)的實(shí)體類user的Mapper接口
public interface UserMapper {
}
3.創(chuàng)建maven模塊re_mb_demon
4.在pom.xml配置文件中導(dǎo)入相關(guān)依賴
<dependencies>
<!--mybatis 依賴-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<!--mysql 驅(qū)動-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<!--junit 單元測試-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<!-- 添加slf4j日志api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.20</version>
</dependency>
<!-- 添加logback-classic依賴 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!-- 添加logback-core依賴 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>
5. 配置相關(guān)文件
- 創(chuàng)建并配置控制臺輸出日志logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--
CONSOLE :表示當(dāng)前的日志信息是可以輸出到控制臺的。
-->
<appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>[%level] %cyan([%thread]) %boldGreen(%logger{15}) - %msg %n</pattern>
</encoder>
</appender>
<logger name="org.example" level="DEBUG" additivity="false">
<appender-ref ref="Console"/>
</logger>
<!--
level:用來設(shè)置打印級別,大小寫無關(guān):TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF
, 默認(rèn)debug
<root>可以包含零個或多個<appender-ref>元素,標(biāo)識這個輸出位置將會被本日志級別控制。
-->
<root level="DEBUG">
<appender-ref ref="Console"/>
</root>
</configuration>
- 創(chuàng)建并配置數(shù)據(jù)庫連接信息mabatis_config.xml
<?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>
<!--數(shù)據(jù)庫連接信息-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!--指定映射配置文件的位置-->
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
- 創(chuàng)建并配置映射配置文件UserMapper.xml
<?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">
<!--namespace:名稱空間-->
<mapper namespace="org.example.mapper.UserMapper">
<!--id: select標(biāo)簽的唯一標(biāo)識符-->
<!--resultType: 返回值類型-->
<select id="selectAll" resultType="org.example.pojo.User">
select *
from tb_user;
</select>
</mapper>
6.創(chuàng)建并編寫模擬測試類MybatisDemon
/**
* Mybatis 快速入門代碼
*/
public class MyBatisDemo {
public static void main(String[] args) throws IOException {
//1. 加載mybatis的核心配置文件,獲取 SqlSessionFactory
//定義配置文件路徑
String resource = "mybatis-config.xml";
//通過mybatis提供的resources資源加載類對象返回一個字節(jié)輸入流
InputStream inputStream = Resources.getResourceAsStream(resource);
//將字節(jié)輸入流傳入SqlSessionFactoryBuilder()的build()方法,返回一個SqlSessionFactory對象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2. 獲取SqlSession對象,用它來執(zhí)行sql
SqlSession sqlSession = sqlSessionFactory.openSession();
//3. 執(zhí)行sql
//參數(shù):名稱空間 + id
List<User> users = sqlSession.selectList("org.example.mapper.UserMapper.selectAll");
System.out.println(users);
//4. 釋放資源
sqlSession.close();
}
}
7.運(yùn)行結(jié)果與文件結(jié)構(gòu)
- 運(yùn)行結(jié)果
- 文件結(jié)構(gòu)
8. 解決配置SQL語句警告提示
- 問題描述
- 解決方案
(還需要填寫數(shù)據(jù)庫名)
三.mybatis mapper代理開發(fā)
(在mybatis入門案例的基礎(chǔ)上進(jìn)行編碼,詳細(xì)代碼見個人主頁mybatis源碼re_mb_mapper模塊)
1.初識mapper代理開發(fā)
- 方法一 :在一個 XML 映射文件(如案例中的UserMapper.xml)中,可以定義無數(shù)個映射語句,這樣一來,XML 頭部和文檔類型聲明部分就顯得微不足道了。文檔的其它部分很直白,容易理解。 它在命名空間 “org.example.mapper.UserMapper” 中定義了一個名為 “selectAll” 的映射語句,這樣你就可以用全限定名 “org.example.mapper.UserMapper.selectAll” 來調(diào)用映射語句了,就像入門案例模擬測試類中那樣:
List<User> users = sqlSession.selectList("org.example.mapper.UserMapper.selectAll");
- 方法二 :你可能會注意到,這種方式和用全限定名調(diào)用 Java 對象的方法類似。這樣,該命名就可以直接映射到在命名空間中同名的映射器類,并將已映射的 select 語句匹配到對應(yīng)名稱、參數(shù)和返回類型的方法。因此你就可以像上面那樣,不費(fèi)吹灰之力地在對應(yīng)的映射器接口調(diào)用方法,就像下面這樣:
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> users = userMapper.selectAll();
第二種方法有很多優(yōu)勢,首先它不依賴于字符串字面值,會更安全一點(diǎn);其次,如果你的 IDE 有代碼補(bǔ)全功能,那么代碼補(bǔ)全可以幫你快速選擇到映射好的 SQL 語句。
2.mybatis mapper代理開發(fā)規(guī)則
3.根據(jù)代理開發(fā)規(guī)則編碼示例
- 定義與 SQL映射文件同名的Mapper接口,并將Mapper接口和SQL映射文件放置在同一個目錄下
- 步驟一
- 步驟二
- 設(shè)置SQL映射文件(UserMapper.xml)的namespace屬性為Mapper接口全限定名
- 在Maper接口中定義方法,方法名就是SQL文件中sql語句的id,并保持參數(shù)類型和返回值類型一致
public interface UserMapper {
List<User> selectAll();
}
4.編碼(模擬測試類MybatisDemon)
- 模擬測試類運(yùn)行結(jié)果
6.包掃描的方式掃描mapper映射文件(mybatis_config.xml)
四、mybatis核心配置文件
1.配置
MyBatis 的配置文件包含了會深深影響 MyBatis 行為的設(shè)置和屬性信息。 配置文檔的頂層結(jié)構(gòu)如下:
.configuration(配置)
.properties(屬性)
.settings(設(shè)置)
.typeAliases(類型別名)
.typeHandlers(類型處理器)
.objectFactory(對象工廠)
.plugins(插件)
.environments(環(huán)境配置)
.environment(環(huán)境變量)
.transactionManager(事務(wù)管理器)
.dataSource(數(shù)據(jù)源)
.databaseIdProvider(數(shù)據(jù)庫廠商標(biāo)識)
.mappers(映射器)
注意:配置各個標(biāo)簽時,需要遵守前后順序
2.環(huán)境配置(environments)
- 應(yīng)用場景講解
MyBatis 可以配置成適應(yīng)多種環(huán)境,這種機(jī)制有助于將 SQL 映射應(yīng)用于多種數(shù)據(jù)庫之中, 現(xiàn)實(shí)情況下有多種理由需要這么做。例如,開發(fā)、測試和生產(chǎn)環(huán)境需要有不同的配置;或者想在具有相同 Schema 的多個生產(chǎn)數(shù)據(jù)庫中使用相同的 SQL 映射。還有許多類似的使用場景。
不過要記?。罕M管可以配置多個環(huán)境,但每個 SqlSessionFactory 實(shí)例只能選擇一種環(huán)境。
- 環(huán)境配置操作簡介
所以,如果你想連接兩個數(shù)據(jù)庫,就需要創(chuàng)建兩個 SqlSessionFactory 實(shí)例,每個數(shù)據(jù)庫對應(yīng)一個。而如果是三個數(shù)據(jù)庫,就需要三個實(shí)例,依此類推,記起來很簡單:
每個數(shù)據(jù)庫對應(yīng)一個 SqlSessionFactory 實(shí)例
為了指定創(chuàng)建哪種環(huán)境,只要將它作為可選的參數(shù)傳遞給 SqlSessionFactoryBuilder 即可??梢越邮墉h(huán)境配置的兩個方法簽名是:
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, properties);
如果忽略了環(huán)境參數(shù),那么將會加載默認(rèn)環(huán)境,如下所示:
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, properties);
environments 元素定義了如何配置環(huán)境。
<!--environments:配置數(shù)據(jù)庫連接環(huán)境信息??梢耘渲枚鄠€environment-->
<!--default: 切換不同的environment-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="..." value="..."/>
</transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
注意一些關(guān)鍵點(diǎn):
默認(rèn)使用的環(huán)境 ID(比如:default="development")。
每個 environment 元素定義的環(huán)境 ID(比如:id="development")。
事務(wù)管理器的配置(比如:type="JDBC")。
數(shù)據(jù)源的配置(比如:type="POOLED")。
默認(rèn)環(huán)境和環(huán)境 ID 顧名思義。 環(huán)境可以隨意命名,但務(wù)必保證默認(rèn)的環(huán)境 ID 要匹配其中一個環(huán)境 ID。
3.類型別名(typeAliases)
- 通過配單個配類型別名
類型別名可為 Java 類型設(shè)置一個縮寫名字。 它僅用于 XML 配置,意在降低冗余的全限定類名書寫。例如:
<typeAliases>
<typeAlias alias="Author" type="domain.blog.Author"/>
<typeAlias alias="Blog" type="domain.blog.Blog"/>
<typeAlias alias="Comment" type="domain.blog.Comment"/>
<typeAlias alias="Post" type="domain.blog.Post"/>
<typeAlias alias="Section" type="domain.blog.Section"/>
<typeAlias alias="Tag" type="domain.blog.Tag"/>
</typeAliases>
當(dāng)這樣配置時,Blog 可以用在任何使用 domain.blog.Blog 的地方。
- 通過配包配置類型別名
也可以指定一個包名,MyBatis 會在包名下面搜索需要的 Java Bean,比如:
<typeAliases>
<package name="domain.blog"/>
</typeAliases>
- 示例
(mybatis_config.xml)
(UserMapper.xml)
- 有注解的情況下類型別名的配置
每一個在包 domain.blog 中的 Java Bean,在沒有注解的情況下,會使用 Bean 的首字母小寫的非限定類名來作為它的別名。 比如 domain.blog.Author 的別名為 author;若有注解,則別名為其注解值。見下面的例子:文章來源:http://www.zghlxwxcb.cn/news/detail-449286.html
@Alias("author")
public class Author {
...
}
總結(jié)
歡迎各位留言交流以及批評指正,如果文章對您有幫助或者覺得作者寫的還不錯可以點(diǎn)一下關(guān)注,點(diǎn)贊,收藏支持一下。
(博客的參考源碼可以在我主頁的資源里找到,如果在學(xué)習(xí)的過程中有什么疑問歡迎大家在評論區(qū)向我提出)文章來源地址http://www.zghlxwxcb.cn/news/detail-449286.html
到了這里,關(guān)于初識Mybatis -- Mybatis入門保姆級教程(一)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!