Mybatis级联查询

Mybatis查询

  • 用户表和订单表,一个用户有多个订单,一个订单只对应一个用户,两者一对多关系

Orders表:image-20200925210857838 Customer表:image-20200925210918038

mybatis-config配置文件

<environments default="development">
      <environment id="development">
          <transactionManager type="JDBC"/>
          <dataSource type="POOLED">
              <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
              <property name="url"
                        value="jdbc:mysql://localhost:3306/test?serverTimezone=UTC&amp;characterEncoding=utf-8"/>
              <property name="username" value="root"/>
              <property name="password" value="123456"/>
          </dataSource>
      </environment>
  </environments>

  <mappers>
      <package name="com.hjy.mybatis.test.dao"/>
  </mappers>

bean创建

//Customer
public class Customer {
    
    
    private Integer cid;
    private String cname;
    private String cpassword;
    private List<Orders> ordersList;
}
        
//Orders
public class Orders {
    
    
    private Integer oid;
    private String oname;
    private Customer customer;
}

dao创建

//Customer
public interface CustomerMapper {
    
    
    List<Orders> selectUserOrderById(Integer cid);
}
//Orders
public interface OrdersMapper {
    
    
    Orders selectOrdersById(Integer oid);
}

1、一对一查询
查询Orders:一个订单只属于一个用户,根据Orders的id查询与之唯一对应的Customer

<!--
    namespace对应dao接口,xml文件必须和dao名字一样
    resultMap用于查询查询字段和数据库列名不一致情况、级联查询
    resultMap里的id必须写,如果其余字段与数据库列名一致,可以使用autoMapping=true
    association用与一对一查询,使用javaType
    collection用域多对多查询,使用ofType
	column对应数据库列名,property对应bean字段
-->
<mapper namespace="com.hjy.mybatis.test.dao.OrdersMapper">
    <resultMap id="selectOrdersById_Map" type="com.hjy.mybatis.test.bean.Orders" autoMapping="true">
        <id column="oid" property="oid"/>
        <association property="customer" javaType="com.hjy.mybatis.test.bean.Customer" autoMapping="true">
            <id column="cid" property="cid"/>
        </association>
    </resultMap>

    <select id="selectOrdersById" resultMap="selectOrdersById_Map" parameterType="int">
        select * from
        orders inner JOIN customer on
        oid = #{oid} and orders.cid = customer.cid
    </select>
</mapper>

2、一对多查询
查询Customer:一个用户多个订单,根据Customer的id查找他所有的Orders

<mapper namespace="com.hjy.mybatis.test.dao.CustomerMapper">
    <resultMap id="selectUserOrderById_Map" type="com.hjy.mybatis.test.bean.Customer" autoMapping="true">
        <id column="cid" property="cid"/>
        <collection property="ordersList" ofType="com.hjy.mybatis.test.bean.Orders" autoMapping="true">
            <id column="oid" property="oid"/>
        </collection>
    </resultMap>

    <select id="selectUserOrderById" resultMap="selectUserOrderById_Map">
        select * from customer
        inner join orders on customer.cid = #{cid}
    </select>
</mapper>

查询
sessionUtils.java

//静态方法获取session对象
public class SessionUtils {
    
    
    private static SqlSessionFactory sqlSessionFactory;
    static {
    
    
        String resource = "com\\hjy\\mybatis\\config\\mybatis-config.xml";
        InputStream inputStream = null;
        try {
    
    
            inputStream = Resources.getResourceAsStream(resource);
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    }
    public static SqlSession getSession() {
    
    
        return sqlSessionFactory.openSession(true);
    }
}

main方法

public class App {
    
    
    public static void main(String[] args) {
    
    
        try(SqlSession session = SessionUtils.getSession()) {
    
    
            //一对一查询
            OrdersMapper mapper = session.getMapper(OrdersMapper.class);
            Orders orders = mapper.selectOrdersById(2);
            System.out.println(orders);

            //多对多查询
            CustomerMapper mapper1 = session.getMapper(CustomerMapper.class);
            List<Orders> orders1 = mapper1.selectUserOrderById(2);
            System.out.println(orders1);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_33473340/article/details/108804667