转载自:http://codingxiaxw.cn/2016/11/09/37-mybatis%E5%AE%9E%E7%8E%B0%E9%AB%98%E7%BA%A7%E6%98%A0%E5%B0%84/
创建一个用户表、订单表;
查询订单信息关联查询用户信息。这里我们知道一个用户可以有多张订单,而一张订单只能属于一个用户,所以用户与订单间的关系是一对多而订单与用户间的关系是一对一。所以这里我们将订单表作为主查询表来关联用户表,从而实现一对一映射。
注:创建dao、domain、mapping我就创建了,创建请去这里
使用resultType实现一对一映射
通过查询语句,查询到的结果同时包括user表和orders表两张表的列,那么我们将结果映射到哪个pojo对象中呢?若映射到User.java,那查询结果中对应的orders表的字段一定会遗失;若映射到Orders.java,那查询结果中对应的user表的字段同样也会遗失。所以这里需要我们针对查询的结果重新创建一个映射的pojo对象OrderCustom.java:复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20/**订单的扩展对象,用于完成订单和用户查询结果的映射*/ public class OrderCustom extends Orders{ //补充用户的信息 private String username; public String getUsername() { return username; } public void setUsername(String username) { this.username= username; } @Override public String toString() { return "DicEmp [username=" + username+ "]"; } }
这里我们让OrderCustom.java继承自Order.java,这样我们就只需在OrderCustom.java中添加user表中的字段即可。因为MyBatis主要的重点在sql语句,所以我们完成配置和pojo对象的建立后主要的点就放在了sql语句上,所以接下来要定义写sql语句的mapper.xml和对数据库进行操作的mapper.java接口了.
sql查询语句
复制代码
OrdersMapperCustom.xml文件内容如下:
1
2
3SELECT orders.*,user.username,user.sex FROM orders,user WHERE orders.user_id = user.id
复制代码
1
2
3
4
5
6
7<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > 。。。。。。省略。。。。。。。。 <!-- resultType实现.多表间的一对一查询 数据库的名称要和domain的一样不然要重命名--> <select id="findUserRoleList" resultType="com.gx.lyf.user.domain.UserCustom">
复制代码
</mapper>
1
2
3
4
5SELECT orders.*,user.username,user.sex FROM orders,user WHERE orders.user_id = user.id </select>
dao:
复制代码
1List<User> findUserRoleList();
service:
复制代码
1
2//resultType实现.多表间的一对一查询 查询用户信息关联查询角色信息 public List<UserCustom> findUserRoleList();
service.impl:
复制代码
1
2
3
4
5
6
7
8/** * resultType实现.多表间的一对一查询 * 查询用户信息关联查询角色信息 */ @Override public List<UserCustom> findUserRoleList() { return this.userMapper.findUserRoleList(); }
controller:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17/** * resultType实现.多表间的一对一查询 * 查询用户信息关联查询角色信息 * @return */ @RequestMapping(value="/list",method=RequestMethod.GET) public ModelAndView findAllList(){ List<UserCustom> list = userOrleService.findUserRoleList(); if (list.size() > 0) { modelAndView = new ModelAndView("/user/manymain2"); } else { System.out.println("没有数据或查询失败!"); modelAndView = new ModelAndView("redirect:login.html"); } modelAndView.addObject("user", list); return modelAndView; }
使用resultMap实现一对一映射
思路:将关联查询的信息映射到pojo中,如下:只需在Orders类中创建一个User属性,将关联查询的信息映射到User属性中。复制代码
1
2
3
4
5
6
7
8public class Orders { private Integer id; private String name; private User user;
复制代码
1。。。。。。省略。。。。。。。。
get/set方法
}
这样我们便可以将查询的结果映射到Orders.java类中,而不用自己再自定义一个pojo了。
修改OrdersMapperCustom.xml中的内容(添加并使用resultMap标签),:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <resultMap id="UserRoleResultMap" type="com.gx.lyf.user.domain.User" > <id column="u_id" property="uId" jdbcType="INTEGER" /> <result column="r_id" property="rId" jdbcType="INTEGER" /> <result column="user_name" property="userName" jdbcType="VARCHAR" /> <result column="password" property="password" jdbcType="VARCHAR" /> <result column="age" property="age" jdbcType="INTEGER" /> <association property="role" javaType="com.gx.lyf.user.domain.Role"> <id column="r_id" property="rId" /> <result column="role_name" property="roleName" /> <result column="remark" property="remark" /> </association> </resultMap> <!-- resultMap实现.多表间的一对一查询 --> <select id="findUserRoleListResultMap" resultMap="UserRoleResultMap">
复制代码
</mapper>其他和什么一样,我就不写了
1
2
3
4SELECT orders.*,user.username,user.sex FROM orders,user WHERE orders.user_id = user.id </select>
复制代码
1
复制代码
1。。。。。。省略一万字。。。。。。。。
比较resultType和resultMap完成一对一映射
- resultType:要自定义pojo 保证sql查询列和pojo的属性对应,这种方法相对较简单,所以应用广泛。
- resultMap:使用association完成一对一映射需要配置一个resultMap标签,过程有点复杂,如果要实现延迟加载就只能用resultMap实现 ,如果为了方便对关联信息进行解析,也可以用association将关联信息映射到pojo中方便解析。
最后
以上就是着急黄豆最近收集整理的关于ssm 多表一对一查询的全部内容,更多相关ssm内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复