MyBatis之一对多映射查询sql配置文件。

学生---文章的模型
一对多模型

学生student.java类

 1 package com.bjsxt.sxf.po;
 2
 3 import java.util.Date;
 4 import java.util.List;
 5 import java.util.Set;
 6
 7 /**
 8  * 学生
 9 * @ClassName: Student
10 * @Description: TODO(这里用一句话描述这个类的作用)
11 * @author 尚晓飞
12 * @date 2014-11-4 上午10:41:19
13 *
14  */
15 public class Student {
16     private Integer studId;//主键id
17     private String name;//姓名
18     private String email;//email
19     private Date dob;//入学时间
20     private List<Article> articles;//文章集合
21         //set get 方法  空构造
22     }  

文章Article.java类

 1 package com.bjsxt.sxf.po;
 2 /**
 3  * 文章
 4 * @ClassName: Article
 5 * @Description: TODO(这里用一句话描述这个类的作用)
 6 * @author 尚晓飞
 7 * @date 2014-11-4 上午10:41:07
 8 *
 9  */
10 public class Article {
11     private Integer id;//id
12     private String title;//标题
13     private String content;//内容
14     private Student student;//该文章是哪个学生写的
15
16     //set get 方法 空构造
17     }

student.xml中映射器。此映射器,主要针对一对多模型查询。当查询一方时,将一方拥有的多方也查出来。

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 3 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 4 <!-- sql集的命名空间,是于数据库交互的桥梁.namespace对应的是映射器的java接口 -->
 5 <mapper namespace="com.bjsxt.sxf.mapper.StudentMapper">
 6
 7
 8
 9
10 <!--根据id获取学生的基本信息 -->
11 <!-- 当用resultType时返回单个对象,数据库列名和java类属性名必须一致,如不一致,则在sql语句中起别名,使得列名和属性名一致 -->
12 <select id="findStudentById" parameterType="int" resultType="Student">
13     SELECT students.stud_id as studId,students.`name`,students.email,students.dob FROM students WHERE students.stud_id=#{id}
14 </select>
15
16
17 <!-- 一对多查询 -->
18
19 <!-- resultMap嵌套。查询学生信息时,并将每个学生所写文章的集合也查询出来,赋值在学生对象中的文章集合类中 -->
20 <!-- 由于resultMap中已经将java类中的属性名和表中的列名,进行映射配置。此处不可为列名起别名 -->
21 <!-- 文章模型的映射结果 -->
22 <resultMap type="Article" id="wenzhang">
23         <id property="id" column="id" />
24         <result property="title" column="title" />
25         <result property="content" column="content" />
26 </resultMap>
27 <!-- 学生的映射结果 -->
28 <resultMap type="Student" id="StudentResult">
29         <id property="studId" column="stud_id" />
30         <result property="name" column="name" />
31         <result property="email" column="email" />
32         <result property="dob" column="dob" />
33         <collection property="articles" javaType="ArrayList" column="stud_id" ofType="Article" resultMap="wenzhang"></collection>
34         <!-- ofType是文章集合中的文章类型,column用查处出来的那个列的值,作为外键去查集合结果 -->
35 </resultMap>
36 <!-- 根据id获取学生对象,包含该id学生所写的文章集合,可能有的学生没有写文章,因此多表连接查询用左连接-->
37 <select id="findByIdContentArticle" parameterType="int" resultMap="StudentResult">
38     SELECT st.stud_id ,st.`name`,st.email,st.dob,ar.id,ar.title,ar.content FROM students st LEFT JOIN article ar ON (st.stud_id=ar.stuid) WHERE st.stud_id=#{id}
39 </select>
40 <!-- 查询出学生的集合,每个学生对象中包含该学生的文章集合 -->
41 <select id="findByQT" parameterType="int" resultMap="StudentResult">
42     SELECT st.stud_id ,st.`name`,st.email,st.dob,ar.id,ar.title,ar.content FROM students st LEFT JOIN article ar ON(st.stud_id=ar.stuid)
43 </select>
44
45
46
47 <!-- select嵌套查询 -->
48 <!-- 文章的映射 -->
49 <resultMap type="Article" id="wen">
50         <id property="id" column="id" />
51         <result property="title" column="title" />
52         <result property="content" column="content" />
53 </resultMap>
54 <!-- 根据学生id查询出文章集合 -->
55 <select id="findByStudId" parameterType="int" resultMap="wen">
56     SELECT ar.id,ar.title,ar.content FROM article ar WHERE ar.stuid=#{id}
57 </select>
58 <resultMap type="Student" id="studentsd">
59     <id property="studId" column="stud_id" />
60         <result property="name" column="name" />
61         <result property="email" column="email" />
62         <result property="dob" column="dob" />
63         <collection property="articles" column="stud_id" javaType="ArrayList" ofType="Article" select="findByStudId"></collection>
64         <!-- select当执行完查询学生的sql后再执行根据学生id查文章的sql -->
65 </resultMap>
66 <!-- select嵌套查询,查询出指定id的学生(包含学生的文章集合) -->
67 <select id="findByStudIdS" parameterType="int" resultMap="studentsd">
68     SELECT st.stud_id,st.`name`,st.email,st.dob FROM students st where st.stud_id=#{id}
69 </select>
70 <!-- select嵌套查询  ,查询出所有的学生集合(每个学生对象中包含该学生的文章集合)-->
71 <select id="findBySelectList" resultMap="studentsd">
72     SELECT st.stud_id,st.`name`,st.email,st.dob FROM students st
73 </select>
74
75 </mapper>

Article.xml文章映射器。此处查询的内容为。当查询多方的时候,并把一方查询出来。一对一也是这样查询的。

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 3 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 4 <!-- sql集的命名空间,是于数据库交互的桥梁.namespace对应的是映射器的java接口 -->
 5 <mapper namespace="com.bjsxt.sxf.mapper.ArticleMapper">
 6
 7 <!-- 查询出指定id的文章 -->
 8 <select id="findArticleById" parameterType="int" resultType="Article">
 9     SELECT article.id,article.title,article.content FROM article where article.id=#{id}
10 </select>
11 <!-- MyBatis的灵活处,也在此。需要什么样的结果集,就配置什么样的映射 -->
12 <resultMap type="Article" id="ArticleOnly">
13         <id property="id" column="id" />
14         <result property="title" column="title" />
15         <result property="content" column="content" />
16 </resultMap>
17 <!-- 查询出文章的集合,只是基本信息 -->
18 <select id="findArticleOnly" resultMap="ArticleOnly">
19     SELECT id,title,content FROM article
20 </select>
21
22
23 <!-- 多对一的查询 -->
24
25 <!--ResultMap嵌套查询  -->
26 <!-- 查询文章时,并将文章的作者学生信息也查询出来 -->
27 <resultMap type="Student" id="studentRe">
28         <id property="studId" column="stud_id" />
29         <result property="name" column="name" />
30         <result property="email" column="email" />
31         <result property="dob" column="dob" />
32 </resultMap>
33 <resultMap type="Article" id="ArticleResult">
34         <id property="id" column="id" />
35         <result property="title" column="title" />
36         <result property="content" column="content" />
37         <association property="student" resultMap="studentRe"></association>
38 </resultMap>
39 <!-- 根据文章id获取文章信息,并将该文章的作者也查询出来 -->
40 <select id="findArticleWithStudentById" parameterType="int" resultMap="ArticleResult">
41     SELECT ar.id,ar.title,ar.content,st.stud_id as studId,st.`name`,st.email,st.dob FROM article ar,students st WHERE ar.stuid=st.stud_id AND ar.id=#{id}
42 </select>
43
44 <!-- 查询出文章的集合,并将每篇文章的作者也查询出来 -->
45 <select id="findAllArticle" resultMap="ArticleResult">
46     SELECT ar.id,ar.title,ar.content,st.stud_id as studId,st.`name`,st.email,st.dob FROM article ar,students st WHERE ar.stuid=st.stud_id
47 </select>
48
49
50
51
52 <!-- select嵌套查询 -->
53 <!-- 根据学生id查询出学生的信息 -->
54 <select id="findStudentByStuid" parameterType="int" resultType="Student">
55     SELECT st.stud_id as studId,st.`name`,st.email,st.dob FROM students st WHERE st.stud_id=#{id}
56 </select>
57 <resultMap type="Article" id="as">
58         <id property="id" column="id" />
59         <result property="title" column="title" />
60         <result property="content" column="content" />
61         <association property="student" javaType="Student" column="stuid" select="findStudentByStuid"></association>
62 </resultMap>
63 <!-- 根据select嵌套查询出指定id的文章,并将文章的信息也查询出来 -->
64 <select id="findArticleBySelect" parameterType="int" resultMap="as">
65     SELECT * FROM article ar where ar.id=#{id}
66 </select>
67 <!-- 根据select嵌套查询出文章的集合,每篇文章的作者也查询出来 -->
68 <select id="findAllBySelect" resultMap="as">
69     SELECT * FROM article
70 </select>
71 </mapper>

时间: 2024-10-16 22:39:26

MyBatis之一对多映射查询sql配置文件。的相关文章

Mybatis 配置resultMap 查询全部sql

映射配置文件 <!-- type:映射实体类的数据类型 id:resultMap的唯一标识 --> <resultMap type="person" id="BaseResultMap"> <!-- column:库表的字段名 property:实体类里的属性名 --> <id column="person_id" property="personId" /> <resul

将复杂查询写到SQL配置文件--SOD框架的SQL-MAP技术简介

引言 今天看到一片热门的博客, .NET高级工程师面试题之SQL篇 ,要求找出每一个系的最高分,并且按系编号,学生编号升序排列.这个查询比较复杂,也比较典型,自从用了ORM后,很久没有写过SQL语句了,于是我研究了下,自己也写了一个: WITH cte1 as ( select stu.deptID, D.depName, stu.stuid , stu.stuName, score_sum.AllScore from dbo.Student stu inner join (select stu

【Mybatis】MyBatis之Sql配置文件的使用(四)

上一章[Mybatis]MyBatis对表执行CRUD操作(三),已经讲了基本操作,本章介绍Sql配置文件中常用功能 1.插入返回主键 2.参数值的获取方式 3.resultMap使用 插入返回主键 在实际项目中,插入一条数据,id是数据库自动生成的,但是我们插入完数据,往往需要返回数据的id进行使用. 1.在EmployeeMapper.xml映射文件中加入2条sql 1 <!-- parameterType 可写可不写 --> 2 <insert id="insertEmp

Oracle EBS-SQL (SYS-5):sys_配置文件查询.sql

select    distinct l.profile_option_name,             v.profile_option_value,             fu.user_nameform     applsys.fnd_profile_option_values v,            apps.fnd_profile_options_vl          l,            apps.fnd_user                           

开发中遇到的问题---【使用mybatis时 有一个sql查询不到结果 日志也显示查询为o 但是从日志中取出执行的sql到数据库客户端手动执行,可以查到数据】

问题:使用mybatis时 有一个sql查询不到结果 日志也显示查询为o 但是从日志中取出执行的sql到数据库客户端手动执行,可以查到数据: 原因:MyBatis看到 #{}会认为你在给sql中的变量赋值,就像JDBC编程中给问号赋值一样(自动在前后加单引号)也就是说,他把你传入的字符串并没有当做多个值,而是当做一个大的字符串,所以查询不到值 而MyBatis看到${}的时候会直接将之替换成变量的值而不做任何处理: 解决方案:将查询条件中的“#”替换成“$”. <select id="fi

Mybatis延迟加载和查询缓存

一.延迟加载 resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载功能. 延迟加载:先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快. 在mybatis核心配置文件中配置: lazyLoadingEnabled.aggressiveLazyLoading 设置项 描述 允许值 默认值 lazyLoadingEnabled 全局性设置

mybatis 延迟加载 ,查询缓存

阅读目录 一.延迟加载 二.查询缓存 回到顶部 一.延迟加载 resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载功能. 延迟加载:先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快. 在mybatis核心配置文件中配置: lazyLoadingEnabled.aggressiveLazyLoading 设置项 描述 允许值 默认值

Mybatis封装分页查询的java公用类

分页----对于数据量很大的查询中,是必不可少的.mybatis底层的分页sql语句由于需要我们自己去手动写.而实现分页显示的时候我们需要根据分页查询条件查询符合条件的总记录数和记录的详细情况.因此,若是不去实现封装一下的话,我们需要写两条SQL语句去实现它.一次用于查询记录数目.一次用于查询分页显示的详细记录.当项目中碰到很多需要分页的时候,我们便对于每一个Mapper.xml文件都需要去写两条SQL语句.极其麻烦,代码重用----必须重用.所以,一个公共方法的分页需求应运而生. 直接上分页公

Mybatis关联表查询_5

使用Mybatis实现关联查询,分为一对一和一对多两种情况,最后并对ResultMap进行一个简要说明. 创建表和数据 创建教师表,班级表,学生表, 假设一个老师只负责教一个班,那么老师和班级之间的关系是一对一的关系. 假设一个班级有多个学生,那么班级和学生之间的关系是一对多的关系. CREATE TABLE teacher( t_id number(5) PRIMARY KEY, t_name VARCHAR2(20) ); CREATE TABLE class( c_id number(5)