1. Mapper映射代理介面 MyBatis基於代理機制,可以讓我們無需在編寫Dao層的介面,我們可以把以前的Dao層的IXxxDao介面直接定義成符合規則的Mapper介面。 具體實現步驟如下: ① 在項目mapper文件目錄下創建對應的Mapper介面,介面命令必須是以Mapper結尾,名字是 ...
1. Mapper映射代理介面
MyBatis基於代理機制,可以讓我們無需在編寫Dao層的介面,我們可以把以前的Dao層的IXxxDao介面直接定義成符合規則的Mapper介面。
具體實現步驟如下:
① 在項目mapper文件目錄下創建對應的Mapper介面,介面命令必須是以Mapper結尾,名字是Domain類名+Mapper;
② 在項目mapper文件的同級目錄下創建Domain類名+Mapper.xml文件,註意必須與Mapper介面建立關係,通過namespace要能找到mapper介面;
③ 在DomainMapper.xml文件中編寫sql語句,註意各個sql語句的id要和DomainMapper介面中的方法名一致,返回值、參數類型也要一致;
④ 編寫測試Junit類,可以看到對應的Mapper介面已經變成了一個代理,對應的數據通過代理mapper介面獲取;
2. MyBatis的批量操作(添加、刪除)
2.1.批量添加
批量添加首先構造一個對應批量處理添加的sql語句:
Insert into user(username, password) values (?, ?), (?, ?), (?, ?)
根據這個結構我們需要對應編寫介面與.xml中配置Sql語句,這裡需要使用到<foreach>標簽。
UserMapper介面:
public interface UserMapper { void insertBatch(List<User> userList); }
UserMapper.xml配置:
<?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"> <!-- namespace:這裡使用Mapper映射代理介面,namespace對應mapper介面文件 --> <mapper namespace="cn.yif.mybatis.mapper.UserMapper"> <!--測試批量添加user,需要構造批量添加SQL--> <insert id="insertBatch" parameterType="java.util.List"> insert into user(username, password) values <foreach collection="list" index="index" item="user" separator=","> (#{user.name}, #{user.pwd}) </foreach> </insert> </mapper>
編寫測試類:
public class UserMapperTest { @Test public void insertBatch(){ SqlSession sqlSession = MyBatisUtil.getSqlSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); List<User> userList = new ArrayList<>(); userList.add(new User("李軍", "4523")); userList.add(new User("吳華", "3257")); userList.add(new User("王慧", "5200")); userMapper.insertBatch(userList); //註意:使用Mapper介面代理對象時必須提交SqlSession,即必須調用commit方法,否則添加數據無法同步到資料庫 sqlSession.commit(); sqlSession.close(); } }
2.2.批量刪除
首先構造一個批量刪除的Sql語句:
delete from user where id in (?, ?, ?, ?)
同樣需要在UserMappper.xml中配置批量刪除的Sql語句,如下:
<?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"> <!-- namespace:這裡使用Mapper映射代理介面,namespace對應mapper介面文件 --> <mapper namespace="cn.yif.mybatis.mapper.UserMapper"> <!--測試批量刪除user--> <!--delete from user where id in (25, 26, 27, 29)--> <delete id="deleteBatch" parameterType="java.util.List"> delete from user where id in <foreach collection="list" index="index" item="id" open="(" separator="," close=")"> #{id} </foreach> </delete> </mapper>
對應UserMapper介面中添加批量刪除介面方法:
public interface UserMapper { void deleteBatch(List<Integer> idLst); }
編寫對應測試類:
public class UserMapperTest { @Test public void deleteBatch(){ SqlSession sqlSession = MyBatisUtil.getSqlSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); List<Integer> idsLst = new ArrayList(); idsLst.add(16); idsLst.add(17); idsLst.add(18); userMapper.deleteBatch(idsLst); //註意:使用Mapper介面代理對象時必須提交SqlSession,即必須調用commit方法,否則刪除數據無法同步到資料庫 sqlSession.commit(); sqlSession.close(); } }
2.3.<foreach>標簽屬性介紹
在批量刪除與批量添加配置Sql中都使用到了<foreach>標簽,這裡說明一下foreach標簽中的屬性:collection、item、separator、index、open、close。
1.collection:指定要遍歷的集合。表示傳入過來的參數的數據類型。該屬性是必須要指定的,要做foreach的對象。在使用foreach的時候最關鍵最容易出錯的就是collection屬性。在不同情況下,該屬性的值是不一樣的,主要有以下3種情況:
a.如果傳入的是單參數且參數類型是一個List的時候,collection屬性值為list;
b.如果傳入的是單參數且參數類型是一個array數組的時候,collection屬性值為array;
c.如果傳入的參數是多個的時候,我們就需要把它們封裝成一個Map了,當然單參數也可以封裝成Map。Map對象沒有預設的鍵。
2.item:表示集合中每一個元素進行迭代時的別名。將當前遍歷出的元素賦值給指定的變數,然後用#{變數名},就能取出變數的值,也就是當前遍歷出的元素。
3. separator:表示在每次進行迭代之間以什麼符號作為分隔符。Select * from table where id in (1, 2, 3),相當於1,2,3之間的”,”。
4. index:索引。Index指定一個名字,用於表示在迭代過程中,每次迭代到的位置。遍歷list的時候index就是索引,遍歷map的時候index表示的就是map的key,item就是map的值。
5. open表示該語句以什麼開始,close表示以什麼結束。
以上具體參數屬性說明參考:http://www.imooc.com/article/details/id/284701