商品订单数据模型
注意:因为一个订单信息只会是一个人下的订单,所以聪哥查询订单信息出发关联查询用户信息为一对一查询。如果从用户信息出发查询用户下的订单信息则为一对多查询,因为一个用户可以下多个订单。
案例:查询所有用户信息及用户关联的订单信息
用户信息和订单信息为一对多关系。
使用resultMap实现。
1.将存储数据库表orders信息的类Orders对象定义在User对象中(其实本质上就是谁是对应关系前面的一,就将它作为返回类型,将另一个类对象定义在它的里面)。User类的定义内容为:
package com.huida.po; import java.util.Date; import java.util.List; public class User { private int id; private String username;// 用户姓名 private String sex;// 性别 private Date birthday;// 生日 private String address;// 地址 private List<Orders> list; public List<Orders> getList() { return list; } public void setList(List<Orders> list) { this.list = list; } public void setId(int id) { this.id = id; } public void setUsername(String username) { this.username = username; } public void setSex(String sex) { this.sex = sex; } public void setBirthday(Date birthday) { this.birthday = birthday; } public void setAddress(String address) { this.address = address; } public int getId() { return id; } public String getUsername() { return username; } public String getSex() { return sex; } public Date getBirthday() { return birthday; } public String getAddress() { return address; } @Override public String toString() { return "User [id=" + id + ", username=" + username + "]"; } }
2.在UserMapper接口中定义方法:
public List<User> findUserAndOrders();
3.在UserMapper.xml中进行配置:
<resultMap type="com.huida.po.User" id="userAndOrdersResultMap"> <id column="id" property="id"/> <result column="username" property="username"/> <result column="sex" property="sex"/> <result column="birthday" property="birthday"/> <result column="address" property="address"/> <collection property="list" ofType="com.huida.po.Orders"> <!-- id标签指定主键字段的对应关系 --> <id column="oid" property="id"></id> <!-- result标签指定非主键字段的对应关系 --> <result column="user_id" property="userId"/> <result column="number" property="number"/> <result column="createtime" property="createtime"/> </collection> </resultMap> <select id="findUserAndOrders" resultMap="userAndOrdersResultMap"> <!-- select后面的属性名必须和UserOrders中定义的属性名相同 --> select a.*,b.id oid,number,createtime from user a,orders b where a.id=b.user_id </select>
注意这里使用的是collection标签。
collection部分定义了用户关联的订单信息。表示关联查询结果集
property="list":关联查询的结果集存储在User对象的上哪个属性。
ofType="com.huida.po.Orders":指定关联查询的结果集中的对象类型即List中的对象类型。此处可以使用别名,也可以使用全限定名。
<id />及<result/>的意义同一对一查询。
4.测试代码:
package com.huida.test; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import javax.management.Query; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Before; import org.junit.Test; import org.omg.PortableInterceptor.USER_EXCEPTION; import com.huida.mapper.UserMapper; import com.huida.po.Orders; import com.huida.po.User; import com.huida.po.UserOrders; import com.huida.vo.QueryVo; public class UserMapperTest { private SqlSessionFactory factory=null; @Before public void init() throws Exception{ //通过流将核心配置文件读取进来 InputStream inputStream=Resources.getResourceAsStream("config/SqlMapConfig.xml"); //通过核心配置文件输入流来创建工厂 factory=new SqlSessionFactoryBuilder().build(inputStream); } @Test public void testfindUserAndOrders(){ //创建SqlSession SqlSession openSession=factory.openSession(); //通过会话的getMapper方法来实例化接口(实现类的对象) UserMapper userMapper=openSession.getMapper(UserMapper.class);//参数放接口的字节码文件 List<User> list=userMapper.findUserAndOrders(); for(User user:list){ System.out.println(user.getUsername()+"...."+user.getList()); } } }