mybatis-註解實現複雜查詢-多表查詢-(2)
阿新 • • 發佈:2021-12-17
實現複雜關係對映之前我們可以在對映檔案中通過配置
多表查詢:一對一查詢
使用者表和訂單表的關係為,一個使用者有多個訂單,一個訂單隻從屬於一個使用者
對應的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);
}
}
}