這篇文章來自我的博客
正文之前
在使用 SSM 對之前所做的小項(xiàng)目重構(gòu)了之后,發(fā)現(xiàn)需要寫幾篇文章來總結(jié)一下各個部件的用法幽崩,先寫幾篇關(guān)于 Mybatis 的文章,正好補(bǔ)缺補(bǔ)漏順便總結(jié)一下
主要內(nèi)容:
- Mybatis 簡介
- 測試項(xiàng)目構(gòu)建
- 配置文件
- 增刪改查
正文
1. Mybatis 簡介
引用官網(wǎng)的介紹:
MyBatis 是一款優(yōu)秀的持久層框架鳞绕,它支持定制化 SQL饥努、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設(shè)置參數(shù)以及獲取結(jié)果集颗胡。MyBatis 可以使用簡單的 XML 或注解來配置和映射原生信息毫深,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數(shù)據(jù)庫中的記錄。
總而言之毒姨,是個框架就對了
2. 測試項(xiàng)目構(gòu)建
要使用 Mybatis哑蔫,我們需要先導(dǎo)入兩個包:
mybatis-3.4.6
mysql-connector-java-5.1.46
我們先創(chuàng)建所要用到的包和類:
Product 是實(shí)體類,對應(yīng)數(shù)據(jù)庫中的表
db.properties 是外部配置數(shù)據(jù)庫信息的文件
SqlMapConfig 是 Mybatis 的配置文件(文件名不固定)
ProductMapper.xml 是對應(yīng)的映射文件
ProductTest 是測試類
lib 包中的其他文件是日志文件和單元測試文件
使用到的數(shù)據(jù)庫中的表為 product 表:
創(chuàng)建實(shí)體類 Product :
3. 配置文件
關(guān)于 Mybatis 的信息都在 SqlMapConfig.xml
文件中
1. 配置環(huán)境
Mybatis 可以對應(yīng)多種環(huán)境弧呐,這在配置文件中定義:
<?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)境闸迷,可以有多個環(huán)境來對應(yīng)多種數(shù)據(jù)庫,至少要有一個環(huán)境 id 與此對應(yīng) -->
<environments default="mysql">
<!-- 這里的環(huán)境 id俘枫,就是具體某個數(shù)據(jù)庫的 id -->
<environment id="mysql">
<transactionManager type=""></transactionManager>
<dataSource type=""></dataSource>
</environment>
<!--
<environment id="oracle">
<transactionManager type=""></transactionManager>
<dataSource type=""></dataSource>
</environment>
-->
</environments>
</configuration>
2. 事務(wù)管理和數(shù)據(jù)源
<transactionManager type="JDBC"/>
<dataSource type="POOLED"></dataSource>
事務(wù)管理有兩種:JDBC 和 MANAGED腥沽,我們就關(guān)注 JDBC,它其實(shí)就是使用了 JDBC 的設(shè)置來進(jìn)行管理鸠蚪、
數(shù)據(jù)源有三種:
UNPOOLED:在請求時打開和關(guān)閉連接今阳,如果對數(shù)據(jù)庫的使用較為頻繁,則不適用此方式茅信,太浪費(fèi)時間
POOLED:連接池盾舌,最常用的方式,一開始創(chuàng)建一定數(shù)量的連接蘸鲸,即用即取妖谴,用完歸還
JNDI:為了能在如 EJB 或應(yīng)用服務(wù)器這類容器中使用
3. 數(shù)據(jù)庫信息
有關(guān)數(shù)據(jù)庫的信息可以直接寫在配置文件里面:
不過,通常的做法是在外部創(chuàng)建一個 db.properties
文件:
然后用外部配置來替換這些屬性的值棚贾,只是引用外部配置文件需要在配置數(shù)據(jù)源之前進(jìn)行:
關(guān)于 Mybatis 的系統(tǒng)配置就先到這窖维,接下來是實(shí)體類相關(guān)的一個映射文件 ProductMapper.xml 的配置
4. 映射文件
在實(shí)體類的映射文件中寫明了你要進(jìn)行什么操作:
接下來解釋這個文件:
mapper 映射器:需要定義命名空間榆综,因?yàn)楹竺嬲{(diào)用的時候要用到
select 元素:對應(yīng) SQL 中的查詢操作,id 指的是這個查詢操作的名稱铸史,調(diào)用它的時候需要使用這個 id鼻疮, resultType 指的是返回類型,我這里查詢出的每一條記錄都指定為 Product 類型琳轿,相類似的還有 update判沟、insert 和 delete 元素,對應(yīng)相關(guān)的的 SQL 操作
5. 加載映射文件
把映射文件寫完了之后崭篡,我們需要告訴 Mybatis 去哪里找這些 SQL 語句挪哄,所以我們在 Mybatis 配置文件里寫出路徑:
<mappers>
<mapper resource="mapper/ProductMapper.xml"/>
</mappers>
4. 增刪改查
首先我們先說一下 Mybatis 是怎么用的:
Mybatis 中有一個工具類叫 Resources,使用它來加載你的配置文件
SqlSessionFactoryBuilder 根據(jù)配置的 XML 文件(我們這里就是指 SqlMapConfig.xml)中的 <configuration> 元素來創(chuàng)建一個 SqlSessionFactory 實(shí)例
Mybatis 應(yīng)用是以一個 SqlSessionFactory 的實(shí)例為中心來展開工作的
//配置文件的位置是基于我這個測試項(xiàng)目來寫的
String resource = "config/SqlMapConfig";
//輸入流
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
然后得到 SqlSession 的實(shí)例琉闪,就可以用來執(zhí)行 SQL 語句了:
SqlSession sqlSession = sqlSessionFactory.openSession();
1. 增加記錄
我們先在映射文件中寫一個增加記錄的操作:
<insert id="insertProduct" parameterType="bean.Product">
INSERT INTO product VALUES
(#{id}, #{barcode}, #{name}, #{units}, #{purchasePrice}, #{salePrice}, #{inventory})
</insert>
這里的 #{} 是一個占位符迹炼,就相當(dāng)于 SQL 中的 ? 符號,添加的參數(shù)類型是 Product 類型的
然后我們在測試類中進(jìn)行添加操作:
這里的 insert 操作的第一個參數(shù)就是用來定位 SQL 語句的颠毙,它是命名方式是映射文件的命名空間.SQL語句的 ID斯入,然后這第二個參數(shù)就是我添加進(jìn)去的記錄,在最后一定要進(jìn)行提交蛀蜜,否則是無效的刻两,進(jìn)行測試:
這時候查看表中的所有記錄就會發(fā)現(xiàn)剛才的操作是成功的:
2. 刪除記錄
<delete id="deleteProduct" parameterType="String">
DELETE FROM product
WHERE id = #{id}
</delete>
根據(jù) ID 來刪除商品,這里的參數(shù)類型是 String
@Test
public void test() throws IOException{
String resource = "config/SqlMapConfig";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
sqlSession.delete("ProductMapper.deleteProduct", "123");
sqlSession.commit();
}
運(yùn)行之后就能看到我們第一步添加進(jìn)去的商品被刪除了:
3. 修改記錄
我們也是根據(jù)商品 ID 來修改記錄滴某,只不過參數(shù)類型是 Product:
<update id="updateProduct" parameterType="bean.Product">
UPDATE product SET
barcode = #{barcode},
name = #{name},
units = #{units},
purchasePrice = #{purchasePrice},
salePrice = #{salePrice},
inventory = #{inventory}
WHERE id = #{id}
</update>
在測試中磅摹,我們創(chuàng)建一個商品的實(shí)例,然后用這個實(shí)例來替換掉數(shù)據(jù)庫中的相對應(yīng)的記錄:
Product product = new Product("1F01DC70F9A64B2CBB52B92C41FBCC9E", "123",
"T-shirt", "piece", "50", "100", "10");
sqlSession.update("ProductMapper.updateProduct", product);
sqlSession.commit();
然后就會發(fā)現(xiàn)表中的第一條記錄已被更改:
4. 查詢記錄
我們用一個列表來存放表中的所有數(shù)據(jù)霎奢,這里沒有用到參數(shù)户誓,只要定義返回類型就可以了:
<select id="findAllProducts" resultType="bean.Product">
SELECT * FROM product
</select>
這里不需要 commit,我們并沒有提交至數(shù)據(jù)庫中幕侠,只是查詢:
List<Product> list = sqlSession.selectList("ProductMapper.findAllProducts");
for (Product p :
list) {
System.out.println(p);
}
然后就能看到 5 條記錄:
總結(jié)
若想要成功地使用 Mybatis厅克,總共有三個要點(diǎn):
1. SqlMapConfig.xml(Mybatis 配置文件)
這是 Mybatis 的核心,這里面配置了數(shù)據(jù)庫的基本信息以及映射文件的加載信息等
2. 實(shí)體類橙依、接口
也就是 POJO(Plain Old Java Objects,普通的 Java對象),我們這篇文章中的 Product 實(shí)體類硕旗,關(guān)于接口窗骑,我們這一篇文章中沒有說明,接口是對應(yīng)映射文件存在的漆枚,接口的命名和映射文件同名创译,這個在之后將 Mybatis 逆向工程的時候會說到
3. 映射文件
映射文件就是我們上面寫到的 ProductMapper.xml,它的作用不僅僅是帶有 SQL 語句墙基,還能將 POJO 映射成為數(shù)據(jù)庫中的記錄软族,所以我們剛才才能夠使用占位符進(jìn)行增刪改查操作或?qū)⒉樵兘Y(jié)果映射為POJO