5.2Java EE——基于注解的关联查询

一、一对一查询

        接下来,以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中的元素下引入IdCardMapper和PersonMapper接口。



元素引入XML文件顺序

        由于mybatis-config.xml文件中的扫描方式是从上往下扫描,所以元素下引入IdCardMapper和PersonMapper接口的位置,必须在引入IdCardMapper.xml和PersonMapper.xml文件位置前面,否则程序将会首先读取到引入的IdCardMapper.xml和PersonMapper.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中的元素下引入UsersMapper和OrdersMapper接口。 



元素引入XML文件顺序

        由于mybatis-config.xml文件中的扫描方式是从上往下扫描,所以元素下引入UsersMapper和OrdersMapper接口的位置,必须在引入UsersMapper.xml和OrdersMapper.xml文件位置前面,否则程序将会首先读取到引入的UsersMapper.xml和OrdersMapper.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中的元素下引入ProductMapper和OrdersMapper接口,将这两个接口加载到核心配置文件中。

   

元素引入XML文件的顺序

        注意:由于mybatis-config.xml文件中的扫描方式是从上往下扫描,所以元素下引入ProductMapper和OrdersMapper接口的位置,必须在引入ProductMapper.xml和OrdersMapper.xml文件位置前面,否则程序将会首先读取到引入的ProductMapper.xml和OrdersMapper.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();

}

你可能感兴趣的:(java-ee,java)