MyBatis 入坑(三)

概述

學習真是一個溫故知新的過程严沥。在寫前面的一些文章時,我自己對一些比較模糊的地方有了更好的認識拷沸,這應該算是寫東西最大的收獲吧色查。不管在什么時候,都要給自己找一個堅持的理由撞芍。成為最好的自己之前秧了,先做好當下的每件小事。

Mapper 代理開發(fā)方式

在一般的 Dao「 Data Access Object 」開發(fā)方法要寫 Dao 接口以及其實現(xiàn)類序无。Mapper 代理方式只需要編寫 Mapper 接口验毡,MyBatis 會根據(jù)接口定義創(chuàng)建接口的動態(tài)代理對象。創(chuàng)建代理對象的方法的具體實現(xiàn)帝嗡。在 Mapper 開發(fā)中晶通,要注意下面幾點:

  • Mapper.xml 相當于前面出現(xiàn)的Users.xml 文件,但是這里要和 Mapper 接口在相同路徑哟玷,且名稱相同狮辽。
  • Mapper.xml 中 namespace 的路徑和 Mapper 接口的路徑一致。
    3 - Mapper 接口中的方法名稱和 Mapper.xml 中的對應的聲明 「 statement 」中id 一致巢寡。并且聲明中 parameterType 的類型和接口方法的輸入?yún)?shù)類型一致喉脖, resultType 的類型和接口方法的返回值類型一致。

創(chuàng)建 mapper 包讼渊,將 Mapper 接口和映射文件放在 mapper 包中动看。下面創(chuàng)建 UsesMapper 接口和 UsersMapper.xml 完成一個小例子,體驗下洪荒之力爪幻。

  1. 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">
<!--這里的名稱空間是 UsersMapper 接口的路徑-->
<mapper namespace="com.jihe.mapper.UsersMapper">
    <!--增加用戶-->
    <insert id="addUser" parameterType="com.jihe.domain.Users">
         insert into users(username,birthday,sex,address)
         values(#{username},#{birthday},#{sex},#{address})
    </insert>
    <!--刪除用戶-->
    <delete id="deleteUserById" parameterType="int">
        delete from users where id=#{id}
    </delete>
    <!--查找用戶-->
    <select id="findUserByName" parameterType="string" resultType="com.jihe.domain.Users">
        select * from users where username like '%${value}%'
    </select>
</mapper>

這是 Users.xml 實現(xiàn)的功能菱皆,現(xiàn)在使用代理的方式實現(xiàn)上面的功能。

  1. UsersMapper 接口
package com.jihe.mapper;
import com.jihe.domain.Users;
import java.util.List;
/**
 * UsersMapper 接口
 */
public interface UsersMapper {
    //增加用戶
    public void addUser(Users user);
    //刪除用戶
    public void deleteUserById(Integer id);
    //查找用戶
    public List<Users> findUserByName(String username);
}
  • 將 UsersMapper.xml 加載到 MyBatis 的核心配置文件 sqlMapConfig.xml 中
<mappers>
    <!--<mapper resource="Users.xml"/>-->
   <mapper resource="com/jihe/mapper/UsersMapper.xml"/>
</mappers>

上面的方式是直接加載類路徑下的資源挨稿,還有下面的幾種方式可以加載 Mapper.xml 問價:

  • 通過加載 Mapper 接口的類路徑方式
<mappers>
    <mapper class="com.jihe.mapper.UsersMapper"/>
</mappers>
  • 加載 Mapper 接口包下所有的文件
<mappers>
    <package name="com.jihe.mapper"/>
</mappers>
  1. 測試
package com.jihe.test;
//省略導包
/**
 * UsersMapper 接口的測試
 */
public class UsersMapperTest {
    //創(chuàng)建 SqlSessionFactory
    SqlSessionFactory sqlSessionFactory = null;
    @Before
    public void createFactroy()throws Exception{
        String xml = "sqlMapConfig.xml";
        InputStream in = Resources.getResourceAsStream(xml);
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
    }
    //增加
    @Test
    public void testAddUser(){
        Users user = new Users();
        user.setUsername("大白波");
        user.setAddress("USA");
        user.setSex("男");
        user.setBirthday(new Date());
        SqlSession session = sqlSessionFactory.openSession();
        //獲取 UsersMapper
        UsersMapper mapper = session.getMapper(UsersMapper.class);
        //增加用戶
        mapper.addUser(user);
        session.commit();
        session.close();
    }
    //刪除
    @Test
    public void testDeleteUser(){
        SqlSession session = sqlSessionFactory.openSession();
        UsersMapper mapper = session.getMapper(UsersMapper.class);
        mapper.deleteUserById(32);
        session.commit();
        session.close();
    }
    //查找
    @Test
    public void testFindUsers(){
        SqlSession session = sqlSessionFactory.openSession();
        UsersMapper mapper = session.getMapper(UsersMapper.class);
        List<Users> list = mapper.findUserByName("波");
        //在下面打斷點仇轻,可以看到查到的數(shù)據(jù)
        System.out.print(list);
        session.commit();
        session.close();
    }
}

以上就是 MyBatis 中使用 Mapper 接口動態(tài)代理的方式編寫持久層代碼。

小結(jié)

通過 Mapper 動態(tài)代理的方式簡化了傳統(tǒng) Dao 開發(fā)方法奶甘。我們只要編寫 Mapper 接口篷店,具體的實現(xiàn)類由 MyBatis 代理生成。將之前開發(fā)中寫死的代碼 //session.selectList("com.jihe.domain.findByUsername", "波"); 抽離出來。這樣更有利于后期代碼的維護疲陕,畢竟維護在開發(fā)中方淤,后期維護占整個軟件開發(fā)很重要的一部分。以上就是 mapper 動態(tài)代理的方式蹄殃,還是挺有意思的携茂。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市诅岩,隨后出現(xiàn)的幾起案子讳苦,更是在濱河造成了極大的恐慌,老刑警劉巖吩谦,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸳谜,死亡現(xiàn)場離奇詭異,居然都是意外死亡式廷,警方通過查閱死者的電腦和手機咐扭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來懒棉,“玉大人草描,你說我怎么就攤上這事〔哐希” “怎么了穗慕?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長妻导。 經(jīng)常有香客問我逛绵,道長,這世上最難降的妖魔是什么倔韭? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任术浪,我火速辦了婚禮,結(jié)果婚禮上寿酌,老公的妹妹穿的比我還像新娘胰苏。我一直安慰自己,他們只是感情好醇疼,可當我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布硕并。 她就那樣靜靜地躺著,像睡著了一般秧荆。 火紅的嫁衣襯著肌膚如雪倔毙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天乙濒,我揣著相機與錄音陕赃,去河邊找鬼。 笑死,一個胖子當著我的面吹牛么库,可吹牛的內(nèi)容都是我干的傻丝。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼诉儒,長吁一口氣:“原來是場噩夢啊……” “哼桑滩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起允睹,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎幌氮,沒想到半個月后缭受,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡该互,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年米者,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宇智。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蔓搞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出随橘,到底是詐尸還是另有隱情喂分,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布机蔗,位于F島的核電站蒲祈,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏萝嘁。R本人自食惡果不足惜梆掸,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望牙言。 院中可真熱鬧酸钦,春花似錦、人聲如沸咱枉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽庞钢。三九已至拔恰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間基括,已是汗流浹背颜懊。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人河爹。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓匠璧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親咸这。 傳聞我的和親對象是個殘疾皇子夷恍,可洞房花燭夜當晚...
    茶點故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內(nèi)容