MyBatis 基礎
阿新 • • 發佈:2018-11-01
MyBatis 是一個持久層半自動 ORM 框架,用來簡化 JDBC 程式碼
- 資料持久化:
把記憶體中的資料儲存到硬碟上
系統架構中用來做資料持久化的程式碼叫做持久層(dao)
- ORM:
Object Relationship Mapping:物件關係對映
通過配置來實現 model 和 資料庫記錄之間的相互轉換,
在這個過程中不用編寫 JDBC 程式碼
- MyBatis 的使用:
1. 建立 maven 專案 2. 引入 mybatis 和 mysql 依賴 3. 建立並編輯 mybatis-config.xml 配置檔案 1. 複製貼上官網的模板內容 2. 修改資料庫連線的 4 個配置 3. 修改 SQL 配置檔案路徑為 UserMapper.xml 4. 建立 User model 類,屬性名和資料庫欄位名保持一致 5. 建立 UserDao 介面,宣告資料庫操作方法 ArrayList<User> findAll(); User findByAccount(String account); 6. 建立並編輯 UserMapper.xml 代替以前的 UserDaoImpl 1. 複製官方模板 <?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=""> </mapper> 2. 一個配置檔案對應於一個 Dao 介面 通過 namespace 設定介面的全名進行繫結 3. 在 mapper 標籤內部編寫每個方法用到的 SQL 語句 <select></select> 用於編寫查詢語句 通過 id 設定對應的方法名,繫結 SQL 和方法 通過 resultType 設定方法返回資料的型別全名 如果返回值是集合,只需要配置集合中儲存的類全名即可 <select id="findAll" resultType="com.zhiyou100.model.User"> SELECT id, account, password FROM user; </select> 4. 建立 Application 使用 mybatis // 1. 讀取配置檔案,Reader 導 io 包,Resources 導 ibatis 包,捕獲異常 Reader reader = Resources.getResourceAsReader("mybatis-config.xml"); // 2. 解析配置檔案 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader); // 3. 獲取執行 SQL 語句的 session 物件 SqlSession session = factory.openSession(); // 4. 從 session 獲取 dao 物件 UserDao userDao = session.getMapper(UserDao.class); // 5. 呼叫 dao 中的方法 ArrayList<User> users = userDao.findAll();
- 注意事項:
mybatis-config.xml 1. xml 中是 & 表示 & 符號 2. mapper 的路徑從 resources 資料夾開始算 UserMapper.xml namespace, id, resultType 複製貼上,拒絕手寫 Model 類: 屬性名要和欄位名保持一致 model 和表的關聯預設靠的是名字一致, 如果不一致還需要進行其它配置才能關聯 SQL 引數可以使用 #{} 或 ${} 區別在於 #{} 自動為字串新增 "" ${} 不會為字串新增 "" SQL 單引數賦值方案: #{_parameter} 表示引數 <select id="findByAccount" resultType="com.zhiyou100.model.User"> SELECT id, account, password FROM user WHERE account=#{_parameter}; </select> SQL 多引數賦值方案: 方案1:通過引數的索引進行賦值:param1, param2 User findByAccountAndPassword(String account, String password); <select id="findAllByPageAndSize" resultType="com.zhiyou100.model.User"> SELECT id, account, password FROM user LIMIT #{param1}, #{param2}; </select> 方案2:把引數封裝到 model 類,通過屬性名字賦值 ArrayList<User> findByAccountOrPassword(User user); <select id="findByAccountOrPassword" resultType="com.zhiyou100.model.User"> SELECT id, account, password FROM user WHERE account=#{account} OR password=#{password}; </select>
- 增刪改:
<insert></insert>
<update></update>
<delete></delete>
增刪改預設是在事務中執行的,只有提交了事務,修改才能資料庫生效
session.commit();
- 動態 SQL:
if:表示判斷 <select id="findAllByPasswordLike" resultType="com.zhiyou100.model.User"> SELECT id, account, password FROM user <if test="_parameter != null"> WHERE password LIKE #{_parameter} </if> ; </select> where:封裝查詢條件 1. 只有有條件的時候才會新增 where 關鍵字 2. 消除多餘的 AND/OR <select id="findAllByAccountAndPasswordLike" resultType="com.zhiyou100.model.User"> SELECT id, account, password FROM user <where> <if test="account != null"> AND account LIKE #{account} </if> <if test="password != null"> AND password LIKE #{password} </if> </where> ; </select> set:封裝更新欄位,只更新不為 null 欄位的值 1. 新增 SET 關鍵字 2. 消除多餘的 , <update id="update"> UPDATE user <set> <if test="account != null"> account=#{account}, </if> <if test="password != null"> password=#{password}, </if> </set> WHERE id=#{id}; </update> foreach: 通常用在 in 條件後,遍歷集合並拼接內容,生成查詢條件 <select id="findAllByIds" resultType="com.zhiyou100.model.User"> SELECT id, account, password FROM user WHERE id IN <foreach item="item" index="index" collection="list" open="(" separator="," close=")"> #{item} </foreach> ; </select> 遍歷集合,拼接的內容為 (1,2,3,4)
圖解如下: