一、一对一查询
接下来,以4.2节中使用的tb_idcard和tb_person数据表为例,详细讲解基于注解@One实现
tb_idcard和tb_person数据表之间的一对一关联查询,具体步骤如下。
1、创建持久化类:本案例使用4.2节中的IdCard类和Person类作为持久类。
2、编写接口方法:
(1)创建IdCardMapper接口,在该接口中编写selectIdCardById()方法,通过id查询人员对应的身份证信息。
package com.mac.dao;
import com.mac.pojo.IdCard;
import org.apache.ibatis.annotations.Select;
public interface IdCardMapper {
@Select("select * from tb_idcard where id=#{id}")
IdCard selectIdCardById(int id);
}
3、编写接口方法:
(2)在项目的com.mac.dao包下创建PersonMapper接口,在该接口中编写selectPersonById(),通过id查询人员信息。
package com.mac.dao;
public interface PersonMapper {
@Select("select * from tb_person where id=#{id}")
@Results({@Result(column = "card_id",property = "card",
one = @One(select = "com.mac.dao.IdCardMapper.selectIdCardById"))})
Person selectPersonById(int id);
}
@Result注解的三个属性及含义
(1)property属性用来指定关联属性,这里为card。
(2)column属性用来指定关联的数据库表中的字段,这里为card_id。
(3)one属性用来指定数据表之间属于哪种关联关系,通过@One注解表明数据表tb_idcard和tb_person之间是一对一关联关系。
4、引入接口:
在核心配置文件mybatis-config.xml中的
由于mybatis-config.xml文件中的扫描方式是从上往下扫描,所以
编写测试类:在测试类MyBatisTest中,编写测试方法selectPersonByIdTest()。
public void selectPersonByIdTest() {
// 1.通过工具类生成SqlSession对象
SqlSession session = MyBatisUtils.getSession();
PersonMapper mapper = session.getMapper(PersonMapper.class);
// 2.查询id为1的人员的信息
Person person = mapper.selectPersonById(2);
System.out.println(person.toString());
session.close(); // 3.关闭SqlSession
}
二、 一对多查询
接下来,以4.3节中的tb_user和tb_orders数据表为例,详细讲解基于@Many注解配置实现
tb_user和tb_orders数据表之间的一对多关联查询,具体步骤如下。
1、创建持久化类:本案例使用4.3节中的Users类和Orders类作为持久类。
2、编写接口方法:
(1)创建OrdersMapper接口,在该接口中编写selectOrdersByUserId()方法,通过user_id查询用户对应的订单信息。
public interface OrdersMapper {
@Select("select * from tb_orders where user_id=#{id} ")
@Results({@Result(id = true,column = "id",property = "id"),
@Result(column = "number",property = "number") })
List selectOrdersByUserId(int user_id);
}
3、编写接口方法:
(2)创建UsersMapper接口,在该接口中编写selectUserById()方法,通过id查询用户信息。
public interface UsersMapper {
@Select("select * from tb_user where id=#{id} ")
@Results({@Result(id = true,column = "id",property = "id"),
@Result(column = "username",property = "username"),
@Result(column = "address",property = "address"),
@Result(column = "id",property = "ordersList",
many = @Many(select = "com.mac.dao.OrdersMapper.selectOrdersByUserId"))})
Users selectUserById(int id);
}
4、引入接口:
在核心配置文件mybatis-config.xml中的
由于mybatis-config.xml文件中的扫描方式是从上往下扫描,所以
编写测试类:在测试类MyBatisTest中,编写测试方法selectUserByIdTest()。
public void selectUserByIdTest() {
// 1.通过工具类生成SqlSession对象
SqlSession session = MyBatisUtils.getSession();
UsersMapper mapper = session.getMapper(UsersMapper.class);
// 2.查询id为1的人的信息
Users users = mapper.selectUserById(1);
System.out.println(users.toString());
session.close();
}
三、多对多查询
多对多关联使用中间表
在数据库中,表与表之间的多对多关联关系通常使用一个中间表来维护,以4.4节中使用的订单表tb_orders和商品表tb_product为例,这两个表之间的关联关系使用了一个中间表tb_ordersitem来维护,订单表tb_orders和商品表tb_product,都与中间表tb_ordersitem形成了一对多关联关系,即中间表tb_ordersitem将订单表tb_orders和商品表tb_product拆分成了两个一对多的关联关系。
接下来,以4.4节中使用的订单表tb_orders、商品表tb_product和中间表tb_ordersitem为例,详细讲解多对多关联查询,具体步骤如下。
1、在订单持久化类(Orders.java)中增加商品集合的属性及其对应的getter/setter方法,并修改Orders类和Product类中的toString()方法。
@Override
public String toString() {return "Orders{" +
"id=" + id + ", number=" + number + ", productList=" + productList + '}’;}
@Override
public String toString() {return "Product{" +
"id=" + id + ", name=" + name +", price=" + price + '}';
}
2、(1)创建ProductMapper接口,在该接口中编写selectProductByOrdersId()方法,通过user_id查询用户对应的订单信息。
public interface ProductMapper {
@Select("select * from tb_product where id in
(select product_id from tb_ordersitem where orders_id = #{id} )")
List selectProductByOrdersId(int orders_id);
}
(2)、在OrdersMapper接口中添加selectOrdersById()方法,该方法用于通过id查询订单信息。
@Select("select * from tb_orders where id=#{id} ")
@Results({@Result(id = true,column = "id",property = "id"),
@Result(column = "number",property = "number"),
@Result(column = "id",property = "productList",many = @Many(select = "com.mac.dao.ProductMapper.selectProductByOrdersId"))})
Orders selectOrdersById(int id);
3、在核心配置文件mybatis-config.xml中的
注意:由于mybatis-config.xml文件中的扫描方式是从上往下扫描,所以
在测试类MyBatisTest中,编写测试方法selectOrdersByIdTest(),查询id为3的订单的信息。
public void selectOrdersByIdTest() {
// 1.通过工具类生成SqlSession对象
SqlSession session = MyBatisUtils.getSession();
OrdersMapper mapper = session.getMapper(OrdersMapper.class);
// 2.查询id为3的订单的信息
Orders orders = mapper.selectOrdersById(3);
System.out.println(orders.toString());
session.close();
}