Mybatis多表查询(一对一、一对多映射实例)

1.首先数据库中存在两张表,用户表User、角色表Role。

2.分析表User和表Role的映射关系。

 

User对Role:一对一。

Role对User:一对多。

一对一、多对一:使用association标签。

一对多、多对多:使用collection标签。

3.一对一映射实例。

3.1:使用SQL语句查询User表与Role表中相同的roleId与输入的值匹配,然后将Role表中的字段roleName的记录输出。

3.2:使用Maven创建生成多表文章使用Maven搭建mybatis工程

3.3:主表User的xml文件。

<resultMap id="BaseResultMap" type="com.openlab.pojo.User" >
<!--id就是第一个查询标签中的resultMap的引用,type是实体类的全类名-->
    <!--
      WARNING - @mbggenerated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Tue Jul 28 20:18:38 CST 2020.
    -->
    <id column="id" property="id" jdbcType="VARCHAR" />
    <result column="username" property="username" jdbcType="VARCHAR" />
    <result column="password" property="password" jdbcType="VARCHAR" />
    <result column="roleId" property="roleid" jdbcType="INTEGER" />
    <result column="iconURL" property="iconurl" jdbcType="VARCHAR" />
    <association property="role" javaType="com.openlab.pojo.Role">
       <id column="roleId" property="roleid" jdbcType="INTEGER" />
       <result column="roleName" property="rolename" jdbcType="VARCHAR" />
    </association>
<!--property对应实体类中的属性名-->
<!--column为select标签传参-->
<!--javaType说明property中的值是什么类型-->
 </resultMap>


<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.String" >
<!--id为接口中实现的方法名,resultMap为返回值类型,由于返回值包含一个User对象,所以不能用resultType-->
<!--resultType为返回值类型-->
    <!--
      WARNING - @mbggenerated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Tue Jul 28 20:18:38 CST 2020.
    -->
    select 
    u.id,u.username,u.password,u.iconURL,u.roleId,r.roleId,r.roleName
    from user u,role r
    where u.roleId = r.roleId
    and id = #{id,jdbcType=VARCHAR}
</select>

3.4:实体类User。

    private Role role;

    public Role getRole() {
		return role;
	}

	public void setRole(Role role) {
		this.role = role;
	}
//加入关联的Role角色表

3.5:方法类。

由于一对一查询,SQL语句放回的为单个对象,不需要使用List对象。

3.6:一对一测试类。

package com.openlab.test;

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.log4j.Logger;

import com.openlab.mapper.UserMapper;
import com.openlab.pojo.User;

public class OneToOneTest {
	public static void main(String[] args) {
		try {
			/**
			 * 读取资源文件,用到getResourceAsStream读取。调用classLoderWarapper中的方法,通过对
			 * classLoder[]数组遍历,判断读取的流是否为null,不为null返回InputStream对象
			 */
			InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
			//加载配置文件上边导入的mybatis-config.xml
			SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
			SqlSession session = factory.openSession();	
			UserMapper mapper = session.getMapper(UserMapper.class);

			User user = mapper.selectByPrimaryKey("00001");
			System.out.println(user.getRole().getRolename());
			//获取User表中id为00001对象中的属性roleId与Role表中roleId相等的Role表中属性RoleName值
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

3.7:结果呈现。

4.一对多映射实例。

4.1:查询下是管理员的用户有哪些?

4.2:使用Maven创建生成多表文章使用Maven搭建mybatis工程

4.3:主表Role的xml文件。

  <resultMap id="BaseResultMap" type="com.openlab.pojo.Role" >
<!--id就是查询标签中的resultMap的引用,type是实体类的全类名-->
    <!--
      WARNING - @mbggenerated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Tue Jul 28 20:18:38 CST 2020.
    -->
    <id column="roleId" property="roleid" jdbcType="INTEGER" />
    <result column="roleName" property="rolename" jdbcType="VARCHAR" />
    <collection property="user" javaType="ArrayList" ofType="com.openlab.pojo.User">
    	<id column="id" property="id" jdbcType="VARCHAR" />
    	<result column="username" property="username" jdbcType="VARCHAR" />
   		<result column="password" property="password" jdbcType="VARCHAR" />
    	<result column="roleId" property="roleid" jdbcType="INTEGER" />
    	<result column="iconURL" property="iconurl" jdbcType="VARCHAR" />
    </collection>
<!--ofType 映射到集合中的实体类的全类名,就是list集合中是User-->
<!--javaType 属性的类型,可以写成List,或者不写这个属性-->
<!--collection 表示这个类型是一个集合-->
  </resultMap>

  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
    <!--
      WARNING - @mbggenerated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Tue Jul 28 20:18:38 CST 2020.
    -->
    select 
    u.id,u.username,u.password,u.iconURL,u.roleId,r.roleId,r.roleName
    from role r,user u
    where r.roleId = #{id,jdbcType=INTEGER}
    and r.roleId = u.roleId
  </select>

4.4:实体类Role。

    private List<User> user;
    
    
    public List<User> getUser(){
    	return user;
    }
    public void setUser(List<User> user){
    	this.user=user;
    }
//加入关联的表User

4.5:方法类。

SQL语句返回的为多个对象,需要使用到List。

 List<Role> selectByPrimaryKey(Integer roleid);

4.6:一对多测试类。

package com.openlab.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.openlab.mapper.RoleMapper;
import com.openlab.pojo.Role;
import com.openlab.pojo.User;

public class OneToManyTest {

	public static void main(String[] args) {
		try {
			InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
			SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
			SqlSession session = factory.openSession();
			RoleMapper mapper = session.getMapper(RoleMapper.class);
            //获取对象集
			List<Role> list =  mapper.selectByPrimaryKey(1);
            //遍历输出结果roleId为1的User对象中的属性Username值
			for(Role i : list){
				for(User j : i.getUser()){
					System.out.println(j.getUsername());
				}
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

4.7:结果呈现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值