前言
從今天開始學習 Mybatis, 沖鴨.
參考資料
環(huán)境
- jdk 1.8
- mysql 8.0+
- maven 4.0
- IDEA
Mybatis 簡介
什么是 MyBatis?
MyBatis 是一款優(yōu)秀的持久層框架昭抒,它支持自定義 SQL钱床、存儲過程以及高級映射汽抚。MyBatis 免除了幾乎所有的 JDBC 代碼以及設置參數和獲取結果集的工作掏缎。MyBatis 可以通過簡單的 XML 或注解來配置和映射原始類型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 對象)為數據庫中的記錄钞馁。
三層架構
- 表現(xiàn)層: 展示數據
- 業(yè)務層: 處理業(yè)務需求
- 持久層: 與數據庫交互
所以 MyBatis 是與數據庫打交道的框架.
為什么要學 Mybatis?
- 簡單易學:本身就很小且簡單阐滩。沒有任何第三方依賴二打,最簡單安裝只要兩個jar文件+配置幾個sql映射文件易于學習,易于使用掂榔,通過文檔和源代碼继效,可以比較完全的掌握它的設計思路和實現(xiàn)。
- 靈活:mybatis不會對應用程序或者數據庫的現(xiàn)有設計強加任何影響装获。 sql寫在xml里瑞信,便于統(tǒng)一管理和優(yōu)化。通過sql語句可以滿足操作數據庫的所有需求穴豫。
- 解除sql與程序代碼的耦合:通過提供DAO層凡简,將業(yè)務邏輯和數據訪問邏輯分離,使系統(tǒng)的設計更清晰精肃,更易維護秤涩,更易單元測試。sql和代碼的分離司抱,提高了可維護性溉仑。
- 提供映射標簽,支持對象與數據庫的orm字段關系映射
- 提供對象關系映射標簽状植,支持對象關系組建維護
- 提供xml標簽浊竟,支持編寫動態(tài)sql。
入門程序
0. 準備工作
0.1 目錄結構
0.2 建立數據庫
1. 創(chuàng)建一個 maven 項目
1.1 引入 pom.xml 依賴
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
2. 寫工具類 MybatisUtils.java
2.1 從 XML 中構建 SqlSessionFactory
因為這些代碼都是固定的,所以將其封裝為工具類.
2.1.1 使用 mybatis 獲取 sqlSessionFactory 對象
每個基于 MyBatis 的應用都是以一個 SqlSessionFactory 的實例為核心的津畸。SqlSessionFactory 的實例可以通過 SqlSessionFactoryBuilder 獲得振定。而 SqlSessionFactoryBuilder 則可以從 XML 配置文件或一個預先配置的 Configuration 實例來構建出 SqlSessionFactory 實例。
com.waciao.utils.MybatisUtils
private static SqlSessionFactory sqlSessionFactory;
static {
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
2.1.2 從 SqlSessionFactory 中獲取 SqlSession
既然有了 SqlSessionFactory肉拓,顧名思義后频,我們可以從中獲得 SqlSession 的實例例。SqlSession 提供了在數據庫執(zhí)行 SQL 命令所需的所有方法暖途。
com.waciao.utils.MybatisUtils
public static SqlSession getSqlSession() {
return sqlSessionFactory.openSession();
}
2.1.3 完整的 MybatisUtils
package com.waciao.utils;
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;
/**
* @Author: Waciao
* @Date: 2020/3/17 11:20
* @Version: 1.0
* @Github: https://github.com/byojiaoxianz7
*/
// 工具類 sqlSessionFactory --> sqlSession
// 這一段代碼屬于固定格式, 所以封裝成工具類
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
/**
* 1. 使用mybatis獲取sqlSessionFactory對象
*/
String resource = "mybatis-config.xml"; // resource下的mybatis-config.xml
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 2. 從 SqlSessionFactory 中獲取 SqlSession
* 既然有了 SqlSessionFactory卑惜,顧名思義,我們可以從中獲得 SqlSession 的實例驻售。
* SqlSession 提供了在數據庫執(zhí)行 SQL 命令所需的所有方法露久。
*
* @return
*/
public static SqlSession getSqlSession() {
return sqlSessionFactory.openSession();
}
}
3. 寫 mybatis-config.xml, 配置數據庫連接信息
XML 配置文件中包含了對 MyBatis 系統(tǒng)的核心設置,包括獲取數據庫連接實例的數據源(DataSource)以及決定事務作用域和控制方式的事務管理器(TransactionManager)欺栗。
<?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>
<!--環(huán)境 默認選擇development環(huán)境-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?userSSL=true&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="12345678"/>
</dataSource>
</environment>
</environments>
</configuration>
4. 寫實體類 User.java
構造
- 有參
- 無參
- Getter and Setter
- toString
package com.waciao.pojo;
/**
* @Author: Waciao
* @Date: 2020/3/17 11:32
* @Version: 1.0
* @Github: https://github.com/byojiaoxianz7
*/
// 實體類
public class User {
private Integer id;
private String name;
private String pwd;
public User() {
}
public User(Integer id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
'}';
}
}
5. 寫接口 UserMapper.java
package com.waciao.dao;
import com.waciao.pojo.User;
import java.util.List;
/**
* @Author: Waciao
* @Date: 2020/3/17 11:33
* @Version: 1.0
* @Github: https://github.com/byojiaoxianz7
*/
public interface UserMapper {
/**
* 獲取所有用戶
* @return
*/
List<User> getUserList();
}
6. 寫實現(xiàn)類 Usermapper.xml
在 namespace
com.waciao.dao.UserMapper
中定義了一個名為getUserList
的映射語句,這樣就可以用全限定名com.waciao.dao.UserMapper.getUserList
來調用 sql 語句了.
id 對應 UserMapper 里的方法名 resultType 里填執(zhí)行 sql 語句之后返回的結果集,在 UserMapper 中可以看到, getUserList 方法返回的是一個 List<User> ,所以填集合里泛型的東西,就是 User.
<?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.waciao.dao.UserMapper">
<select id="getUserList" resultType="com.waciao.pojo.User">
SELECT * FROM mybatis.user;
</select>
</mapper>
到目前為止,所有的文件都寫完了,接下來就是測試一下能不能成功跑起來
7. 寫測試類
7.1 獲得 sqlSession 對象
調用工具類即可
SqlSession sqlSession = MybatisUtils.getSqlSession();
7.2 執(zhí)行 sql
存在幾個問題
怎么執(zhí)行 sql?
首先需要拿到 sql
怎么拿到 sql?
要么從 UserMapper 里拿,要么從 xml 里拿,因為是面向接口編程,所以直接從UserMapper 拿就行了
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
get到接口之后返回,就可以使用接口里的方法了
List<User> userList = mapper.getUserList();
返回結果
for (User user : userList) {
System.out.println(user);
}
7.3 關閉 sqlSession
sqlSession.close();
7.4 完整的測試類代碼
package com.waciao.dao;
import com.waciao.pojo.User;
import com.waciao.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
/**
* @Author: Waciao
* @Date: 2020/3/17 11:45
* @Version: 1.0
* @Github: https://github.com/byojiaoxianz7
*/
public class UserMapperTest {
@Test
public void test() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.getUserList();
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();
}
}
8. 錯誤排查
運行程序之后會報兩個錯誤
8.1 org.apache.ibatis.binding.BindingException: Type interface com.waciao.dao.UserMapper is not known to the MapperRegistry.
報這個錯誤是因為在寫 mybatis-config.xml 的時候沒有注冊 mapper
需要配置才行
<mappers>
<mapper resource="com/waciao/dao/UserMapper.xml" />
</mappers>
8.1.1 完整的mybatis-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>
<!--環(huán)境 默認選擇development環(huán)境-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?userSSL=true&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="12345678"/>
</dataSource>
</environment>
</environments>
<!--每一個Mapper.xml都需要在mybatis核心-->
<mappers>
<mapper resource="com/waciao/dao/UserMapper.xml" />
</mappers>
</configuration>
8.2 java.lang.ExceptionInInitializerError,Caused by: org.apache.ibatis.exceptions.PersistenceException
第二個錯誤: 在 target/test-classes/com/waciao/dao
里沒有找到 UserMapper.xml
原因在 maven 中, 因為它的約定大于配置, 寫文件配置時可能無法被導出或生效
maven 中配置文件應該放在 resources 目錄下,但是這個程序放在了 java 文件下,所以沒有找到 xml 配置文件
所以需要在build中配置resources,來防止資源導出失敗的問題
解決方案:
在 ```pom.xml```文件中引入即可
<!--在build中配置resources毫痕,來防止我們資源導出失敗的問題-->
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
配置之后可能還是會報錯, 那么可以這也解決:
- 把 filtering 改為 false
- 在
mybatis-config.xml
中的 url 把 useSSL 改為 false
總結
跟著狂神老師思路一步一步走下來,基本上沒遇到什么問題,結果還是比較令我滿意.
多看官方文檔
_