1. 介面繫結方案
MyBatis中, 提供了一套介面繫結方案. 程式設計師可以提供一個介面, 然後提供對應介面的一個mapper.xml檔案. MyBatis會自動將介面和xml檔案進行繫結. 實際上就是MyBatis會根據介面和對應的xml檔案建立介面的實現類. 換言之, 就是可以得到介面型別的物件, 方便方法的呼叫.
2.1 實現方式
2.1.1 定義介面
package com.bjsxt.mapper;
import java.util.List; import com.bjsxt.pojo.User;
public interface UserMapper { List<User> selAll(); } |
2.1.2 編寫對應介面的對映檔案
注意:
a) xml檔名要和介面名一致
b) namespace屬性必須為介面的全限定路徑
c) id屬性必須和介面對應的方法名一致
<mapper namespace=“com.bjsxt.mapper.UserMapper“> <select id=“selAll“ resultType=“User”> select * from t_user </select> </mapper> |
2.1.3 在核心配置檔案中掃描介面
a) 掃描單個介面, 可以使用mapper標籤的class屬性
<mappers> <mapper class=“com.bjsxt.mapper.UserMapper” /> </mappers> |
b) 當掃描多個介面時, 為簡化配置, 可以使用package標籤, 表示掃描對應包下的所有介面.
<mappers> <package name=“com.bjsxt.mapper” /> </mappers> |
2.1.4 應用
在使用時, 可以通過SqlSession物件的getMapper方法, 得到介面的代理物件, 從而可以呼叫定義好的方法.
@Test public void testBind() { SqlSession session = MyBatisUtil.getSession();
UserMapper mapper = session.getMapper(UserMapper.class); List<User> list = mapper.selAll(); for (User user : list) { System.out.println(user); }
session.close(); } |
2.2 通過介面繫結解決多引數的傳遞
2.2.1 方式一
a) 介面中定義方法
User selByUP(String username, String password); |
b) 對映檔案中提供對應的標籤. 此時, SQL語句中獲取方式有兩種, 通過#{index}或#{param+數字}的方式.
<select id=“selByUP” resultType=“user”> select * from t_user where username=#{0} and password=#{1} </select> |
2.2.2 方式二
a) 介面中定義方法, 引數中使用@Param註解設定引數名用於在SQL語句中使用.
User selByUP(@Param(“username”) String username, @Param(“password”) String password); |
b) 對映檔案中提供對應的標籤. 此時, SQL語句中獲取方式有兩種, 通過#{引數名稱}或#{param+數字}的方式.
<select id=“selByUP” resultType=“user”> select * from t_user where username=#{username} and password=#{password} </select> |
2. 動態SQL
根據條件的不同, SQL語句也會隨之動態的改變. MyBatis中, 提供了一組標籤用於實現動態SQL.
3.1 <if>
用於進行條件判斷, test屬性用於指定判斷條件. 為了拼接條件, 在SQL語句後強行新增1=1的恆成立條件.
<select id=“sel” resultType=“user”> select * from t_user where 1=1 <if test=“username != null and username != “”> and username=#{username} </if> <if test=“password != null and password != “”> and password=#{password} </if> </select> |
3.2 <where>
用於管理where子句. 有如下功能:
a) 如果沒有條件, 不會生成where關鍵字
b) 如果有條件, 會自動新增where關鍵字
c) 如果第一個條件中有and, 去除之
<select id=“sel” resultType=“user”> select * from t_user <where> <if test=“username != null and username != “”> and username=#{username} </if> <if test=“password != null and password != “”> and password=#{password} </if> </where> </select> |
3.3 <choose><when><otherwise>
這是一套標籤, 功能類似於switch…case…
<select id=“sel” resultType=“user”> select * from t_user <where> <choose> <when test=“username != null and username != “”> and username = #{username} </when> <when test=“password != null and password != “”> and password = #{password} </when> <otherwise> and 1=1 </otherwise> </choose> </where> </select> |
3.4 <set>
用於維護update語句中的set子句. 功能如下:
a) 滿足條件時, 會自動新增set關鍵字
b) 會去除set子句中多餘的逗號
c) 不滿足條件時, 不會生成set關鍵字
int updUser(User user); |
<update id=“updUser” parameterType=“user”> update t_user <set> id=#{id}, <!– 防止所有條件不成立時的語法錯誤 –> <if test=“username != null and username != “”> username=#{username}, </if> <if test=“password != null and password != “”> password=#{password}, </if> </set> where id=#{id} </update> |
3.5 <trim>
用於在前後新增或刪除一些內容
a) prefix, 在前面新增內容
b) prefixOverrides, 從前面去除內容
c) suffix, 向後面新增內容
d) suffixOverrides, 從後面去除內容
<update id=“updUser” parameterType=“user”> update t_user <!– prefix: 字首, 表示向前面新增內容 prefixOverrides: 從前面刪除內容 suffix: 字尾, 表示向後面新增內容 suffixOverrides: 從後面刪除內容 –> <trim prefix=“set” prefixOverrides=“user” suffix=“hahaha” suffixOverrides=“,”> username=#{username}, </trim> where id=#{id} </update> |
3.6 <bind>
用於對資料進行再加工, 用於模糊查詢
<select id=“sel” resultType=“user”> select * from t_user <where> <if test=“username!=null and username!=“”> <bind name=“username” value=“`%` + username + `%`”/> and username like #{username} </if> </where> </select> |
1. 介面繫結方案
MyBatis中, 提供了一套介面繫結方案. 程式設計師可以提供一個介面, 然後提供對應介面的一個mapper.xml檔案. MyBatis會自動將介面和xml檔案進行繫結. 實際上就是MyBatis會根據介面和對應的xml檔案建立介面的實現類. 換言之, 就是可以得到介面型別的物件, 方便方法的呼叫.
2.1 實現方式
2.1.1 定義介面
package com.bjsxt.mapper;
import java.util.List; import com.bjsxt.pojo.User;
public interface UserMapper { List<User> selAll(); } |
2.1.2 編寫對應介面的對映檔案
注意:
a) xml檔名要和介面名一致
b) namespace屬性必須為介面的全限定路徑
c) id屬性必須和介面對應的方法名一致
<mapper namespace=“com.bjsxt.mapper.UserMapper“> <select id=“selAll“ resultType=“User”> select * from t_user </select> </mapper> |
2.1.3 在核心配置檔案中掃描介面
a) 掃描單個介面, 可以使用mapper標籤的class屬性
<mappers> <mapper class=“com.bjsxt.mapper.UserMapper” /> </mappers> |
b) 當掃描多個介面時, 為簡化配置, 可以使用package標籤, 表示掃描對應包下的所有介面.
<mappers> <package name=“com.bjsxt.mapper” /> </mappers> |
2.1.4 應用
在使用時, 可以通過SqlSession物件的getMapper方法, 得到介面的代理物件, 從而可以呼叫定義好的方法.
@Test public void testBind() { SqlSession session = MyBatisUtil.getSession();
UserMapper mapper = session.getMapper(UserMapper.class); List<User> list = mapper.selAll(); for (User user : list) { System.out.println(user); }
session.close(); } |
2.2 通過介面繫結解決多引數的傳遞
2.2.1 方式一
a) 介面中定義方法
User selByUP(String username, String password); |
b) 對映檔案中提供對應的標籤. 此時, SQL語句中獲取方式有兩種, 通過#{index}或#{param+數字}的方式.
<select id=“selByUP” resultType=“user”> select * from t_user where username=#{0} and password=#{1} </select> |
2.2.2 方式二
a) 介面中定義方法, 引數中使用@Param註解設定引數名用於在SQL語句中使用.
User selByUP(@Param(“username”) String username, @Param(“password”) String password); |
b) 對映檔案中提供對應的標籤. 此時, SQL語句中獲取方式有兩種, 通過#{引數名稱}或#{param+數字}的方式.
<select id=“selByUP” resultType=“user”> select * from t_user where username=#{username} and password=#{password} </select> |
2. 動態SQL
根據條件的不同, SQL語句也會隨之動態的改變. MyBatis中, 提供了一組標籤用於實現動態SQL.
3.1 <if>
用於進行條件判斷, test屬性用於指定判斷條件. 為了拼接條件, 在SQL語句後強行新增1=1的恆成立條件.
<select id=“sel” resultType=“user”> select * from t_user where 1=1 <if test=“username != null and username != “”> and username=#{username} </if> <if test=“password != null and password != “”> and password=#{password} </if> </select> |
3.2 <where>
用於管理where子句. 有如下功能:
a) 如果沒有條件, 不會生成where關鍵字
b) 如果有條件, 會自動新增where關鍵字
c) 如果第一個條件中有and, 去除之
<select id=“sel” resultType=“user”> select * from t_user <where> <if test=“username != null and username != “”> and username=#{username} </if> <if test=“password != null and password != “”> and password=#{password} </if> </where> </select> |
3.3 <choose><when><otherwise>
這是一套標籤, 功能類似於switch…case…
<select id=“sel” resultType=“user”> select * from t_user <where> <choose> <when test=“username != null and username != “”> and username = #{username} </when> <when test=“password != null and password != “”> and password = #{password} </when> <otherwise> and 1=1 </otherwise> </choose> </where> </select> |
3.4 <set>
用於維護update語句中的set子句. 功能如下:
a) 滿足條件時, 會自動新增set關鍵字
b) 會去除set子句中多餘的逗號
c) 不滿足條件時, 不會生成set關鍵字
int updUser(User user); |
<update id=“updUser” parameterType=“user”> update t_user <set> id=#{id}, <!– 防止所有條件不成立時的語法錯誤 –> <if test=“username != null and username != “”> username=#{username}, </if> <if test=“password != null and password != “”> password=#{password}, </if> </set> where id=#{id} </update> |
3.5 <trim>
用於在前後新增或刪除一些內容
a) prefix, 在前面新增內容
b) prefixOverrides, 從前面去除內容
c) suffix, 向後面新增內容
d) suffixOverrides, 從後面去除內容
<update id=“updUser” parameterType=“user”> update t_user <!– prefix: 字首, 表示向前面新增內容 prefixOverrides: 從前面刪除內容 suffix: 字尾, 表示向後面新增內容 suffixOverrides: 從後面刪除內容 –> <trim prefix=“set” prefixOverrides=“user” suffix=“hahaha” suffixOverrides=“,”> username=#{username}, </trim> where id=#{id} </update> |
3.6 <bind>
用於對資料進行再加工, 用於模糊查詢
<select id=“sel” resultType=“user”> select * from t_user <where> <if test=“username!=null and username!=“”> <bind name=“username” value=“`%` + username + `%`”/> and username like #{username} </if> </where> </select> |