ssm 多表一对一查询


转载自: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中方便解析。


猜你喜欢

转载自blog.csdn.net/baidu_35975930/article/details/80258403