需求:查询所有订单信息,关联查询下单用户信息。
注意:因为一个订单信息只会是一个人下的订单,所以从查询订单信息出发关联查询用户信息为一对一查询。(订单表为主表 一对一)
如果从用户信息出发查询用户下的订单信息则为一对多查询,因为一个用户可以下多个订单。(用户表为主表 一堆多)
sql语句:
SELECT o.id, o.user_id userId, o.number, o.createtime, o.note, u.username, u.address FROM `order` o LEFT JOIN `user` u ON o.user_id = u.id
因为要查询的数据两个表都有,所以这里直接写一个封装继承订单表,但是写用户表的 用户名和地址属性
在写toString的时候要吧
也选上才行
因为这里是订单表为主表 所以这里的mapper写到OrdersMappers里面去
这里的resultType(返回值)写的是我们所刚创建的封装类
因为这里的字段名和我们封装类的属性不一致 所以为了遍历取的别名
然后在去接口里写方法:
然后去测试类测试
@Test public void get2() throws IOException { // 1.创建SqlSessionFactoryBuilder对象 SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); // 2. 加载SqlMapConfig.xml配置文件 InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml"); // 3. 创建SqlSessionFactory对象 SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream); // 4. 创建SqlSession对象 SqlSession sqlSession = sqlSessionFactory.openSession(); // 获取UserMapper的动态代理对象(实现类对象) OrdersMapper ordersMapper=sqlSession.getMapper(OrdersMapper.class); List<OrdersUser> list=ordersMapper.getoradersUser(); System.out.println(list); // 7. 释放资源 sqlSession.close(); }
使用resultMap,定义专门的resultMap用于映射一对一查询结果。
先改造一下我们之前封装的订单表orders表
加一个user对象,然后get set tostring都点出来
然后因为orders是主表所以取ordersmapper.xml里
<resultMap type="orders" id="getOuser"> <id property="id" column="id"/> <result property="userId" column="user_id"/> <result property="number" column="number"/> <result property="createtime" column="createtime"/> <result property="note" column="note"/> <!-- 一对一 --> <association property="user" javaType="user"> <id property="id" column="user_id"/> <result property="username" column="username"/> <result property="address" column="address"/> </association> </resultMap> <!-- 查询所有订单信息关联用户(一对一)(resultMap) --> <select id="getOrdersAndUser" resultMap="getOuser"> SELECT o.id, o.user_id, o.number, o.createtime, o.note, u.username, u.address FROM orders o LEFT JOIN user u ON o.user_id = u.id </select>
然后到接口里写方法:
在到测试类:
@Test public void get3() throws IOException { // 1.创建SqlSessionFactoryBuilder对象 SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); // 2. 加载SqlMapConfig.xml配置文件 InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml"); // 3. 创建SqlSessionFactory对象 SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream); // 4. 创建SqlSession对象 SqlSession sqlSession = sqlSessionFactory.openSession(); // 获取UserMapper的动态代理对象(实现类对象) OrdersMapper ordersMapper=sqlSession.getMapper(OrdersMapper.class); List<Orders> list=ordersMapper.getOrdersAndUser(); System.out.println(list); // 7. 释放资源 sqlSession.close(); }
案例:查询所有用户信息及用户关联的订单信息。
用户信息和订单信息为一对多关系。
sql语句:
SELECT u.id, u.username, u.birthday, u.sex, u.address, o.id oid, o.number, o.createtime, o.note FROM `user` u LEFT JOIN `order` o ON u.id = o.user_id
先改造User类:
然后吧get set tostring都点出来
在到UserMapper.xml里写(因为主表是用户表)
<resultMap type="user" id="getUser"> <id property="id" column="id"/> <result property="username" column="username"/> <result property="birthday" column="birthday"/> <result property="sex" column="sex"/> <result property="address" column="address"/> <collection property="list" javaType="list" ofType="Orders"> <id property="id" column="oid"/> <result property="number" column="number"/> <result property="createtime" column="createtime"/> <result property="note" column="note"/> </collection> </resultMap> <!-- 查有用户信息并关联查询订单信息 --> <select id="getUserAndOrders" resultMap="getUser"> SELECT u.id, u.username, u.birthday, u.sex, u.address, o.id oid, o.number, o.createtime, o.note FROM user u LEFT JOIN order o ON u.id = o.user_id </select>
上面还是照常封装
然后下面封装list property是你封装类的里变量名,javatype:声明你的集合是个什么类型,java里面是个什么类型 oftype:泛型
在接口:
在到测试类:
@Test public void get12() throws IOException { // 1.创建SqlSessionFactoryBuilder对象 SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); // 2. 加载SqlMapConfig.xml配置文件 InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml"); // 3. 创建SqlSessionFactory对象 SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream); // 4. 创建SqlSession对象 SqlSession sqlSession = sqlSessionFactory.openSession(); //获取UserMapper的动态代理对象(实现类对象) UserMapper userMapper=sqlSession.getMapper(UserMapper.class); List<User> list=userMapper.getUserAndOrders(); System.out.println(list); // 7. 释放资源 sqlSession.close(); }
原文:https://www.cnblogs.com/www1842564021/p/12612441.html