79.【Mybatis】(九)

简介: 79.【Mybatis】
(2).处理问题一 在学生表查询的时候为Null

(1).按照查询嵌套处理(子查询)

思路: 1.先查询所有的学生信息.2.

按照查询出来的学生的tid,寻找对应的老师。

复杂的属性,我们需要单独使用   对象: association   集合: collection

配置文件

<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="Com.Jsxs.Dao.StudentMapper">
<!--    select *from student s,teacher t where s.tid=t.id;-->
    <select id="getStudent_Teacher" resultMap="Student_Teacher">
        select *from student ;
    </select>
    <resultMap id="Student_Teacher" type="Com.Jsxs.pojo.Student">
        <result property="id" column="id"/>
        <result property="name" column="name"/>
<!--        复杂的属性,我们需要单独使用   对象: association   集合: collection-->
        <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
    </resultMap>
    <select id="getTeacher" resultType="Com.Jsxs.pojo.Teacher">
        select *from teacher where id=#{tid};
    </select>
</mapper>

(2).按照结果进行查询

Sql

select *from student s,teacher t where s.tid=t.id;
<select id="getStudent_Teacher2" resultMap="getStudent_Teacher2">
        select s.id sid, s.name sname,t.name tname
        from student s,teacher t
        where s.tid=t.id;
    </select>
    <resultMap id="getStudent_Teacher2" type="Com.Jsxs.pojo.Student">
        <result property="id" column="sid"/>
        <result property="name" column="sname"/>
        <association property="teacher" javaType="Teacher">
            <result property="name" column="tname"/>
        </association>
    </resultMap>

(十七)、一对多处理(集合)

1.基本设置

老师实体类的设置

package Com.Jsxs.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Teacher {
    private int id;
    private String name;
    //一个老师拥有多个学生
    private List<Student> students;
}

学生实体类的设置

package Com.Jsxs.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
    private int id;
    private String name;
    private int tid;
}

2.问题出现:在老师表中查询对应的学生

接口设置

package Com.Jsxs.Dao;
import Com.Jsxs.pojo.Teacher;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface TeacherMapper {
    //    获取指定老师下的所有学生
    Teacher getTeacher(@Param("ttid") int id);
}

配置设置

<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="Com.Jsxs.Dao.TeacherMapper">
<!--    按揭或-->
<select id="getTeacher" resultType="Com.Jsxs.pojo.Teacher">
    select s.id sid, s.name sname, t.name tname, t.id tid
    from student s,teacher t
    where s.id=t.id and t.id=#{ttid};
</select>
</mapper>

测试

package Com.Jsxs.Dao;
import Com.Jsxs.pojo.Teacher;
import Com.Jsxs.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class TeacherMapperTest {
    @Test
    public void test_getTeacher(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
        Teacher teacher = mapper.getTeacher(1);
        System.out.println(teacher);
        sqlSession.close();
    }
}

结果为null

3.处理问题

(1).按结果查询

集合用 collection ;  
javaType="" 指定属性的类型; 
 集合中的泛型信息我们用ofType获取

SQL语句

select s.id sid, s.name sname, t.name tname, t.id tid
    from student s,teacher t
    where s.tid=t.id and t.id=#{ttid};

配置文件

<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="Com.Jsxs.Dao.TeacherMapper">
<!--    按结果进行查询-->
<select id="getTeacher" resultMap="Teacher_student">
    select s.id sid, s.name sname, t.name tname, t.id tid
    from student s,teacher t
    where s.tid=t.id and t.id=#{ttid};
</select>
    <resultMap id="Teacher_student" type="Com.Jsxs.pojo.Teacher">
        <result property="id" column="tid"/>
        <result property="name" column="tname"/>
<!--
        集合用 collection ;  javaType="" 指定属性的类型;  集合中的泛型信息我们用ofType获取
-->
        <collection property="students" ofType="Student">
            <result property="id" column="sid"/>
            <result property="name" column="sname"/>
            <result property="tid" column="tid"/>
        </collection>
    </resultMap>
</mapper>

(2).按子查询进行处理
<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="Com.Jsxs.Dao.TeacherMapper">
<!--    按结果进行查询-->
<select id="getTeacher" resultMap="Teacher_student">
    select s.id sid, s.name sname, t.name tname, t.id tid
    from student s,teacher t
    where s.tid=t.id and t.id=#{ttid};
</select>
    <resultMap id="Teacher_student" type="Com.Jsxs.pojo.Teacher">
        <result property="id" column="tid"/>
        <result property="name" column="tname"/>
<!--
        集合用 collection ;  javaType="" 指定属性的类型;  集合中的泛型信息我们用ofType获取
-->
        <collection property="students" ofType="Student">
            <result property="id" column="sid"/>
            <result property="name" column="sname"/>
            <result property="tid" column="tid"/>
        </collection>
    </resultMap>
<!--    =========================-======按照嵌套查询==-->
    <select id="getTeacher2" resultMap="Teacher_student2">
<!--        通过指定的老师id进行查询-->
        select *from teacher where id=#{ttid};
    </select>
    <resultMap id="Teacher_student2" type="Com.Jsxs.pojo.Teacher">
        <!--        传回来查询到的老师的id-->
        <collection property="students" column="id" ofType="Student" select="getStudent"/>
    </resultMap>
    <select id="getStudent" resultType="Com.Jsxs.pojo.Student">
<!--        老师的id和外键进行对比-->
        select *from student where tid=#{ttid};
    </select>
</mapper>

4.小结

1.关联–association 【多对一】

2.集合-- collection 【一对多】

3.javaType : 用来指定实体类中属性的类型

4.ofType : 用来指定映射到List或则集合中实体的类型,泛型中的约束类型

相关文章
|
供应链 机器人 Serverless
企业如何通过蚂蚁开放联盟链快速上链
蚂蚁区块链开放联盟链提供给企业的,不但是低门槛低成本的上链方案,让上链之路变得轻巧简单,而是是一个链上链外广阔的生态协作机会。
17192 2
企业如何通过蚂蚁开放联盟链快速上链
|
开发者 iOS开发
如何使用 Instruments 工具来分析应用的性能?
如何使用 Instruments 工具来分析应用的性能?
550 2
|
关系型数据库 分布式数据库 对象存储
沉浸式学习PostgreSQL|PolarDB 5: 零售连锁、工厂等数字化率较低场景的数据分析
零售连锁, 制作业的工厂等场景中, 普遍数字化率较低, 通常存在这些问题: 数据离线, 例如每天盘点时上传, 未实现实时汇总到数据库中. 数据格式多, 例如excel, csv, txt, 甚至纸质手抄. 让我们一起来思考一下, 如何使用较少的投入实现数据汇总分析?
452 0
|
Linux iOS开发 Docker
|
Web App开发 应用服务中间件 nginx
|
7月前
|
开发工具 开发者 iOS开发
testflight上架ipa包-只有ipa包的情况下如何修改签名信息为苹果开发者账户对应的信息-ipa苹果包如何手动改签或者第三方工具改签-优雅草卓伊凡
testflight上架ipa包-只有ipa包的情况下如何修改签名信息为苹果开发者账户对应的信息-ipa苹果包如何手动改签或者第三方工具改签-优雅草卓伊凡
187 20
|
弹性计算 算法 应用服务中间件
nginx配置访问密码,实现用户输入用户名密码才能访
如果我们在 nginx 下搭建了一些站点,但是由于站点内容或者流量的关系,我们并不想让所有人都能正常访问,那么我们可以设置访问认证。只有让用户输入正确的用户名和密码才能正常访问。效果如下:
3482 0
|
前端开发 Android开发 开发者
移动应用开发的未来:跨平台框架与原生开发的融合
【10月更文挑战第36天】本文探讨了移动应用开发领域内,跨平台框架与原生开发之间的相互作用及其未来发展趋势。通过分析Flutter和React Native等流行跨平台解决方案的优缺点,以及它们如何与传统iOS和Android开发相结合,本文揭示了一种新兴的开发模式,旨在提高开发效率并保持应用性能。
|
网络安全 Windows
查看SSH配置文件
查看SSH配置文件
1452 1