MyBatis複習筆記 2021-9-15
阿新 • • 發佈:2021-09-15
MyBatis複習筆記
什麼是MyBatis:
- 是一款優秀的持久層框架
- 避開了幾乎所有的JDBC程式碼和手動設定引數以及獲取結果集的過程
- 可以使用簡單的 xml 或者註解來配置對映的原生資訊,將介面和Java實體類對映成資料庫中的記錄
MyBatis的官方中文文件地址:http://www.mybatis.org/mybatis-3/zh/index.html
什麼是持久層框架
- 對於瞬時來說,持久層是可以吧資料儲存在資料庫或者硬碟一類可以儲存很長時間的裝置中,不向放在記憶體中那樣,斷電就會消失,也就是把資料存在持久化的裝置上
- JDBC就是一種持久化機制,檔案io也是一種持久化機制
為什麼需要持久化服務,以及為什麼需要持久化框架
- 企業應用中的資料很重要(各種訂單資料、客戶資料、庫存資料之類的),比應用程式本身更重要, 所以需要把資料持久化。持久化可以通過很多方式,寫檔案和資料庫都可以。只是現在企業一般都會選擇把資料持久化到資料庫中,因為可以很方便的查詢統計分析,但資料庫的資料最終還是會寫到磁碟上的。Java 程式設計師為了操作資料庫, 最開始是使用JDBC來進行的,但是這種方式的開發效率低 ,要寫一堆重複程式碼,加上關係資料庫和物件本身存在所謂的阻抗不匹配情況,所以 為了提高開發效率,有人發明了 ORM 即 物件關係對映框架
什麼是持久層
- 完成持久化工作的程式碼塊---->dao層
- 在系統的架構中需要有一個相對獨立的邏輯層面,專注於資料持久化邏輯的實現,所以有了持久層的概念
為什麼需要MyBatis
- MyBatis就是幫助我們開發將資料存入資料庫中,從資料庫取資料
- 可以簡化重複的程式碼,提高開發的效率
MyBatis的第一個程式邏輯順序
- 搭建環境:就是建立表以及插入相應的資料
- 匯入相關的MyBatis的jar包
- 編寫MyBatis的核心配置檔案:可以去檢視幫助文件在入門中(http://www.mybatis.org/mybatis-3/zh/index.html)
- 編寫MyBatis工具類(可以不編寫)
- 建立實體類
- 編寫Mapper類
- 編寫Mapper.xml配置檔案(要與Mapper類同名)
1.配置檔案中的namespace十分重要因為他的作用是繫結Dao介面,即面向介面程式設計,綁定了介面之後,就不需要寫介面的實現類,mybatis會通過該繫結自動的找到相對應執行的語句
<?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 namespace="com.sli.dao.UserMapper">
<select id="selectUser" resultType="com.sli.pojo.User">
select * from user
</select>
</mapper>
- 編寫測試類測試
SqlSession session = MybatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
mapper.selectUser();
MyBatis的增刪改查操作
注意點:
- 增.刪.改需要提交事務,此處可以顯示的宣告在SqlSessionFactory物件的openSession方法中設定引數為true就可以,在第四部編寫的工具類中,否則則需要手動提交
session.commit();
- 介面所有的普通引數,儘量都在前面加上@Param引數,尤其是多個引數時,必須寫上,類似於這樣:
List<User> queryUsersById(@Param("id") int id);
- 有時根據業務需求,可以考慮使用map傳遞引數
- sql的配置檔案中儘量將Parameter 和 resultType都寫
- 模糊查詢的like語句如何編寫
- 在java中編寫sql萬用字元如下1
- 在sql語句中拼接萬用字元,會引起sql注入問題如下2
第一種:
string wildcardname = “%smi%”;
list<name> names = mapper.selectlike(wildcardname);
/*
<select id=”selectlike”>
select * from foo where bar like #{value}
</select>
*/
第二種:
string wildcardname = “smi”;
list<name> names = mapper.selectlike(wildcardname);
<select id=”selectlike”>
select * from foo where bar like "%"#{value}"%"
</select>
mybatis-config.xml核心配置檔案
configuration(配置)--->其中包含下方所有的,也就是下方所有的都得寫在
<configuration></configuration>
中
properties(屬性)--->常用於規定database.properties(driver url username password)的位置
<properties resource="database.properties">
settings(設定)主要使用懶載入,日誌實現,快取開啟關閉
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="false"/>
<setting name="autoMappingBehavior" value="PARTIAL"/>
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25"/>
<setting name="defaultFetchSize" value="100"/>
<setting name="safeRowBoundsEnabled" value="false"/>
<setting name="mapUnderscoreToCamelCase" value="false"/>
<setting name="localCacheScope" value="SESSION"/>
<setting name="jdbcTypeForNull" value="OTHER"/>
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
typeAliases(類型別名)只和xml的配置有關,減少完全限定名的冗餘
<typeAliases>
<typeAlias type="com.sli.pojo.User" alias="User"/>
</typeAliases>
當這樣配置時User可以在任何使用com.sli.pojo.User的地方
同時也可以指定一個包名,MyBatis會在包下面搜尋需要的JavaBean
<typeAliases>
<package name="com.sli.pojo"/>
</typeAliases>
每一個在包com.sli.pojo中的Java Bean 在沒有註解的情況下,會使用Bean的首字母小寫的非限定類名來作為他的別名
若有註解,則別名為其註解的值,如下:
@Alias("user")
public class User {
...
}
environments(環境配置)--->其中包含environment環境變數
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
- 配置MyBatis的多套執行環境,將sql對映到多個不同的資料庫上面,必須指定一個為其預設的執行環境(通過environments 的 default屬性指定)
mapper元素(能找到指定的介面,而介面又有xml檔案的namespace屬性來繫結這個介面)對映器:定義對映的sql語句檔案:推薦使用
<!--
使用對映器介面實現類的完全限定類名
需要配置檔名稱和介面名稱一致,並且位於同一目錄下
-->
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
</mappers>
或者
<!--
將包內的對映器介面實現全部註冊為對映器
但是需要配置檔名稱和介面名稱一致,並且位於同一目錄下
-->
<mappers>
<package name="org.mybatis.builder"/>
</mappers>
ResultMap
查詢為null問題解決方式推薦
select * from user where id = #{id}
<可以看做>
select id,name,pwd from user where id = #{id}
原因分析:mybatis會根據這些查詢的列名(會將列名轉化為小寫,資料庫部分大小寫),去對應的實體類中查詢相應的列名即set方法設定,找不到對應的setpwd(),所以將password返回為null,以上都是基於自動對映
推薦解決方案:使用結果集對映--->ResultMap
<resultMap id="UserMap" type="User">
<!-- id為主鍵 -->
<id column="id" property="id"/>
<!-- column是資料庫表的列名 , property是對應實體類的屬性名 -->
<result column="name" property="name"/>
<result column="pwd" property="password"/>
</resultMap>
<select id="selectUserById" resultMap="UserMap">
select id , name , pwd from user where id = #{id}
</select>