什麼是框架
- 框架:軟件的半成品.未解決問題制定的一套約束,在提供功能基礎上進行擴充.
- 框架中一些不能被封裝的代碼(變量),需要使用框架者新建一個xml 文件,在文件中添加變量內容.
- 需要建立特定位置和特定名稱的配置文件.
- 需要使用 xml 解析技術和反射技術.
- 常用概念
- 類庫:提供的類沒有封裝一定邏輯.
舉例:類庫就是名言警句,寫作文時引入名言警句 - 框架:區別與類庫,裏面有一些約束.
舉例:框架是填空題
- 類庫:提供的類沒有封裝一定邏輯.
MyBatis 簡介
- Mybatis 開源免費框架.原名叫iBatis,2010在googlecode,2013年遷移到 github
作用: 數據訪問層框架
+ 底層是對 JDBC 的封裝
mybatis 優點之一
+ 使用mybatis時不需要編寫實現類,只需要寫需要執行的sql命令
環境搭建
-
導入 jar
-
在 src下新建全局配置文件(編寫 JDBC 四個變量) 建立在src下邊是因爲會轉爲classes文件,這樣可以輕鬆通過classpath:找到它
- 沒有名稱和地址要求
- 在全局配置文件中引入 DTD 或 schema
- 如果導入dtd後沒有提示,Window–>preference–>XML–>XMlcatalog–>add 按鈕
- 全局配置文件內容
<?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>
- 新建以 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>
- 測試結果(只有在單獨使用 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);
....
環境搭建詳解
- 全局配置文件中內容
- type 屬性可取的值
- JDBC,事務管理使用 JDBC 原生事務管理方式(因爲mybatis底層就是JDBC封裝),不用spring時值爲JDBC即可
- MANAGED 把事務管理轉交給其他容器.原生 JDBC 事務setAutoMapping(false);如果type是這個值,我們就可以把事務管理交給spring處理
- 的type 屬性(3個值)
- POOLED 使用數據庫連接池
- UNPOOLED 不使用數據庫連接池,和直接使用 JDBC 一樣
- JNDI:java 命名目錄接口技術(用java去調用其它技術)
- type 屬性可取的值
數據庫連接池
- 在內存中開闢一塊空間,存放多個數據庫連接對象
- JDBC Tomcat Pool:直接由 tomcat 產生數據庫連接池(context文件)
- 圖示
- active 狀態:當前連接對象被應用程序使用中
- Idle 空閒狀態:等待應用程序使用
- 使用數據庫連接池的目的
- 在高頻率訪問數據庫時,使用數據庫連接池可以降低服務器系統壓力,提升程序運行效率
- 小型項目不適用數據庫連接池
- 實現 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中,數據庫連接池產生了
- 可以在 java 中使用 jndi 獲取數據庫連接池中對象
- Context:上下文接口.context.xml 文件對象類型
- 代碼(主要):
...
//以下是JNDI代碼
Context cxt = new InitialContext();
DataSource ds = (DataSource) cxt.lookup("java:comp/env/test");
Connection conn = ds.getConnection();
...
- 當關閉連接對象時,把連接對象__歸還__給數據庫連接池,把狀態改變成 Idle
三種查詢方式
- selectList() 返回值爲 List<resultType 屬性控制>
- 適用於查詢結果都需要遍歷的需求
List<Flower> list = session.selectList("a.b.selAll");
for (Flower flower : list) {
System.out.println(flower.toString());
}
- selectOne() 返回值 Object
- 適用於返回結果只是變量或一行數據時
int count = session.selectOne("a.b.selById");
System.out.println(count);
- 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實現類的異常還是要和實現的接口拋出的異常保持一致