Mybatis高級階段

Mybatis基于注解開發(fā)

這幾年來注解開發(fā)越來越流行彼念,Mybatis也可以使用注解開發(fā)方式凿傅,這樣我們就可以減少編寫Mapper映射文件了

注解 說明
@Insert 實現(xiàn)新增
@Update 實現(xiàn)更新
@Delete 實現(xiàn)刪除
@Select 實現(xiàn)查詢
@Result 實現(xiàn)結(jié)果集封裝
@Results 可以與@Result 一起使用,封裝多個結(jié)果集
@One 實現(xiàn)一對一結(jié)果集封裝
@Many 實現(xiàn)一對多結(jié)果集封裝
    @Select("select * from student")
    public List<Student> findAll();

    @Insert("insert into student values (#{sid}, #{sname}, #{age}, #{birthday})")
    @Options(useGeneratedKeys = true, keyColumn = "sid", keyProperty = "sid") //此操作只限于新增操作后放回主鍵值
    int addStu(Student student);

    @Update("update student set sname = #{sname}, age = #{age}, birthday = #{birthday} where sid = #{sid}")
    int updateStu(Student student);
    
    @Delete("delete from student where sid = #{id}")
    int deleteStu(Integer id);

注意:修改MyBatis的核心配置文件,我們使用了注解替代的映射文件熊昌,所以我們只需要加載使用了注解的Mapper接口即可

<mappers>
    <!--掃描使用注解的類-->
    <mapper class="com.itheima.mapper.UserMapper"></mapper>
</mappers>

或者指定掃描包含映射關(guān)系的接口所在的包也可以

<mappers>
    <!--掃描使用注解的類所在的包-->
    <package name="com.itheima.mapper"></package>
</mappers>

Mybatis基于注解實現(xiàn)多表操作

實現(xiàn)復(fù)雜關(guān)系映射之前我們可以在映射文件中通過配置<resultMap>,<result>,<association>,<collection>組合來實現(xiàn)蒲稳,使用注解開發(fā)后,我們可以使用@Results注解辜御,@Result注解鸭你,@One注解,@Many注解組合完成復(fù)雜關(guān)系的配置


測試數(shù)據(jù)來源于Mybatis進階階段

一對一操作

//PersonMapper接口
public interface PersonMapper {
    //根據(jù)id查詢
    @Select("SELECT * FROM person WHERE id=#{id}")
    public abstract Person selectById(Integer id);
}
//CardMapper接口
public interface CardMapper {
    //查詢?nèi)?    @Select("SELECT * FROM card")
    @Results({
            @Result(column = "id",property = "id"),
            @Result(column = "number",property = "number"),
            @Result(
                    property = "p",             // 被包含對象的變量名
                    javaType = Person.class,    // 被包含對象的實際數(shù)據(jù)類型
                    column = "pid",             // 根據(jù)查詢出的card表中的pid字段來查詢person表
                    /*
                        one擒权、@One 一對一固定寫法
                        select屬性:指定調(diào)用哪個接口中的哪個方法
                     */
                    one = @One(select = "com.itheima.one_to_one.PersonMapper.selectById")
            )
    })
    public abstract List<Card> selectAll();
}

一對一操作注解解析
@Results:封裝映射關(guān)系的父注解

  • Result[] value():定義了 Result 數(shù)組

@Result:封裝映射關(guān)系的子注解袱巨。

  • column 屬性:查詢出的表中字段名稱
  • property 屬性:實體對象中的屬性名稱
  • javaType 屬性:被包含對象的數(shù)據(jù)類型
  • one 屬性:一對一查詢固定屬性

@One:一對一查詢的注解。

  • select 屬性:指定調(diào)用某個接口中的方法

一對多操作

//StudentMapper接口
public interface StudentMapper {
   //根據(jù)cid查詢student表
   @Select("SELECT * FROM student WHERE cid=#{cid}")
   public abstract List<Student> selectByCid(Integer cid);
}
//ClassesMapper接口
public interface ClassesMapper {
    //查詢?nèi)?    @Select("SELECT * FROM classes")
    @Results({
            @Result(column = "id",property = "id"),
            @Result(column = "name",property = "name"),
            @Result(
                    property = "students",  // 被包含對象的變量名
                    javaType = List.class,  // 被包含對象的實際數(shù)據(jù)類型
                    column = "id",          // 根據(jù)查詢出的classes表的id字段來查詢student表
                    /*
                        many碳抄、@Many 一對多查詢的固定寫法
                        select屬性:指定調(diào)用哪個接口中的哪個查詢方法
                     */
                    many = @Many(select = "com.itheima.one_to_many.StudentMapper.selectByCid")
            )
    })
    public abstract List<Classes> selectAll();
}

一對多操作注解解析
@Results:封裝映射關(guān)系的父注解愉老。

  • Result[] value():定義了 Result 數(shù)組

@Result:封裝映射關(guān)系的子注解。

  • column 屬性:查詢出的表中字段名稱
  • property 屬性:實體對象中的屬性名稱
  • javaType 屬性:被包含對象的數(shù)據(jù)類型
  • many 屬性:一對多查詢固定屬性

@Many:一對多查詢的注解剖效。

  • select 屬性:指定調(diào)用某個接口中的方法

多對多操作

//CourseMapper接口
public interface CourseMapper {
    //根據(jù)學(xué)生id查詢所選課程
    @Select("SELECT c.id,c.name FROM stu_cr sc,course c WHERE sc.cid=c.id AND sc.sid=#{id}")
    public abstract List<Course> selectBySid(Integer id);
}
//StudentMapper接口
public interface StudentMapper {
    //查詢?nèi)?    @Select("SELECT DISTINCT s.id,s.name,s.age FROM student s,stu_cr sc WHERE sc.sid=s.id")
    @Results({
            @Result(column = "id",property = "id"),
            @Result(column = "name",property = "name"),
            @Result(column = "age",property = "age"),
            @Result(
                    property = "courses",   // 被包含對象的變量名
                    javaType = List.class,  // 被包含對象的實際數(shù)據(jù)類型
                    column = "id",          // 根據(jù)查詢出student表的id來作為關(guān)聯(lián)條件嫉入,去查詢中間表和課程表
                    /*
                        many、@Many 一對多查詢的固定寫法
                        select屬性:指定調(diào)用哪個接口中的哪個查詢方法
                     */
                    many = @Many(select = "com.itheima.many_to_many.CourseMapper.selectBySid")
            )
    })
    public abstract List<Student> selectAll();
}

構(gòu)建SQL語句

  • org.apache.ibatis.jdbc.SQL:構(gòu)建 SQL 語句的功能類璧尸。通過一些方法來代替
  • SQL 語句的關(guān)鍵字咒林。
    SELECT()
    FROM()
    WHERE()
    INSERT_INTO()
    VALUES()
    UPDATE()
    DELETE_FROM()
  • @SelectProvider:生成查詢用的 SQL 語句注解。
  • @InsertProvider:生成新增用的 SQL 語句注解爷光。
  • @UpdateProvider:生成修改用的 SQL 語句注解垫竞。
  • @DeleteProvider:生成刪除用的 SQL 語句注解。
    type 屬性:生成 SQL 語句功能類對象
    method 屬性:指定調(diào)用方法

構(gòu)建SQL語句中最為常用的是@SelectProvider蛀序;

以@SelectProvide為例代碼演示

//1.構(gòu)建SQL語句的生成類
public class sqlBuilder {
    public String findByNameAge(@Param("sname") String sname, @Param("age") Integer age) {
//此處1=1是為后面參數(shù)拼接更加規(guī)范欢瞪,還有注意之間的空格
        StringBuffer sql = new StringBuffer("select * from student where 1=1");
        if (sname != null) {
            sql.append(" and sname = #{sname}");
        }
        if (age != null) {
            sql.append(" and age = #{age}");
        }
        return sql.toString();
    }
}

//2.使用@xxxprovider注釋引入生成類
public interface StudentMapper {
    @SelectProvider(type = sqlBuilder.class, method = "findByNameAge")
    List<Student> findByNameAge(@Param("sname") String sname, @Param("age") Integer age);
}

//3.使用test類(這里使用了三層架構(gòu))
public class StudentTest {

    private StudentService studentService = new StudentServiceImpl();
    @Test
    public void testQueryByNameAndAge() {
        Student student = new Student(25, "小花", 18, new Date());
        List<Student> s = studentService.findByNameAge(null, student.getAge());
//執(zhí)行后的SQL:select * from student where 1=1 and age = ?
        System.out.println(s);
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市徐裸,隨后出現(xiàn)的幾起案子引有,更是在濱河造成了極大的恐慌,老刑警劉巖倦逐,帶你破解...
    沈念sama閱讀 212,080評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件譬正,死亡現(xiàn)場離奇詭異宫补,居然都是意外死亡,警方通過查閱死者的電腦和手機曾我,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評論 3 385
  • 文/潘曉璐 我一進店門粉怕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人抒巢,你說我怎么就攤上這事贫贝。” “怎么了蛉谜?”我有些...
    開封第一講書人閱讀 157,630評論 0 348
  • 文/不壞的土叔 我叫張陵稚晚,是天一觀的道長。 經(jīng)常有香客問我型诚,道長客燕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,554評論 1 284
  • 正文 為了忘掉前任狰贯,我火速辦了婚禮也搓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘涵紊。我一直安慰自己傍妒,他們只是感情好,可當我...
    茶點故事閱讀 65,662評論 6 386
  • 文/花漫 我一把揭開白布摸柄。 她就那樣靜靜地躺著颤练,像睡著了一般。 火紅的嫁衣襯著肌膚如雪驱负。 梳的紋絲不亂的頭發(fā)上昔案,一...
    開封第一講書人閱讀 49,856評論 1 290
  • 那天,我揣著相機與錄音电媳,去河邊找鬼。 笑死庆亡,一個胖子當著我的面吹牛匾乓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播又谋,決...
    沈念sama閱讀 39,014評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼拼缝,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了彰亥?” 一聲冷哼從身側(cè)響起咧七,我...
    開封第一講書人閱讀 37,752評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎任斋,沒想到半個月后继阻,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,212評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,541評論 2 327
  • 正文 我和宋清朗相戀三年瘟檩,在試婚紗的時候發(fā)現(xiàn)自己被綠了抹缕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,687評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡墨辛,死狀恐怖卓研,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情睹簇,我是刑警寧澤奏赘,帶...
    沈念sama閱讀 34,347評論 4 331
  • 正文 年R本政府宣布,位于F島的核電站太惠,受9級特大地震影響磨淌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜垛叨,卻給世界環(huán)境...
    茶點故事閱讀 39,973評論 3 315
  • 文/蒙蒙 一伦糯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嗽元,春花似錦敛纲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至佩谷,卻和暖如春旁壮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谐檀。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評論 1 266
  • 我被黑心中介騙來泰國打工抡谐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人桐猬。 一個月前我還...
    沈念sama閱讀 46,406評論 2 360
  • 正文 我出身青樓麦撵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親溃肪。 傳聞我的和親對象是個殘疾皇子免胃,可洞房花燭夜當晚...
    茶點故事閱讀 43,576評論 2 349

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