MyBatis學習筆記(一)
標簽: java Java_Path mybatis 后端 sql
參考
mybatis官方文檔
文中例子來自于官方文檔和黑馬教程
夢編猿Mybatis專欄
ORM框架簡介及優缺點
一:簡介
MyBatis 是一款優秀的持久層框架,它支持定制化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以使用簡單的 XML 或注解來配置和映射原生類型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 對象)為數據庫中的記錄。
圖片來源于https://blog.csdn.net/Dream_Weave/article/details/84099610
1.1 ORM框架簡介
對象關系映射(Object Relational Mapping,簡稱ORM)模式是一種為了解決面向對象與關系數據庫存在的互不匹配的現象的技術。簡單的說,ORM是通過使用描述對象和數據庫之間映射的元數據,將程序中的對象自動持久化到關系數據庫中。
ORM提供了實現持久化層的另一種模式,它采用映射元數據來描述對象關系的映射,使得ORM中間件能在任何一個應用的業務邏輯層和數據庫層之間充當橋梁。Java典型的ORM中間件有:Hibernate,ibatis,speedframework。
ORM的方法論基于三個核心原則:
· 簡單:以最基本的形式建模數據。
· 傳達性:數據庫結構被任何人都能理解的語言文檔化。
· 精確性:基于數據模型創建正確標準化了的結構。
持久層(Persistence Layer),即專注于實現數據持久化應用領域的某個特定系統的一個邏輯層面,將數據使用者和數據實體相關聯。
二:使用
2.1 安裝
要使用 MyBatis, 只需將 mybatis-x.x.x.jar 文件置于 classpath 中即可。
如果使用 Maven 來構建項目,則需將下面的 dependency 代碼置于 pom.xml 文件中:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
2.2 XML配置文件
MyBatis 的配置文件包含了會深深影響 MyBatis 行為的設置和屬性信息。 配置文檔的頂層結構如下:
-
configuration(配置)
properties(屬性) settings(設置) typeAliases(類型別名) typeHandlers(類型處理器) objectFactory(對象工廠) plugins(插件) environments(環境配置) environment(環境變量) transactionManager(事務管理器) dataSource(數據源) databaseIdProvider(數據庫廠商標識) mappers(映射器)
2.2.1 屬性(properties)
這些屬性都是可外部配置且可動態替換的,既可以在典型的Java屬性文件中配置,亦可通過properties元素的子元素來傳遞。例如:
<properties resource="org/mybatis/example/config.properties">
<property name="username" value="dev_user"/>
<property name="password" value="F2Fa3!33TYyg"/>
</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>
這個例子中的 username 和 password 將會由 properties 元素中設置的相應值來替換。 driver 和 url 屬性將會由 config.properties 文件中對應的值來替換。這樣就為配置提供了諸多靈活選擇。
如果屬性在不只一個地方進行了配置,那么 MyBatis 將按照下面的順序來加載:
- 在 properties 元素體內指定的屬性首先被讀取。
- 然后根據 properties 元素中的 resource 屬性讀取類路徑下屬性文件或根據 url 屬性指定的路徑讀取屬性文件,并覆蓋已讀取的同名屬性。
- 最后讀取作為方法參數傳遞的屬性,并覆蓋已讀取的同名屬性。
因此,通過方法參數傳遞的屬性具有最高優先級,resource/url 屬性中指定的配置文件次之,最低優先級的是 properties 屬性中指定的屬性。
2.2.2 設置(settings)
這是 MyBatis 中極為重要的調整設置,它們會改變 MyBatis 的運行時行為。
所有設置項
一個配置完整的settings元素的示例
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="false"/>
<setting name="autoMappingBehavior" value="PARTIAL"/>
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25"/>
<setting name="defaultFetchSize" value="100"/>
<setting name="safeRowBoundsEnabled" value="false"/>
<setting name="mapUnderscoreToCamelCase" value="false"/>
<setting name="localCacheScope" value="SESSION"/>
<setting name="jdbcTypeForNull" value="OTHER"/>
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
2.2.3 類型別名(typeAliases)
類型別名是為 Java 類型設置一個短的名字。 它只和 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>
當這樣配置時,blog可以用在任何使用domain.blog.Blog的地方
也可以指定一個包名,Mybatis會在包名下面搜索需要的Java Bean,比如:
<typeAliases>
<package name="domain.blog"/>
</typeAliases>
每一個在包 domain.blog 中的 Java Bean,在沒有注解的情況下,會使用 Bean 的首字母小寫的非限定類名來作為它的別名。 比如 domain.blog.Author 的別名為 author;若有注解,則別名為其注解值。見下面的例子:
@Alias("author")
public class Author {
...
}
2.2.4 環境配置(environments)
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<!--配置連接池-->
<dataSource type="POOLED">
<!-- 連接池的4個基本信息 -->
<property name="driver" value="com.mysql.cj.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/mybatisdb?serverTimezone=UTC"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
</dataSource>
</environment>
</environments>
MyBatis 可以配置成適應多種環境,這種機制有助于將 SQL 映射應用于多種數據庫之中, 現實情況下有多種理由需要這么做。例如,開發、測試和生產環境需要有不同的配置;或者想在具有相同 Schema 的多個生產數據庫中 使用相同的 SQL 映射。有許多類似的使用場景。
不過要記住:盡管可以配置多個環境,但每個 SqlSessionFactory 實例只能選擇一種環境。
所以,如果你想連接兩個數據庫,就需要創建兩個 SqlSessionFactory 實例,每個數據庫對應一個。而如果是三個數據庫,就需要三個實例,依此類推,記起來很簡單:
每個數據庫對應一個 SqlSessionFactory 實例
2.2.4.1 事務管理器(transactionManager)
在 MyBatis 中有兩種類型的事務管理器(也就是 type=”[JDBC|MANAGED]”):
- JDBC – 這個配置就是直接使用了 JDBC 的提交和回滾設置,它依賴于從數據源得到的連接來管理事務作用域。
- MANAGED – 這個配置幾乎沒做什么。它從來不提交或回滾一個連接,而是讓容器來管理事務的整個生命周期(比如 JEE 應用服務器的上下文)。 默認情況下它會關閉連接,然而一些容器并不希望這樣,因此需要將 closeConnection 屬性設置為 false 來阻止它默認的關閉行為。
2.2.4.2 數據源(data Source)
dataSource 元素使用標準的 JDBC 數據源接口來配置 JDBC 連接對象的資源。
有三種內建的數據源類型(也就是 type=”[UNPOOLED|POOLED|JNDI]”):
UNPOOLED– 這個數據源的實現只是每次被請求時打開和關閉連接。雖然有點慢,但對于在數據庫連接可用性方面沒有太高要求的簡單應用程序來說,是一個很好的選擇。 不同的數據庫在性能方面的表現也是不一樣的,對于某些數據庫來說,使用連接池并不重要,這個配置就很適合這種情形。UNPOOLED 類型的數據源具有以下屬性。:
- driver – 這是 JDBC 驅動的 Java 類的完全限定名(并不是 JDBC 驅動中可能包含的數據源類)。
- url – 這是數據庫的 JDBC URL 地址。
- username – 登錄數據庫的用戶名。
- password – 登錄數據庫的密碼。
- defaultTransactionIsolationLevel – 默認的連接事務隔離級別。
- defaultNetworkTimeout – The default network timeout value in milliseconds to wait for the databas
- operation to complete. See the API documentation of java.sql.Connection#setNetworkTimeout() for details.
作為可選項,你也可以傳遞屬性給數據庫驅動。只需在屬性名加上“driver.”前綴即可,例如:
- driver.encoding=UTF8
這將通過 DriverManager.getConnection(url,driverProperties) 方法傳遞值為 UTF8 的 encoding 屬性給數據庫驅動。
POOLED– 這種數據源的實現利用“池”的概念將 JDBC 連接對象組織起來,避免了創建新的連接實例時所必需的初始化和認證時間。 這是一種使得并發 Web 應用快速響應請求的流行處理方式。
基礎屬性如下:
- driver – 這是 JDBC 驅動的 Java 類的完全限定名(并不是 JDBC 驅動中可能包含的數據源類)。
- url – 這是數據庫的 JDBC URL 地址。
- username – 登錄數據庫的用戶名。
- password – 登錄數據庫的密碼。
JNDI – 這個數據源的實現是為了能在如 EJB 或應用服務器這類容器中使用,容器可以集中或在外部配置數據源,然后放置一個 JNDI 上下文的引用。這種數據源配置只需要兩個屬性:
- initial_context – 這個屬性用來在 InitialContext 中尋找上下文(即,initialContext.lookup(initial_context))。這是個可選屬性,如果忽略,那么將會直接從 InitialContext 中尋找 data_source 屬性。
- data_source – 這是引用數據源實例位置的上下文的路徑。提供了 initial_context 配置時會在其返回的上下文中進行查找,沒有提供時則直接在 InitialContext 中查找。
2.2.5 映射器(mappers)
既然 MyBatis 的行為已經由上述元素配置完了,我們現在就要定義 SQL 映射語句了。 但是首先我們需要告訴 MyBatis 到哪里去找到這些語句。 Java 在自動查找這方面沒有提供一個很好的方法,所以最佳的方式是告訴 MyBatis 到哪里去找映射文件。 你可以使用相對于類路徑的資源引用, 或完全限定資源定位符(包括 file:/// 的 URL),或類名和包名等。例如:
<!-- 使用相對于類路徑的資源引用 -->
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
<!-- 使用完全限定資源定位符(URL) -->
<mappers>
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
<mapper url="file:///var/mappers/BlogMapper.xml"/>
<mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>
<!-- 使用映射器接口實現類的完全限定類名 -->
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
<mapper class="org.mybatis.builder.BlogMapper"/>
<mapper class="org.mybatis.builder.PostMapper"/>
</mappers>
<!-- 將包內的映射器接口實現全部注冊為映射器 -->
<mappers>
<package name="org.mybatis.builder"/>
</mappers>
三:Mybatis使用案例
3.1 創建maven工程
創建 mybatis01 的工程,工程信息如下:
Groupid:asia
ArtifactId:mybatis
Packing:jar
3.2 添加Mybatis坐標和約束
在 pom.xml 文件中添加 Mybatis的坐標,如下:
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
3.3 編寫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">
<!-- mybatis主配置環境 -->
<configuration>
<typeAliases>
<package name="com.asia.domain"></package>
</typeAliases>
<!--配置環境-->
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<!--配置連接池-->
<dataSource type="POOLED">
<!-- 連接池的4個基本信息 -->
<property name="driver" value="com.mysql.cj.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/mybatisdb?serverTimezone=UTC"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
</dataSource>
</environment>
</environments>
<!-- 指定映射配置文件的位置,映射配置文件指的是每個dao獨立的配置文件 -->
<mappers>
<mapper resource="com/asia/dao/UserDao.xml"></mapper>
<mapper resource="com/asia/dao/AccountDao.xml"></mapper>
</mappers>
</configuration>
2.4 編寫數據庫數據對應的Java實體類
package com.asia.domain;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
public class User implements Serializable {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", birthday=" + birthday +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
'}';
}
}
3.5 編寫持久層接口UserDao
package com.asia.dao;
import com.asia.domain.User;
import java.util.List;
/**
* 用戶的持久層接口
*/
public interface UserDao {
/**
* 查詢所有
* @return
*/
List<User> findAll();
}
3.6 編寫持久層接口的映射文件 UserDao.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">
<mapper namespace="com.asia.dao.UserDao">
<!-- 查詢所有 -->
<select id="findAll" resultType="user">
select * from user;
</select>
</mapper>
3.7 編寫測試類
//1.讀取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.創建 SqlSessionFactory 的構建者對象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.使用構建者創建工廠對象 SqlSessionFactory
SqlSessionFactory factory = builder.build(in);
//4.使用 SqlSessionFactory 生產 SqlSession 對象
SqlSession session = factory.openSession();
//5.使用 SqlSession 創建 dao 接口的代理對象
IUserDao userDao = session.getMapper(IUserDao.class);
//6.使用代理對象執行查詢所有方法
List<User> users = userDao.findAll();
for(User user : users) {
System.out.println(user);
}
//7.釋放資源
session.close();
in.close();
智能推薦
Mybatis學習筆記(一)
1、環境描述 java版本:1.8 開發工具:idea 2018版 mysql:8.x版本 mybatis:3.4.6版本 lombok mybatis 在開發中最為關鍵的是其 SqlSession 的使用和 mapper 文件的配置。 本文將圍繞它來介紹Mybatis的入門案例。 2、項目結構 2.1 配置文件 在 idea 中,使用maven項目。在 resources 資源文件夾中創建文件夾...
MyBatis學習筆記(一)
一、MyBatis介紹 MyBatis 是一款優秀的持久層框架,它支持定制化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以使用簡單的 XML 或注解來配置和映射原生信息,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記...
Mybatis學習筆記一
Mybatis學習筆記一 概述 Mybatis 是一個優秀的基于 java 的持久層框架,它內部封裝了 jdbc,使開發者只需要關注 sql 語句本身,而不需要花費精力去處理加載驅動、創建連接、創建 statement 等繁雜的過程。 mybatis 通過 xml 或注解的方式將要執行的各種 statement 配置起來,并通過 java 對象和 statement 中sql 的動態參數進行映射生...
MyBatis學習筆記(一)
1 、對原生態jdbc程序中問題總結 jdbc編程步驟: 1、 加載數據庫驅動 2、 創建并獲取數據庫鏈接 3、 創建jdbc statement對象 4、 設置sql語句 5、 設置sql語句中的參數(使用preparedStatement) 6、 通過statement執行sql并獲取結果 7、 對sql執行結...
Mybatis學習筆記(一)
嗷嗷 環境統一 JDK1.8 Mysql5.7 maven3.6.1 簡介 什么是mybatis MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,并且改名為MyBatis 。2013年11月遷移到Github。 iBATIS一詞來源于“internet”和...
猜你喜歡
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...