1. 程式人生 > >MyBatis學習(一)--入門

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

  1. 右鍵工程–開啟properties
  2. 找到Java Build Path
  3. 在選項卡Libraries–> Add Libraryeclips中的JUnit
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還可以新建JUnit Test Case,由於不常用,此處不做說明。

2.1準備MyBatis環境

1、新建工程,普通工程或web工程均可。(文章使用web工程)

匯入架包到 lib資料夾中
mybatis-xxx.jar
mysql-connector-java-xxx.jar
新建web工程

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
建立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下檔案的的方法麻煩回覆一下

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">

<!-- 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時,請按照順序寫標籤,下圖是官方文件裡給出文件結構
config.xml文件結構

5、查詢資料

從SqlSessionFactory中獲取SqlSession,為了使用方便我們把獲取SqlSession的操作封裝在一個類中。
mybatis.util

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();
}

輸出結果
輸出結果