1. 程式人生 > 其它 >mybatis-註解實現複雜查詢-多表查詢-(2)

mybatis-註解實現複雜查詢-多表查詢-(2)

實現複雜關係對映之前我們可以在對映檔案中通過配置來實現,使用註解開發後,我們可以使用@Results註解,@Result註解,@One註解,@Many註解組合完成複雜關係的配置

多表查詢:一對一查詢

使用者表和訂單表的關係為,一個使用者有多個訂單,一個訂單隻從屬於一個使用者

對應的sql語句:
select * from orders;
select * from user where id=查詢出訂單的uid;

主要註解:
@Result(column = "id",property = "id")
one = @One(select = "com.study.mapper.UserMapper.findById")

步驟1:建立訂單類

public class Order {
    private int id;
    private Date ordertime;
    private double total;
    //當前訂單屬於哪一個使用者
    private User user;

步驟2:建立OrderMapper介面

第一種方式:

public interface OrderMapper {
    @Select("select *,o.id oid from orders o,user u where o.uid=u.id")
    @Results({
            @Result(column = "oid",property = "id"),
            @Result(column = "ordertime",property = "ordertime"),
            @Result(column = "total",property = "total"),
            @Result(column = "uid",property = "user.id"),
            @Result(column = "username",property = "user.username"),
            @Result(column = "password",property = "user.password")
    })
    public List<Order> findAll();
}

第二種方式:

public interface OrderMapper {
    @Select("select * from orders")
    @Results({
            @Result(column = "id",property = "id"),
            @Result(column = "ordertime",property = "ordertime"),
            @Result(column = "total",property = "total"),
            @Result(
                    property = "user", //要封裝的屬性名稱
                    column = "uid", //根據那個欄位去查詢user表的資料
                    javaType = User.class, //要封裝的實體型別
                    //select屬性 代表查詢那個介面的方法獲得資料   UserMapper的findById方法
                    one = @One(select = "com.study.mapper.UserMapper.findById")
            )
    })
    public List<Order> findAll();

}

步驟3:配置核心配置檔案

  <!--載入對映關係-->
    <mappers>
        <!--指定介面所在的包-->
        <package name="com.study.mapper"></package>
    </mappers>

步驟4:編寫測試類

public class MyBatisTest2 {
    private OrderMapper mapper;
    @Before
    public void before() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        mapper = sqlSession.getMapper(OrderMapper.class);
    }

    @Test
    public void testSave(){
        List<Order> all = mapper.findAll();
        for (Order order : all) {
            System.out.println(order);
        }
    }
}

多表查詢:一對多查詢

1個使用者對應多個訂單

對應的sql語句:
select * from user;
select * from orders where uid=查詢出使用者的id;

使用主要註解:
@Many
@Result

步驟1:建立User類

public class User {

    private int id;
    private String username;
    private String password;
    private Date birthday;
    //當前使用者具有的訂單
    private List<Order> orderList;
}

步驟2: 修改OrderMapper介面:

 @Select("select * from orders where uid=#{uid}")
  public List<Order> findByUid(int uid);

步驟3:修改Usermapper介面

@Select("select * from user")
    @Results({
<!--id=true代表標識為一個id-->
            @Result(id=true ,column = "id",property = "id"),
            @Result(column = "username",property = "username"),
            @Result(column = "password",property = "password"),
          <!--orderList與 User類裡面的保持一致-->
            @Result(
                    property = "orderList",
                    column = "id",
                    javaType = List.class,
                    many = @Many(select = "com.study.mapper.OrderMapper.findByUid")
            )
    })
    public List<User> findUserAndOrderAll();

步驟4 核心配置檔案匯入mapper介面所在的包:

  <!--載入對映關係-->
    <mappers>
        <!--指定介面所在的包-->
        <package name="com.study.mapper"></package>
    </mappers>

步驟5 測試:

public class MyBatisTest3 {
    private UserMapper mapper;
    @Before
    public void before() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        mapper = sqlSession.getMapper(UserMapper.class);
    }
    @Test
    public void testSave(){
        List<User> userAndOrderAll = mapper.findUserAndOrderAll();
        for (User user : userAndOrderAll) {
            System.out.println(user);
        }
    }
}

多對多查詢

使用者表和角色表的關係為,一個使用者有多個角色,一個角色被多個使用者使用
多對多查詢的需求:查詢使用者同時查詢出該使用者的所有角色

對應的sql語句:
select * from user;
select * from role r,user_role ur where r.id=ur.role_id and ur.user_id=使用者的id

步驟1:建立Role實體,修改User實體

public class User {
    private int id;
    private String username;
    private String password;
    private Date birthday;
    //代表當前使用者具備哪些訂單
    private List<Order> orderList;
    //代表當前使用者具備哪些角色
    private List<Role> roleList;
}

public class Role {
    private int id;
    private String rolename;

}

步驟2:新增UserMapper介面方法

List<User> findAllUserAndRole();

步驟3:使用註解配置Mapper

public interface UserMapper {
    @Select("select * from user")
    @Results({
        @Result(id = true,property = "id",column = "id"),
        @Result(property = "username",column = "username"),
        @Result(property = "password",column = "password"),
        @Result(property = "birthday",column = "birthday"),
        @Result(property = "roleList",column = "id",
                javaType = List.class,
                many = @Many(select = "com.study.mapper.RoleMapper.findByUid"))
})
List<User> findAllUserAndRole();}

public interface RoleMapper {
    @Select("select * from role r,user_role ur where r.id=ur.role_id and ur.user_id=#{uid}")
    List<Role> findByUid(int uid);
}

步驟4:測試結果

public class MyBatisTest4 {
    private UserMapper mapper;
    @Before
    public void before() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        mapper = sqlSession.getMapper(UserMapper.class);
    }


    @Test
    public void testSave(){
        List<User> userAndRoleAll = mapper.findUserAndRoleAll();
        for (User user : userAndRoleAll) {
            System.out.println(user);
        }
    }
}