1.Mybatis環境搭建及三種查詢方式(eclipse-jar方式)

什麼是框架

  1. 框架:軟件的半成品.未解決問題制定的一套約束,在提供功能基礎上進行擴充.
  2. 框架中一些不能被封裝的代碼(變量),需要使用框架者新建一個xml 文件,在文件中添加變量內容.
    • 需要建立特定位置和特定名稱的配置文件.
    • 需要使用 xml 解析技術和反射技術.
  3. 常用概念
    • 類庫:提供的類沒有封裝一定邏輯.
      舉例:類庫就是名言警句,寫作文時引入名言警句
    • 框架:區別與類庫,裏面有一些約束.
      舉例:框架是填空題

MyBatis 簡介

  1. Mybatis 開源免費框架.原名叫iBatis,2010在googlecode,2013年遷移到 github

作用: 數據訪問層框架
+ 底層是對 JDBC 的封裝
mybatis 優點之一
+ 使用mybatis時不需要編寫實現類,只需要寫需要執行的sql命令

環境搭建

  1. 導入 jar
    在這裏插入圖片描述

  2. 在 src下新建全局配置文件(編寫 JDBC 四個變量) 建立在src下邊是因爲會轉爲classes文件,這樣可以輕鬆通過classpath:找到它

  • 沒有名稱和地址要求
  • 在全局配置文件中引入 DTD 或 schema
    • 如果導入dtd後沒有提示,Window–>preference–>XML–>XMlcatalog–>add 按鈕

在這裏插入圖片描述

  1. 全局配置文件內容
<?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>
	<!-- default 引用 environment 的 id,當前所使用的環境 --> 
    <!-- 和spring整合後 environments配置將廢除 -->
	<environments default="default"> 
	<!-- 聲明可以使用的環境 --> 
    <!-- environments下邊又有多個environment,可以有多個環境(測試,開發...),如需更改,直接更改default		的值即可 -->
	<environment id="default"> 
        <!-- 使用原生 JDBC 事務 --> 
        <transactionManager type="JDBC"></transactionManager> 
        <!-- 數據庫連接池 -->
        <dataSource type="POOLED"> 
            <property name="driver" value="com.mysql.jdbc.Driver"/> 
            <property name="url" value="jdbc:mysql://localhost:3306/ssm"/> 
            <property name="username" value="root"/> 
            <property name="password" value="123456"/> 
        </dataSource> 
    </environment> 
    </environments>
    <!-- 加載映射文件 -->
	<mappers> 
        <mapper resource="com/buendia/mapper/FlowerMapper.xml"/> 
    </mappers> 
</configuration>
	
  1. 新建以 mapper 結尾的包,在包下新建:實體類名+Mapper.xml
    • 文件作用:編寫需要執行的 SQL 命令
    • 把 xml 文件理解成__實現類__
    • 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">
<!-- namesapce:理解成實現類的全路徑(包名+類名) --> 
<mapper namespace="a.b" >
<!-- 	id:方法名 
		parameterType:定義參數類型 
		resultType:返回值類型
		如果方法返回值是 list,在 resultType 中寫 List 的泛型
		因爲 mybatis 對 jdbc 封裝,一行一行讀取數據 --> 
    <select id="selAll" resultType="com.bjsxt.pojo.Flower"> 
        select * from flower 
    </select> 
</mapper>
  1. 測試結果(只有在單獨使用 mybatis 時使用,最後 ssm 整合時下面代碼不需要編寫)
	main...
		InputStream is = null;
		SqlSession session = null;
		try {
				// 加載配置文件
			is = Resources.getResourceAsStream("mybatis.xml");
				// 使用了工廠設計模式(拿到工廠類),build設計模式
			SqlSessionFactory factory = 
			new SqlSessionFactoryBuilder().build(is);
				// 生產出Session
			session = factory.openSession();

				// 拿到查詢結果,注意,參數爲FlowerMapper.xml文件中的類全路徑名
				// +方法名(因爲此方法就是用來執行查詢的)
			List<Flower> flowers =
			session.selectList
			("com.buendia.dao.impl.FlowerDaoImpl.selAll");
			flowers.forEach(System.out::println);
			....

環境搭建詳解

  1. 全局配置文件中內容
    • type 屬性可取的值
      • JDBC,事務管理使用 JDBC 原生事務管理方式(因爲mybatis底層就是JDBC封裝),不用spring時值爲JDBC即可
      • MANAGED 把事務管理轉交給其他容器.原生 JDBC 事務setAutoMapping(false);如果type是這個值,我們就可以把事務管理交給spring處理
    • 的type 屬性(3個值)
      • POOLED 使用數據庫連接池
      • UNPOOLED 不使用數據庫連接池,和直接使用 JDBC 一樣
      • JNDI:java 命名目錄接口技術(用java去調用其它技術)

數據庫連接池

  1. 在內存中開闢一塊空間,存放多個數據庫連接對象
  2. JDBC Tomcat Pool:直接由 tomcat 產生數據庫連接池(context文件)
  3. 圖示
  • active 狀態:當前連接對象被應用程序使用中
  • Idle 空閒狀態:等待應用程序使用

在這裏插入圖片描述

  1. 使用數據庫連接池的目的
  • 在高頻率訪問數據庫時,使用數據庫連接池可以降低服務器系統壓力,提升程序運行效率
    • 小型項目不適用數據庫連接池
  1. 實現 JDBCtomcatPool 的步驟
  • 在 web 項目的 META-INF 中存放 context.xml,在 context.xml 編寫數據庫連接池相關屬性
<?xml version="1.0" encoding="UTF-8"?> 
<Context> 
	<Resource 
		driverClassName="com.mysql.jdbc.Driver"
		url="jdbc:mysql://localhost:3306/ssm" 
		username="root"
		password="smallming" 
		maxActive="50" 
		maxIdle="20" 
		name="test" 
		auth="Container" 
		maxWait="10000" 
		type="javax.sql.DataSource"
	/> 
</Context>
  • 把項目發佈到tomcat中,數據庫連接池產生了
  1. 可以在 java 中使用 jndi 獲取數據庫連接池中對象
    • Context:上下文接口.context.xml 文件對象類型
    • 代碼(主要):
...
//以下是JNDI代碼
Context cxt = new InitialContext(); 
DataSource ds = (DataSource) cxt.lookup("java:comp/env/test"); 
Connection conn = ds.getConnection();
...
  • 當關閉連接對象時,把連接對象__歸還__給數據庫連接池,把狀態改變成 Idle

三種查詢方式

  1. selectList() 返回值爲 List<resultType 屬性控制>
  • 適用於查詢結果都需要遍歷的需求
List<Flower> list = session.selectList("a.b.selAll"); 
for (Flower flower : list) { 
	System.out.println(flower.toString());
}
  1. selectOne() 返回值 Object
  • 適用於返回結果只是變量或一行數據時
int count = session.selectOne("a.b.selById"); 
System.out.println(count);
  1. selectMap() 返回值 Map
  • 適用於需要在查詢結果中通過某列的值取到這行數據的需求
  • Map<key,resultType 控制>
Map<Object, Object> map = session.selectMap("a.b.c", "name123"); 
System.out.println(map);

要點

  • mybatis的autoMapping特性,查詢時mybatis是怎麼知道每一列怎麼對應的?通過自動映射機制,根據setXxx(),自動找到數據庫中對應的列(3.2之前版本),現在不寫set,get方法也能找到(直接通過反射找屬性)
    因爲是反射,所以實體屬性名必須要和數據庫列名相同(不同也可以,在mapper.xml中寫查詢語句時給不同的列加上別名)

  • mybatis.xml全局配置文件中的mappers標籤的mapper子標籤中的resource屬性值爲路徑,用"/“分割而不是”."

  • 在上邊的環境搭建部分-5中,通過Resource.getResourceAsStream(“mybatis.xml”);來加載全局配置文件(mybatis默認不自動加載配置文件), 其中默認從src下找

  • 在數據訪問層處理異常和在控制器中處理異常,而service中只拋出異常(spring原因),並且service實現類的異常還是要和實現的接口拋出的異常保持一致

不是"."

  • 在上邊的環境搭建部分-5中,通過Resource.getResourceAsStream(“mybatis.xml”);來加載全局配置文件(mybatis默認不自動加載配置文件), 其中默認從src下找

  • 在數據訪問層處理異常和在控制器中處理異常,而service中只拋出異常(spring原因),並且service實現類的異常還是要和實現的接口拋出的異常保持一致

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章