需求:查询一个订单,与此同时查询该订单所属于的用户(一个订单对应一个用户)
代码详解
查询SQL语句:
-- 先查询订单 SELECT * FROM orders; -- 再根据订单uid外键,查询用户 SELECT * FROM `user` WHERE id = #{订单的uid};
orderMapper接口:在OrderMapper接口中增加 findAllWithUserNested()方法,
/** * 一对一嵌套查询:查询所有订单,并查出每个订单的用户信息(一对一信息) */ public List<Orders> findAllWithUserNested();
OrderMapper.xml映射 :
<resultMap id="OrderMapperNested" type="com.lagou.domain.Orders"> <id property="id" column="id"></id> <result property="ordertime" column="ordertime"></result> <result property="total" column="total"></result> <result property="uid" column="uid"></result> <!--通过第一条SQL的订单查询结果,取其中的uid,执行第二条SQL语句,到User表中去查询该uid对应的用户信息--> <!--问题:1.怎么去执行第二条SQL;2.执行第二条SQL时,如何把uid作为参数进行传递--> <!-- select:告诉程序去执行第二条SQL,内容就是SQL的存放位置,用namespace.id表示(需要执行的SQL存放位置,(com.lagou.mapper.UserMapper).(findById)) column:需要传递的参数名称,也就是第一条SQL中查出来的结果中的uid,对应要传给第二条SQL,通过uid去查询该订单对应的用户信息 --> <association property="user" javaType="com.lagou.domain.User" select="com.lagou.mapper.UserMapper.findById" column="uid"> </association> </resultMap> <!--一对一嵌套查询:查询所有订单,并查出每个订单的用户信息(一对一信息)--> <select id="findAllWithUserNested" resultMap="OrderMapperNested"> SELECT * FROM orders </select>
UserMapper接口
/** * 一对一嵌套查询第二条SQL执行:根据第一条的SQL,取uid参数,在user表中查询该订单对应的用户信息 */ public User findById(int id);
UserMapper.xml映射
<!--一对一嵌套查询第二条SQL执行:根据第一条的SQL,取uid参数,在user表中查询该订单对应的用户信息--> <!--此处因为根据id查询的结果是一个User对象,所以可以用resultType自动封装,而不用resultMap手动封装,内容也就是User实体的全路径--> <select id="findById" resultType="com.lagou.domain.User" parameterType="int"> <!--#{}中表示传递过来的参数,在这里也就是uid。parameterType表示的传递参数的类型,基本数据类型可以用映射名表示,其他类型用全路径名(/**/不能注释,会报错)--> SELECT * FROM user WHERE id = #{uid} </select>
测试代码
/** * 一对一嵌套查询:查询所有订单,并查出每个订单的用户信息(一对一信息) */ @Test public void test4() throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = build.openSession(); OrderMapper mapper = sqlSession.getMapper(OrderMapper.class); List<Orders> orders = mapper.findAllWithUserNested(); for (Orders order : orders) { System.out.println(order); } }
知识点总结