MyBatis
是一個半ORM的資料庫持久化框架,底層還是JDBC,所以單用Mybatis時,事務需要手動提交
歷史擴展:它本是apache的一個開源專案iBatis,所以很多jar的名字還是iBatis
ORM:物件關系映射(Object Relational Mapping),一種為了解決面向物件與關系資料庫存在的互不匹配的現象的技術;
操作資料庫關系方式有很多種,常用的是這兩種:
1、半映射:把SQL寫在組態檔中,通過不同SQL中完成物件物體和資料庫關系相互轉換的操作,如Mybatis
2、完整映射:直接使用物件物體和資料庫關系進行映射,不用寫SQL(簡單的操作),由框架自己生成,如JPA、Hibenate
(P.S:就是需要寫sql的就是半映射,不需要的就是完整映射,但是完整映射的sql也只是簡單級別的,復雜度高的還是要自己寫 )
=============================================================
1、核心組態檔:MyBatis-Config.xml,放在Source Folder下(這種檔案夾下的檔案,專案啟動后會自動去讀取)
<configuration>
<!-- 引入組態檔資訊,這里不能加classpath:,
resource:引入類路徑下的資源,即classpath,所以不需要寫classpath:
url:引入網路路徑或磁盤路徑下的資源
-->
<properties resource="db.properties"></properties>
<!-- 環境們 (很多環境的意思,就是可以配置很多個資料庫連接)
default:默認使用哪一個環境(必須對應一個環境的id)
-->
<environments default="development">
<!-- 一個環境 id:為這個環境取唯一一個id名稱 -->
<environment id="development">
<!-- 事務管理 type:JDBC(支持事務)/MANAGED(什么都不做) -->
<transactionManager type="JDBC" />
<!-- 資料源, 連接池 type(POOLED):MyBatis自帶的連接池 -->
<dataSource type="POOLED">
<!-- 連接資料庫的引數:使用屬性檔案的方式 -->
<property name="driver" value="${db.driver}" />
<property name="url" value="${db.url}" />
<property name="username" value="${db.username}" /> <!-- 加前綴,是因為電腦環境中可能會有username,比如電腦的賬戶名-->
<property name="password" value="${db.password}" />
</dataSource>
</environment>
</environments>
<!-- 這個mappers代表的是相應的ORM映射檔案 -->
<mappers>
<mapper resource="cn/itsource/domain/ProductMapper.xml" />
</mappers>
</configuration>
2、映射檔案:關于組態檔,都放在resource檔案下,包和java的要相同,這樣在硬碟中是在同一目錄下的
<?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">
<!--
這個Mapper的主要功能就是寫sql
mapper:根
namespace:命令空間 (用來確定唯一)以前這個是可以不加的,現在必需加,xml之間通過這個來執行相互之間的方法,不是去介面里
namespace的值:介面的完全限定名
-->
<mapper namespace="cn.itsource.dao.IProductDao">
<!--
id:用來確定這條sql陳述句的唯一
以后我們確定唯一,也就是找sql陳述句 : namespace + id
例: cn.itsource.mybatis.day1._1_hello.IProductDao.findById
parameterType : 傳入的引數型別,只有一個的時候最好不寫,因為不寫一定不會錯,寫了反而可能會錯
resultType : 結果型別(第一條資料回傳的物件型別)自己的物件一定是完全限定類名,
如果查詢記錄是多條,介面中方法的回傳值是集合,但是回傳型別還是寫物件,而不是集合,因為myBatis會幫我們將多條資料放入集合中
#{}:底層調get方法,當傳入引數只有一個時,里面寫啥都可以,并不需要和引數名相同
-->
<select id="findById" parameterType="long" resultType="cn.itsource.domain.Product">
select * from product where id = #{id}
</select>
</mapper>
3、抽取工具
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession opSession() {
if (sqlSessionFactory != null) {
return sqlSessionFactory.openSession();
}
return null;
}
}
4、測驗:執行xml中的sql陳述句
4.1、傳統方式:
@Test
public void testFindAll() throws Exception{
//獲取到會話物件
SqlSession session = MybatisUtils.opSession();
//通過命名空間+id,呼叫sql
Product product = session.findById(“cn.itsource.dao.IProductDao”,1L);
}
4.2、映射器Mapper
創建條件:
(1)Mapper映射檔案(.xml)的命名空間,必須和介面的"完全限定名"一致;
(2)定義sql標簽的id,需要和"介面的方法名"一致;
@Test
public void testFindAll() throws Exception{
//獲取到會話物件
SqlSession session = MybatisUtils.opSession();
//拿到映射物件,是通過mybatis自動創建的指定介面代理物件
ProductMapper mapper = session.getMapper(ProductMapper.class);
List<Product> products = mapper.findById(1L);
//如果是增刪改操作,事務需要手動提交
//session.commit()
//lambda運算式
products.forEach(System.out::println);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/107830.html
標籤:其他
