ssm 多表一对一查询
程序员文章站
2022-05-29 21:58:52
...
转载自: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:/**订单的扩展对象,用于完成订单和用户查询结果的映射*/
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查询语句
SELECT orders.*,user.username,user.sex
FROM orders,user
WHERE orders.user_id = user.id
OrdersMapperCustom.xml文件内容如下:<?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">
SELECT orders.*,user.username,user.sex
FROM orders,user
WHERE orders.user_id = user.id
</select>
</mapper>dao:
List<User> findUserRoleList();
service:
//resultType实现.多表间的一对一查询 查询用户信息关联查询角色信息
public List<UserCustom> findUserRoleList();
service.impl:
/**
* resultType实现.多表间的一对一查询
* 查询用户信息关联查询角色信息
*/
@Override
public List<UserCustom> findUserRoleList() {
return this.userMapper.findUserRoleList();
}
controller:
/**
* 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属性中。public class Orders {
private Integer id;
private String name;
private User user;
。。。。。。省略。。。。。。。。
get/set方法
}
这样我们便可以将查询的结果映射到Orders.java类中,而不用自己再自定义一个pojo了。
修改OrdersMapperCustom.xml中的内容(添加并使用resultMap标签),:
<?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">
SELECT orders.*,user.username,user.sex FROM orders,user WHERE orders.user_id = user.id </select></mapper>其他和什么一样,我就不写了
。。。。。。省略一万字。。。。。。。。
比较resultType和resultMap完成一对一映射
- resultType:要自定义pojo 保证sql查询列和pojo的属性对应,这种方法相对较简单,所以应用广泛。
- resultMap:使用association完成一对一映射需要配置一个resultMap标签,过程有点复杂,如果要实现延迟加载就只能用resultMap实现 ,如果为了方便对关联信息进行解析,也可以用association将关联信息映射到pojo中方便解析。