springboot整合mybatis實現多表查詢的實戰記錄

什麼是mybatis

(1)Mybatis 是一個半 ORM(對象關系映射)框架,它內部封裝瞭 JDBC,開發時隻需要關註 SQL 語句本身,不需要花費精力去處理加載驅動、創建連接、創建statement 等繁雜的過程。程序員直接編寫原生態 sql,可以嚴格控制 sql 執行性能,靈活度高。

(2)MyBatis 可以使用 XML 或註解來配置和映射原生信息,將 POJO 映射成數據庫中的記錄,避免瞭幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。 @Insert @Repository

(3)通過 xml 文件或註解的方式將要執行的各種 statement 配置起來,並通過java 對象和 statement 中 sql 的動態參數進行映射生成最終執行的 sql 語句,最後由 mybatis 框架執行 sql 並將結果映射為 java 對象並返回。(從執行 sql 到返回 result 的過程)。

Mybaits 的優點:

(1)基 於 SQL 語句編程,相當靈活,不會對應用程序或者數據庫的現有設計造成任何影響,SQL 寫在 XML 裡,解除 sql 與程序代碼的耦合,便於統一管理;提供 XML標簽,支持編寫動態 SQL 語句,並可重用。

(2)與 JDBC 相比,減少瞭 50%以上的代碼量,消除瞭 JDBC 大量冗餘的代碼,不需要手動開關連接;

(3)很好的與各種數據庫兼容(因為 MyBatis 使用 JDBC 來連接數據庫,所以隻要JDBC 支持的數據庫 MyBatis 都支持)。

(4)能夠與 Spring 很好的集成;

Mybatis是如何進行分頁的?分頁插件的原理是什麼?

Mybatis使用RowBounds對象進行分頁,它是針對ResultSet結果集執行的內存分頁,而非物理分頁。可以在sql內直接書寫帶有物理分頁的參數來完成物理分頁功能,也可以使用分頁插件來完成物理分頁。

下面將詳細springboot整合mybatis多表查詢的方法,一起來看看吧

1、一對一查詢(例一個用戶一個賬戶)

1.1、實體類

//用戶實體
@Data
public class UserInfo {

    private int u_id;
    private String name;
    private Account account;
}    


//賬戶實體
@Data
public class Account {

    private int a_id;
    private String  aname;
    private double money;
}


1.2、數據庫表

用戶表

賬戶表

1.3、持久層接口

  @Select("select * from userInfo where name=#{name} ")
    @Results({

            //@Result(property = "a_id",column = "a_id"),
            @Result(property ="account",column = "a_id",javaType = Account.class,
                    one = @One(select="com.bbz.dao.AccountDao.findById",fetchType = FetchType.LAZY))
    })
    public UserInfo findUserlnfo(String name);
   @Select("select * from account where a_id=#{a_id}")
    public Account findById (int a_id);

2、一對多查詢(例一個用戶對應多個賬戶)

2.1、實體類

//用戶實體
@Data
public class UserInfo {

    private int u_id;
    private String name;
    private List<Account>accountList;
}

//賬戶實體
@Data
public class Account {

    private  int id;
    private int a_id;
    private String  aname;
    private double money;  
}

2.2、數據庫表

用戶表

賬戶表

2.3、持久層接口

    @Select("select * from userInfo where name=#{name}")
    @Results({
            @Result(property ="accountList",column ="a_id",javaType = List.class,
                    many = @Many(select = "com.bbz.dao.AccountDao.findById",fetchType = FetchType.LAZY)
            )
    })
    public UserInfo findUser(String name);
    
    //fetchType = FetchType.LAZY):提取方式為延遲加載,默認是立即加載
 @Select("select * from account where a_id=#{a_id}")
    public   Account   findById (int a_id);
    

3、總結

共同點:

無論是一對一還是一對多,都是通過附屬查詢來實現的,我們需要定義這個附屬查詢方法。

在主查詢方法中通過@One、@Many指定附屬查詢方法的全路徑。

都通過column來傳遞參數給附屬方法。

不同點:

一對一,那麼附屬方法返回的是一個單獨的對象

一對多,那麼附屬方法返回的是一個對象集合

4、多對多的查詢(例一個用戶多個角色)

4.1、實體類

//用戶實體
@Data
public class UserInfo {

    private int u_id;
    private String name;
    private  List<Role>roleList;
}

//角色實體
@Data
public class Role {

    private int r_id;
    private String name;
}

4.2、數據庫表

用戶表

角色表

中間表

4.3、持久層接口

 @Select("select * from userInfo where u_id=#{u_id}")
    @Results({

            @Result(property = "u_id",column = "u_id"),
            @Result(property ="roleList",column ="u_id",javaType = List.class,
                    many = @Many(select = "com.bbz.dao.RoleDao.findById",fetchType = FetchType.LAZY)
            )

    })
    public UserInfo findUser(int u_id);
 @Select("select * from role r,user_role ur where r.r_id=ur.r_id and ur.u_id=#{u_id}")
    public List<Role> findById(int U_id);

5、多對一(一個用戶對應多個老師)

5.1 實體類

//用戶實體
@Data
public class UserInfo {

    private int u_id;
    private String name;
    private Teacher teacher;
}

//老師實體
public class Teacher {

    public int t_id;
    public String name;
}

5.2、數據庫表

用戶表

老師表

5.3、持久層接口

@Select("select * from  userInfo where u_id=#{u_id}")
    @Results({
            @Result(property ="teacher",column ="t_id",javaType = Teacher.class,
                    one= @One(select = "com.bbz.dao.TeacherDao.findById",fetchType = FetchType.LAZY)
            )
    })
    @Select("select * from teacher where t_id=#{t_id}")
    public Teacher findById(int t_id);

總結

到此這篇關於springboot整和mybatis實現多表查詢的文章就介紹到這瞭,更多相關springboot整和mybatis多表查詢內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: