MyBatis學習(一)--入門
寫在前面
這是博主第一次嘗試寫這種類似總結,文筆也不好見諒,由於總結能力很差所以本文基本是參照孤傲蒼狼的部落格,在基礎上新增和修改了一些內容
孤傲蒼狼的部落格:https://www.cnblogs.com/xdp-gacl/category/655890.html
程式碼中會有很多重要的註釋,請不要忽略
1、介紹
MyBatis是一個款優秀的持久層框架,它支援定製化的SQL、儲存過程以及高階對映。MyBatis封裝了幾乎所有的JDBC程式碼和手動設定引數以及獲取結果集。MyBatis可以使用簡單的XML或註解來配置和對映原生資訊,將介面和POJO物件(javaBean)對映成資料庫中的記錄。
2、快速入門
2.0 準備JUnit
文章中所有測試都使用JUnit5測試,此處做一個簡單說明。
JUnit介紹
JUnit是一個Java的單元測試框架。(單元測試後期學習後會寫一篇單獨總結)
使用JUnit
1、下載JUnit架包,匯入到工程中。
注:Eclipse中自帶有JUnit
- 右鍵工程–開啟properties
- 找到Java Build Path
- 在選項卡Libraries–> Add Library
2、在需要測試的方法上加上註解@Test
import org.junit.jupiter.api.Test;
/**
*Test註解的方法必須無返回值,無引數
**/
public class TestDemo {
@Test
public void print() {
System.out.println("hello world!");
}
}
3、選中方法右鍵 Run As --> JUnit Test
注:JUnit還可以新建JUnit Test Case,由於不常用,此處不做說明。
2.1準備MyBatis環境
1、新建工程,普通工程或web工程均可。(文章使用web工程)
-
匯入架包到
lib
資料夾中 - mybatis-xxx.jar
-
mysql-connector-java-xxx.jar
2、準備資料庫(本文使用mysql)
SQL
CREATE DATABASE mybatis;
USE mybatis;
CREATE TABLE `user`(
u_id INT PRIMARY KEY AUTO_INCREMENT,
u_account VARCHAR(50),
u_password VARCHAR(50)
);
INSERT INTO `user`(u_name,u_password) VALUES
("acc_1",123456),
("acc_2",654321);
2.2 使用MyBatis查詢資料
MyBatis封裝了JDBC幾乎所有的操作,使用SqlSession來執行,所以先使用SqlSessionFactory獲取SqlSession。
1、給SqlSessionFactoy配置conifg.xml
在src目錄下建立config.xml
- 開頭引入的dtd約束檔案不能少
- config.xml檔名隨意,用SqlSessionFactory獲取時可以指定
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED"> <!-- 使用pooled連線池 -->
<!--資料庫連線配置-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
</configuration>
2、定義和資料庫對應的Bean物件
package com.project.bean;
public class UserBean {
//務必和資料庫中的列名稱對應
int u_id;
String u_account;
String u_password;
//提供無參構造
//提供getter、setter
//提供一個toString,方便列印測試
}
3、定義操作user表的SQL對映檔案
新建一個包,在包中新建UserMapper.xml
xml放在包下是方便在不啟動Tomact的情況下讀取,如果有方便不啟動Tomcat讀取WebContent下檔案的的方法麻煩回覆一下
<?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">
<!-- namespac名稱空間,用於外部指定這個mapper
任何名稱都可以,這裡使用類似類全路徑的名稱:
1、官方推薦這樣做
2、後期使用介面時方便
-->
<mapper namespace="com.project.mapper.UserBeanMapper">
<!-- 注意這裡resultType中的值是一個設定的別名,在config中設定 -->
<select id="getUser" resultType="UserBean">
SELECT * FROM user;
</select>
</mapper>
4、在config.cml中註冊UserMapper.xml
不知道讀者有沒有注意到UserMapper中提到的resultType的別名,這是為了簡化所以設定了一個別名,如果不設定可以直接寫bean物件的類全路徑。
為什麼返回的型別是一個bean物件呢?
如果你使用過JDBC,你肯定在有從ResultSet把屬性一個個取出來set到bean物件中的經歷,很顯然這裡MyBatis幫我們做了這個麻煩事兒。
<?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>
<!-- 設定別名 [別名,類全路徑]-->
<typeAliases>
<typeAlias alias="UserBean" type="com.project.bean.UserBean" />
</typeAliases>
<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://localhost:3306/mybatis" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<mappers>
<!-- mapper.xml路徑 -->
<mapper resource="com/project/xml/UserMapper.xml" />
</mappers>
</configuration>
注意:在編寫config.xml時,請按照順序寫標籤,下圖是官方文件裡給出文件結構
5、查詢資料
從SqlSessionFactory中獲取SqlSession,為了使用方便我們把獲取SqlSession的操作封裝在一個類中。
package com.project.mybatis.util;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
/*
* 在獲取Factory時使用單例,這個物件建立很消耗資源,
* 而我們在使用時SqlSession時可能多次頻繁獲取,所以這個工廠應該一直存在。
* 官方文件在生命週期中也提到,沒有任何理由對這個工廠物件進行清除、重建,所以不要重複建立多次。
*/
public class MyBatisUtil {
private static SqlSessionFactory factory = null;
public static SqlSessionFactory getSqlSessionFactory() {
if (factory == null) {
String path = "config.xml";
try {
// Resources是官方封裝的工具類,導包時注意 --> org.apache.ibatis.io.Resources
InputStream in = Resources.getResourceAsStream(path);
factory = new SqlSessionFactoryBuilder().build(in);
} catch (IOException e) {
e.printStackTrace();
}
}
return factory;
}
public static SqlSession getSqlSession() {
return getSqlSessionFactory().openSession();
}
public static SqlSession getSqlSession(boolean aotuCommit) {
return getSqlSessionFactory().openSession(aotuCommit);
}
}
編寫一個測試類查詢資料
package com.project.mian;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.junit.jupiter.api.Test;
import com.project.bean.UserBean;
import com.project.mybatis.util.MyBatisUtil;
public class MainClass {
//注意這裡沒有使用main,而是使用了前面提到的JUnit。也可以換成main來測試
@Test
public void test() {
SqlSession session = MyBatisUtil.getSqlSession();
try {
List<UserBean> list = session.selectList("com.project.mapper.UserBeanMapper.getUser");
for (UserBean user : list) {
System.out.println(user);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
session.close();
}
}
}
注意:這段程式碼並不會強制捕獲異常,但是任應按照這種格式編寫,確保SqlSession每次執行都能關閉。這也是官方推薦的寫法。
SqlSession session = sqlSessionFactory.openSession();
try {
// do work
} finally {
session.close();
}
輸出結果: