Mybatis
文章後半部分內容來自:https://www.cnblogs.com/wang-meng/p/5701990.html
目錄
1.1.9- Mybatis如何解決使用jdbc數據庫連接接數據庫釋放頻繁造成系統資源浪費從而影響系統性能
1.1.10-sql與java語句寫在一起不易於維護,Mybatis如何解決的
1.1.11-Mybatis怎麼保證向sql語句傳參數,佔位符需要和參數一一對應
1.1.12-Mybatis怎麼把數據庫結果封裝成pojo對象
1.1.1-什麼是orm
ORM模式是一種爲了解決面向對象與關係數據存在的互不匹配現象的技術,ORM提供了實現持久化的另一種模式,可以簡單的方案是採用硬編碼方式(jdbc,操作,sql的方式)爲每一種可能的數據庫訪問操作提供單獨的方法,這種方法存在很多缺陷,所以使用ORM框架來解決,常用的有Hibernate,ibatis(Mybatis)。
1.1.2-ORM基於三個核心原則
-
簡單:以最基本的形式建模數據
-
傳達性:數據庫結構被任何人都能理解的語言文檔化
-
精確性:基於數據模型創建正確標準化的結構
1.1.3-Mybatis是什麼
MyBatis 是一個可以自定義SQL、存儲過程和高級映射的持久層框架,是一個半orm框架,只需要注重sql語句的編寫即可,不需要像傳統的jdbc一樣去處理加載驅動,連接,創建,釋放的工作。
1.1.4-Mybatis的優點
-
相對靈活,sql語句可以寫在xml文件中,和程序代碼可以實現分離解耦,易於維護,提供 XML 標籤, 支持編寫動態 SQL 語句, 並可重用。
-
沒有jdbc一樣繁瑣的步驟,只需要關注sql語句本身即可。
-
和Spring可以很好的整合。
-
提供映射標籤, 支持對象與數據庫的 ORM 字段關係映射
1.1.5-Mybatis的缺點
- sql語句會比較多
- 對數據庫的依賴性強,不可以隨意更改數據庫
1.1.6-#{}和${}的區別
#{}是預編譯處理,${}是字符串替換
-
#{}:Mybatis在處理#{}時,會將sql中的#{}替換爲?號,對sql語句預編譯後調用 PreparedStatement 的set 方法來賦值。
-
${}:字符串替換, 告訴 mybatis 使用$包含的“字符串”替換所在位置。使用的是 Statement 對象,有SQL注入的風險。
1.1.7-MyBatis編程步驟
- 創建SqlSessionFactory
- 通過SqlSessionFactory創建SqlSession
- 通過sqlsession執行數據庫操作
- 調用session.commit()提交事務
- 調用session.close()關閉會話
1.1.8-模糊查詢使用
<select id="findByName" resultType="com.pojo.Person">
select * from person where name like "%" #{name} "%"
</select>
1.1.9- Mybatis如何解決使用jdbc數據庫連接接數據庫釋放頻繁造成系統資源浪費從而影響系統性能
在SqlMapConfig.xml中配置數據連接池,使用連接池管理數據庫鏈接
1.1.10-sql與java語句寫在一起不易於維護,Mybatis如何解決的
將Sql語句配置在實體類對應的xml文件中實現與java代碼分離
1.1.11-Mybatis怎麼保證向sql語句傳參數,佔位符需要和參數一一對應
Mybatis自動將java對象映射至sql語句
1.1.12-Mybatis怎麼把數據庫結果封裝成pojo對象
Mybatis自動將sql執行結果映射至java對象
1.1.13-MyBatis的mapper接口調用時的要求
- Mapper接口方法名和對應的mapper.xml中定義的sql的Id要一致
- Mapper接口方法參數類型對應的mapper.xml中定義的sql 的parameterType/resultType的類型相同
- Mapper.xml文件中的namespace即是mapper接口的類路徑
1.1.14-SqlMapConfig.xml中配置的內容
-
properties(屬性)
-
settings(配置)
-
typeAliases(類型別名)
-
typeHandlers(類型處理器)
-
objectFactory(對象工廠)
-
plugins(插件)
-
environments(環境集合屬性對象)
-
environment(環境子屬性對象)
-
transactionManager(事務管理)
-
dataSource(數據源)
-
mappers(映射器)
1.1.15-MyBatis的一級緩存和二級緩存
Mybatis首先去緩存中查詢結果集,如果沒有則查詢數據庫,如果有則從緩存取出返回結果集就不走數據庫。Mybatis內部存儲緩存使用一個HashMap,key爲hashCode+sqlId+Sql語句。value爲從查詢出來映射生成的java對象
Mybatis的二級緩存即查詢緩存,它的作用域是一個mapper的namespace,即在同一個namespace中查詢sql可以從緩存中獲取數據。二級緩存是可以跨SqlSession的。
1.1.16-Mapper編寫方式
一:接口實現類繼承SqlSessionDaoSupport
使用此種方法需要編寫mapper接口,mapper接口實現類、mapper.xml文件
1、在sqlMapConfig.xml中配置mapper.xml的位置
<mappers>
<mapper resource="mapper.xml文件的地址" />
<mapper resource="mapper.xml文件的地址" />
</mappers>
2、定義mapper接口
3、實現類集成SqlSessionDaoSupport
mapper方法中可以this.getSqlSession()進行數據增刪改查。
4、spring 配置
<bean id=" " class="mapper接口的實現">
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
二:使用org.mybatis.spring.mapper.MapperFactoryBean
1、在sqlMapConfig.xml中配置mapper.xml的位置
如果mapper.xml和mappre接口的名稱相同且在同一個目錄,這裏可以不用配置
<mappers>
<mapper resource="mapper.xml文件的地址" />
<mapper resource="mapper.xml文件的地址" />
</mappers>
2、定義mapper接口
- 注意
- 1、mapper.xml中的namespace爲mapper接口的地址
- 2、mapper接口中的方法名和mapper.xml中的定義的statement的id保持一致
3、 Spring中定義
<bean id="" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="mapper接口地址" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
三 :使用mapper掃描器
1、mapper.xml文件編寫
注意:
mapper.xml中的namespace爲mapper接口的地址
mapper接口中的方法名和mapper.xml中的定義的statement的id保持一致
如果將mapper.xml和mapper接口的名稱保持一致則不用在sqlMapConfig.xml中進行配置
2、定義mapper接口
注意mapper.xml的文件名和mapper的接口名稱保持一致,且放在同一個目錄
3、配置mapper掃描器
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="mapper接口包地址"></property>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
掃描器將接口通過代理方法生成實現對象,要spring容器中自動註冊,名稱爲mapper 接口的名稱。