mybatis一对多和多对一查询

mapper.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">
<!-- mapper.xml的父标签 namespace+id==类名+方法名 -->
	<!-- 
		如果想让接口和xml关联,必须满足如下配置:
			1.namespace的值是接口的全路径
			2.xml中标签的id必须关联dao接口中的方法名
	-->
<mapper namespace="com.zx.mybatis.mapper.StudentMapper">
	<!-- 
		一对多连接查询方式(方式1)
		写一个连接查询sql,然后在resultMap上做手脚
	 -->
	<!-- <select id="selectAllBanJi" resultMap="bs">
		select s.*,b.name,b.id bid from student s inner join bj b on s.classno=b.id
	</select>
	做手脚后的resultMap
	<resultMap type="BanJi" id="bs">
		<id column="bid" property="classNo"/>
		<result column="name" property="className"/>
		ofType:要写List中泛型的类型
		<collection property="stus" ofType="Student">
			<id column="id" property="id"/>
			<result column="user_name" property="name"/>
			<result column="age" property="age"/>
			<result column="score" property="score"/>
		</collection>
	</resultMap> -->
	<!-- 一对多分步查询方式(方式2) -->
	<!-- 
		1.查询所有班级
		2.拿出第一条班级数据,获取class_id,然后去student表中查询所有class_no为101的学生
	 -->
	<select id="selectAllBanJi" resultMap="bs">
		select b.* from bj b
	</select>
	<select id="selectStuByClassno" resultMap="myStudent">
		select s.* from student s where s.classno = #{abc}
	</select>
	<resultMap type="BanJi" id="bs">
		<id column="id" property="classNo"/>
		<result column="name" property="className"/>
		<!-- stus这个属性是依赖于id为selectStuByClassno子查询 -->
		<collection property="stus" ofType="Student" select="selectStuByClassno" column="id">
		</collection>
	</resultMap>
	<!-- 多对一连接查询方式(方式1) -->
	<!-- <select id="selectAllStudent1" resultMap="ddy1">
		select s.*,b.id bid,b.name bname from student s inner join bj b on s.classno=b.id
	</select>
	<resultMap type="Student1" id="ddy1">
		<id column="id" property="id"/>
		<result column="user_name" property="name"/>
		<result column="age" property="age"/>
		<result column="score" property="score"/>
		association,javaType指班级属性中java类型
		<association property="bj" javaType="BanJi1">
			<id column="bid" property="classNo"/>
			<result column="bname" property="className"/>
		</association>
	</resultMap> -->
	<!-- 多对一分步查询方式(方式2) -->
	<!-- 
		1.查询所有学生
		2.拿出第一条学生数据,获取class_id,然后去banji表中查询id为101的班级
	 -->
	<select id="selectAllStudent1" resultMap="ddy2">
		select s.id,s.user_name,s.age,s.score,s.classno from student s
	</select>
	<select id="selectBjByXs" resultMap="myBanJi">
		select b.* from bj b where b.id = #{abc}
	</select>
	<resultMap type="Student1" id="ddy2">
		<id column="id" property="id"/>
		<result column="user_name" property="name"/>
		<result column="age" property="age"/>
		<result column="score" property="score"/>
		<!-- column管理父查询中展示的字段名,而与<result>标签中关联的字段和属性无关 -->
		<association property="bj" javaType="BanJi1" select="selectBjByXs" column="classno"></association>
	</resultMap>
	<resultMap type="BanJi1" id="myBanJi">
		<id column="id" property="classNo"/>
		<result column="name" property="className"/>
	</resultMap>
</mapper>

dao接口代码:

package com.zx.mybatis.mapper;

import java.util.List;
import java.util.Map;

import com.zx.mybatis.entity.BanJi;
import com.zx.mybatis.entity.Student;
import com.zx.mybatis.entity.Student1;

public interface StudentMapper {
	/**
	 * 获取所有班级及学生信息(一对多)
	 * @return
	 */
	public List<BanJi> selectAllBanJi();
	/**
	 * 查询所有学生及班级信息(多对一)
	 * @return
	 */
	public List<Student1> selectAllStudent1();
}

java测试代码:

package com.zx.mybatis.test;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import com.zx.mybatis.entity.BanJi;
import com.zx.mybatis.entity.Student1;
import com.zx.mybatis.mapper.StudentMapper;
import com.zx.mybatis.util.MybatisUtil;

public class Test2 {
	
	private static SqlSession sqlSession;
	
	static {
		sqlSession = MybatisUtil.getSqlSession();
	}
	@Test
	public void Test1() {
		StudentMapper sd = sqlSession.getMapper(StudentMapper.class);
		List<BanJi> bjs = sd.selectAllBanJi();
		for(BanJi bj : bjs) {
			System.out.println(bj);
		}
		sqlSession.close();
	}
	@Test
	public void Test2() {
		StudentMapper sd = sqlSession.getMapper(StudentMapper.class);
		List<Student1> stu1s = sd.selectAllStudent1();
		for(Student1 stu1 : stu1s) {
			System.out.println(stu1);
		}
		sqlSession.close();
	}
	
}

java工具类代码:

package com.zx.mybatis.util;

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;

public class MybatisUtil {
	
	private static String resource = "mybatis.xml";
	private static SqlSessionFactory sqlSessionFactory = null;
	/**
	 * 获取sqlSession
	 * @return
	 */
	public static SqlSession getSqlSession() {
		if(sqlSessionFactory==null) {
			try {
				InputStream inputStream = Resources.getResourceAsStream(resource);
				sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		/*
		 * 调用sqlSession工厂创建一个SqlSession
		 * 它有重载的方法,用来控制事务是否自动提交
		 * 默认是不自动进行事务提交的
		 */
		return sqlSessionFactory.openSession();
	}
}

java实体类代码:

package com.zx.mybatis.entity;

public class BanJi1 {
    
    private int classNo;
    private String className;
    
    public BanJi1() {
    }
    public BanJi1(int classNo, String className) {
        super();
        this.classNo = classNo;
        this.className = className;
    }
    public int getClassNo() {
        return classNo;
    }
    public void setClassNo(int classNo) {
        this.classNo = classNo;
    }
    public String getClassName() {
        return className;
    }
    public void setClassName(String className) {
        this.className = className;
    }
    @Override
    public String toString() {
        return "BanJi1 [classNo=" + classNo + ", className=" + className + "]";
    }
}

package com.zx.mybatis.entity;
/**
 * 学生类
 * @author zhangyi
 *
 */
public class Student1 {
    private int id;
    private String name;
    private int age;
    private double score;
    private BanJi1 bj;
    
    public Student1() {
        super();
    }
    public Student1(int id, String name, int age, double score, BanJi1 bj) {
        super();
        this.id = id;
        this.name = name;
        this.age = age;
        this.score = score;
        this.bj = bj;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public double getScore() {
        return score;
    }
    public void setScore(double score) {
        this.score = score;
    }
    public BanJi1 getBj() {
        return bj;
    }
    public void setBj(BanJi1 bj) {
        this.bj = bj;
    }
    @Override
    public String toString() {
        return "Student1 [id=" + id + ", name=" + name + ", age=" + age + ", score=" + score + ", bj=" + bj + "]";
    }
}

package com.zx.mybatis.entity;
/**
 * 学生类
 * @author zhangyi
 *
 */
public class Student {
    private int id;
    private String name;
    private int age;
    private double score;
    
    public Student() {
        super();
    }

    public Student(int id, String name, int age, double score) {
        super();
        this.id = id;
        this.name = name;
        this.age = age;
        this.score = score;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }

    @Override
    public String toString() {
        return "Student [id=" + id + ", name=" + name + ", age=" + age + ", score=" + score + "]";
    };
}

package com.zx.mybatis.entity;

import java.util.List;

public class BanJi {
    
    private int classNo;
    private String className;
    private List<Student> stus;
    
    public BanJi() {
    }
    public BanJi(int classNo, String className, List<Student> stus) {
        super();
        this.classNo = classNo;
        this.className = className;
        this.stus = stus;
    }
    public int getClassNo() {
        return classNo;
    }
    public void setClassNo(int classNo) {
        this.classNo = classNo;
    }
    public String getClassName() {
        return className;
    }
    public void setClassName(String className) {
        this.className = className;
    }
    public List<Student> getStus() {
        return stus;
    }
    public void setStus(List<Student> stus) {
        this.stus = stus;
    }
    @Override
    public String toString() {
        return "BanJi [classNo=" + classNo + ", className=" + className + ", stus=" + stus + "]";
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值