MyBatis之高级关联和集合映射(二、嵌套查询和嵌套结果小案例)

三张表,通过班级 clsId=3001 查找班级和学生的信息

1. 建表 表结构如下

create table student(stuId number(4) primary key,stuName varchar2(20) not null,stuSex varchar2(4),stuBirthday date,classId number(4));create table classes(clsId number(4) primary key,clsName varchar2(20) not null,teacherId number(4));create table teacher(teacherId number(4) primary key,teacherName varchar2(20) not null,workYear number(2),professional varchar2(20));

插入一些测试数据

2. entity包下新建三个实体类和三个 同名Mapper.xml

3. mapper包内新建三个同名Mapper接口,现在不做任何处理

4. mybatis.xml 中的配置

mappers的配置===”com/yc/mybitis/entity/TeacherMapper.xml”/> </mappers> 定义别名=”com/yc/mybitis/entity”/></typeAliases>

5. mybatis工具类编写 MybatisUtil

{private static Logger log=LoggerFactory.getLogger(MybatisUtil.class);private static SqlSessionFactory factory;static{try {log.debug(“加载mybatis.xml的配置文件”);InputStream in =Resources.getResourceAsStream(“mybatis.xml”);log.debug(“加载mybatis.xml的配置文件成功”);log.debug(“通过配置文件的数据构建sql session工厂”);factory=new SqlSessionFactoryBuilder().build(in);log.debug(“通过配置文件的数据构建sql session工厂 【成功】” );log.debug(“生产sqlsession 工厂对象”);} catch (IOException e) {e.printStackTrace();log.debug(“加载mybatis.xml的配置文件失败”,e);}}public static SqlSession getSession(){SqlSession session=null;session=factory.openSession();log.debug(“生产sqlsession 工厂对象 成功”);return session;}/**** @param isAutoCommit :true: 自动提交事务, false 手动事务* @return*/public static SqlSession getSession(boolean isAutoCommit){SqlSession session=null;session=factory.openSession( isAutoCommit );log.debug(“生产sqlsession 工厂对象 成功”);return session;}}

6. 查询要求: A、嵌套查询: 通过班级 clsId=3001 查找班级和学生的信息 select * from classes where clsId =3001 select * from student where classId =3001

ClassesMapper.xml中的配置

====>=”int” resultMap=”ClassesMap”>select * from classes where clsId=#{clsId}=”getStudents” resultType=”Student”>select * from student where classId=#{clsId}</select></mapper>

这一次的查询不需要用到 StudentMapper 和TeacherMapper,就不给出内容了

7. 接口 ClassesMapper.java只有一个方法,注意方法名需要和 ClassesMapper.xml中select语句指定的 id 一致

public interface ClassesMapper {public Classes getClassesById(int clsid);}

8. Junit单元测试

{private ClassesMapper classesMapper;() throws Exception {classesMapper=MybatisUtil.getSession().getMapper(ClassesMapper.class);}() throws Exception {classesMapper=null;}() {Classes c=classesMapper.getClassesById(3001);System.out.println(c);}}

9、运行测试类。成功。

6. 查询要求 B、嵌套结果: select * from student s join classes c on c.clsId=3001 and s.classId=c.clsId

ClassesMapper.xml中的配置 ,为了避免大家混淆了两种写法,建议新建一个ClassesMapper02.xml

<mapper namespace=”com.yc.mybatis.mapper.ClassesMapper02″><!–第二种 嵌套结果 记录多条,所以不能使用 association 必须选择 collection:表示多个结果select * from student s join classes c on c.clsId=3001 and s.classId=c.clsId–>=====”StudentMap”><!–ofType:指定 list集合中的数据类型–>=====>=”int” resultMap=”ClassesMap03″>select * from student s join classes c on c.clsId=#{clsId} ands.classId=c.clsId</select></mapper>即使是不成熟的尝试,也胜于胎死腹中的策略。

MyBatis之高级关联和集合映射(二、嵌套查询和嵌套结果小案例)

相关文章:

你感兴趣的文章:

标签云: