用户和订单的需求

通过查询订单,查询用户,就是一对一查询

(1)自定义JavaBean(常用,推荐使用)

     <select id="queryOrderUser" resultType="OrderUser">
SELECT o.id,o.user_id,u.name,o.productname
FROM t_order o LEFT JOIN t_user u ON o.user_id= u.id
</select>

OrderUser.java:

 package cn.sm1234.domain;

 public class OrderUser extends Order {

     //Order中没有name
private String name; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} }
     @Test
public void test1() {
SqlSession sqlSession = SessionUtils.getSession();
// getMapper(): 返回指定接口的动态代理的实现类对象
OrderDao dao = sqlSession.getMapper(OrderDao.class);
List<OrderUser> list = dao.queryOrderUser();
for (OrderUser orderUser : list) {
System.out.println(orderUser.getName()+"-"+orderUser.getProductname());
}
sqlSession.commit();
sqlSession.close();
}

OrderDao.java:

 public interface OrderDao {

     /**
* 查询订单,并且关联查询用户信息
*/
public List<OrderUser> queryOrderUser();
}

(2)ResultMap封装

     <!-- type="实体类" -->
<resultMap type="Order" id="OrderUserResultMap">
<id column="id" property="id"/>
<result column="productname" property="productname"/>
<result column="orderno" property="orderno"/>
<!-- user_id封装到User中 -->
<!-- 关联属性
property:关联属性名称(Order类中的user)
javaType:类型(User (即User user))
-->
<association property="user" javaType="User">
<!-- column中的字段名称应该为当前查询结果的字段名称 -->
<id column="user_id" property="id"/>
<result column="name" property="name"/>
<result column="password" property="password"/>
</association> </resultMap> <select id="queryOrderUserResultMap" resultMap="OrderUserResultMap">
SELECT o.id,o.user_id,u.name,o.productname
FROM t_order o LEFT JOIN t_user u ON o.user_id= u.id
</select>

Order.java:

 package cn.sm1234.domain;

 public class Order {

     private Integer id;
private String productname;
private String orderno;
private Integer userId; private User user; public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getProductname() {
return productname;
}
public void setProductname(String productname) {
this.productname = productname;
}
public String getOrderno() {
return orderno;
}
public void setOrderno(String orderno) {
this.orderno = orderno;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
} }
     /**
* 查询订单,查询用户(ResultMap)
* @return
*/
public List<Order> queryOrderUserResultMap();
     @Test
public void test2() {
SqlSession sqlSession = SessionUtils.getSession();
// getMapper(): 返回指定接口的动态代理的实现类对象
OrderDao dao = sqlSession.getMapper(OrderDao.class);
List<Order> list = dao.queryOrderUserResultMap();
for (Order order : list) {
System.out.println(order.getProductname()+"-"+order.getUser().getName());
}
sqlSession.commit();
sqlSession.close();
}

Mybatis进阶学习笔记——关系查询——一对一查询的更多相关文章

  1. Mybatis进阶学习笔记——关系查询——一对多查询

    一个客户拥有多个订单 <resultMap type="User" id="UserOrderResultMap"> <id column=& ...

  2. Mybatis进阶学习笔记——动态代理方式开发Dao接口、Dao层(推荐第二种)

    1.原始方法开发Dao Dao接口 package cn.sm1234.dao; import java.util.List; import cn.sm1234.domain.Customer; pu ...

  3. Mybatis进阶学习笔记——动态sql

    1.if标签 <select id="queryByNameAndTelephone" parameterType="Customer" resultTy ...

  4. Mybatis进阶学习笔记——输出映射

    输出映射(例如一个方法的返回至使用什么类型去接收) 1.基本类型 <!-- 统计记录数 --> <select id="queryTotalCount" resu ...

  5. Mybatis进阶学习笔记——输入映射

    1.输入映射 输入映射支持的类型: 1) 基本的类型,int,String,double 等(*)2) JavaBean 类型(*)3) 包装JavaBean 类型(对象里面包含另一个对象) 1.1基 ...

  6. IBatis.Net学习笔记六--再谈查询

    在IBatis.Net学习笔记五--常用的查询方式 中我提到了一些IBatis.Net中的查询,特别是配置文件的写法. 后来通过大家的讨论,特别是Anders Cui 的提醒,又发现了其他的多表查询的 ...

  7. SQL反模式学习笔记18 减少SQL查询数据,避免使用一条SQL语句解决复杂问题

    目标:减少SQL查询数据,避免使用一条SQL语句解决复杂问题 反模式:视图使用一步操作,单个SQL语句解决复杂问题 使用一个查询来获得所有结果的最常见后果就是产生了一个笛卡尔积.导致查询性能降低. 如 ...

  8. 数据库学习笔记3 基本的查询流 2 select lastname+','+firstname as fullname order by lastname+','+firstname len() left() stuff() percent , select top(3) with ties

    数据库学习笔记3 基本的查询流 2   order by子句对查询结果集进行排序 多列和拼接 多列的方式就很简单了 select firstname,lastname from person.pers ...

  9. 爱了!阿里大神最佳总结“Flutter进阶学习笔记”,理论与实战

    前言 "小步快跑.快速迭代"的开发大环境下,"一套代码.多端运行"是很多开发团队的梦想,美团也一样.他们做了很多跨平台开发框架的尝试:React Native. ...

随机推荐

  1. day22 time模块

    表示方式有三种 时间戳 给机器看的 float格式 格式化的字符传 给人看的 格式化时间 元祖 计算用的 结构化时间 1 # 时间戳时间 2 # 返回一个时间戳,表示从1970.1.1日到现在的秒数 ...

  2. JVM 内存区域 (运行时数据区域)

    JVM 内存区域 (运行时数据区域) 链接:https://www.jianshu.com/p/ec479baf4d06 运行时数据区域 Java 虚拟机在执行 Java 程序的过程中会把它所管理的内 ...

  3. OCIEnvCreate 失败,返回代码为 -1,但错误消息文本不可用

    解决方案:oracle 版本太低,请装11G或以上版本..

  4. 【LG 4831】Scarlet loves WenHuaKe(生成函数)

    题目链接 一道好题,第一次用生成函数做题.感谢赛珂狼教我这个做法. 首先我们显然可以把题目中的限制转化成一个二分图的模型:左边有$n$个点,右边有$m$个点,如果在棋盘$(i,j)$这个点上放了炮,那 ...

  5. 洛谷 P4174 [NOI2006]最大获利 解题报告

    P4174 [NOI2006]最大获利 题目描述 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU 集团旗下的 CS&T 通讯公司在新一代通讯技术血战的前夜,需要 ...

  6. luogu4197 Peaks (kruskal重构树+主席树)

    按照边权排序建出kruskal重构树,每次就变成了先找一个权值<=x的最远的祖先,然后看这个子树的第k小.离散化一下,在dfs序上做主席树即可 而且只需要建叶节点的主席树 注意输出的是第k小点的 ...

  7. bzoj1007/luogu3194 水平可见直线 (单调栈)

    先按斜率从小到大排序,然后如果排在后面的点B和前面的点A的交点是P,那B会把A在P的右半段覆盖掉,A会把B在P的左半段覆盖掉. 然后如果我们现在又进来了一条线,它跟上一条的交点还在上一条和上上条的左边 ...

  8. A1102. Invert a Binary Tree

    The following is from Max Howell @twitter: Google: 90% of our engineers use the software you wrote ( ...

  9. Skype 使用小技巧

    原文发布在个人独立博客上,链接:http://maxpeng.vipcloud.me/2016/09/01/skype-tricks-tips/   Skype 作为一个即时聊天工具,相信大家都不陌生 ...

  10. vuejs怎么在服务器部署?(知乎)

    作者:知乎用户链接:https://www.zhihu.com/question/46630687/answer/157166318来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...