1. 程式人生 > >MyBatis 基礎

MyBatis 基礎

MyBatis 是一個持久層半自動 ORM 框架,用來簡化 JDBC 程式碼

  1. 資料持久化:
		把記憶體中的資料儲存到硬碟上
        系統架構中用來做資料持久化的程式碼叫做持久層(dao)
  1. ORM:
		Object Relationship Mapping:物件關係對映
        通過配置來實現 model 和 資料庫記錄之間的相互轉換,
        在這個過程中不用編寫 JDBC 程式碼
  1. 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();        
  1. 注意事項:
    mybatis-config.xml
        1. xml 中是 &amp; 表示 & 符號
        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>
  1. 增刪改:
	<insert></insert>
    <update></update>
    <delete></delete>
    
    增刪改預設是在事務中執行的,只有提交了事務,修改才能資料庫生效
    session.commit();    
  1. 動態 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)

圖解如下:
圖解