欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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中方便解析。


相关标签: 多表查询