mybatis学习笔记-05(代码片段)

宏远小七 宏远小七     2022-12-04     320

关键词:

mybatis学习笔记-05


这一篇来写一些相对复杂的SQL语句。


1、复杂环境搭建

这个环境搭建跟我mybatis第一篇文章的环境搭建没有什么太大的区别,只不过这里会用到一些我前几篇说到的知识点,如果没看过我之前的文章,可以去看我前几篇的文章。

步骤

  1. 工具类(和之前的一样,不变);
  2. 创建实体类(属性名都要对应数据库列名);
  3. 创建接口;
  4. 在resources包下建立和接口对应的包和xml配置文件;
  5. 在mybatis-config.xml核心配置文件中绑定所创建的接口。
  6. 设置别名

    环境搭建好后就可以接下来的操作了。

2、多对一处理

多对一:例如很多学生都有同一个老师,我们从学生方面去查询学生和老师。

2.1、实体类

实体类——学生

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student 
    private int id;
    private String name;
    //老师的id是要从老师的表去查询,所以给返回老师的对象
    private Teacher teacher;

实体类——老师

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Teacher 
    private int id;
    private String name;

2.2、按照查询嵌套处理

StudentMapper接口

public interface StudentMapper 
    List<Student> selectStudentAndTeacher();

StudentMapper.xml配置文件

<mapper namespace="com.ZXF.dao.StudentMapper">
<!--    通过查询嵌套=========================================-->
<select id="selectStudentAndTeacher" resultMap="StudentTeacher">
    select * from student;
</select>
    <resultMap id="StudentTeacher" type="Student">
        <result column="id" property="id"/>
        <result column="name" property="name"/>
    <!--  复杂的属性,单独处理,如果要处理的是:
			对象:用association
			集合:用collection
		javaType:因为我们要处理的对象是一个类,所以我们把这个类传递进去
		-->
        <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
    </resultMap>
<select id="getTeacher" resultType="Teacher">
    <!--单个参数时,#id这个参数名可以随意写,但为了命名规范和方便排错,建议一致 -->
    select * from teacher where id=#id;
</select>

测试

@Test
public  void  selectStudentAndTeacher()
    SqlSession sqlSession = MybatisUtil.getSqlSession();
    StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
    List<Student> students = mapper.selectStudentAndTeacher();
    for (Student student : students) 
        System.out.println(student);
    
    sqlSession.close();

测试结果

2.3、按照结果嵌套处理

StudentMapper接口

public interface StudentMapper 
    List<Student> selectStudentAndTeacher2();

StudentMapper.xml配置文件

<!--    通过结果嵌套=========================================-->
<select id="selectStudentAndTeacher2" resultMap="StudentTeacher2">
    select s.id sid,s.name sname,t.name tname
    from student s,teacher t where s.tid=t.id;
</select>
<resultMap id="StudentTeacher2" type="Student">
    <result column="sid" property="id"/>
    <result column="sname" property="name"/>
    <association property="teacher" javaType="Teacher">
        <result column="tname" property="name"/>
    </association>
</resultMap>

测试

@Test
public  void  selectStudentAndTeacher2()
    SqlSession sqlSession = MybatisUtil.getSqlSession();
    StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
    List<Student> students2 = mapper.selectStudentAndTeacher2();
    for (Student student : students2) 
        System.out.println(student);
    
    sqlSession.close();

测试结果

3、一对多处理

一对多:例如一个老师教好多个学生。我们从老师方面去查询学生和老师。

3.1、实体类

实体类——学生

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student 
    private int id;
    private String name;
    private int tid;

实体类——老师

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Teacher 
    private int id;
    private String name;
    //这里是从老师方向查学生,返回集合
    private List<Student> students;

3.2、按结果嵌套查询

TeacherMapper接口

public interface TeacherMapper 
    //查询老师和学生
    List<Teacher> getTeacher(int id);

TeacherMapper.xml配置文件

<select id="getTeacher" resultMap="TeacherStudent">
    select s.id sid,s.name sname,t.name tname,t.id tid
    from student s,teacher t
    where t.id=#tid
</select>
<resultMap id="TeacherStudent" type="Teacher">
    <result property="id" column="tid"/>
    <result property="name" column="tname"/>
    <!--        javaType : 指定属性的类型
            ofType : 集合中的泛型信息
                -->
    <collection property="students" ofType="Student">
        <result column="sid" property="id"/>
        <result column="sname" property="name"/>
        <result column="tid" property="tid"/>
    </collection>
</resultMap>

测试

@Test
    public void getTeacherStudent()
    SqlSession sqlSession = MybatisUtil.getSqlSession();
    TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
    List<Teacher> teacher = mapper.getTeacher(1);
    for (Teacher teacher1 : teacher) 
        System.out.println(teacher1);
    
    sqlSession.close();

测试结果

3.3、按查询嵌套处理

TeacherMapper接口

public interface TeacherMapper 
    //查询老师和学生
    List<Teacher> getTeacher2(int id);

TeacherMapper.xml配置文件

<select id="getTeacher2" resultMap="TeacherStudent2">
    select id,name from teacher where id=#id
</select>
<resultMap id="TeacherStudent2" type="Teacher">
    <collection property="students" javaType="ArrayList" ofType="Student" select="getStudentById" column="id">
    </collection>
</resultMap>
<select id="getStudentById" resultType="Student">
    select * from student where tid=#id
</select>
</

测试

@Test
    public void getTeacherStudent2()
    SqlSession sqlSession = MybatisUtil.getSqlSession();
    TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
    List<Teacher> teacher2 = mapper.getTeacher2(1);
    for (Teacher teacher : teacher2) 
        System.out.println(teacher);
    
    sqlSession.close();

测试结果

这里查询结果有一个老师的id为0的问题!我也不清楚该怎么解决[大哭]。

4、区别

  • 对象:用association
  • 集合:用collection
  • javaType : 指定属性的类型
  • ofType : 集合中的泛型信息
  • 不论是association还是collection的property,传入的参数都是需要关联或者是集合的属性名。

还有一些细节写在代码的注释,


这是我mybatis自学笔记的第5篇,没看过我之前的文章的话可以看看,前4篇的链接↓
mybatis学习笔记-04
mybatis学习笔记-03
mybatis学习笔记-02
mybatis学习笔记-01


本篇文章到这就结束了。自学不易,如果写得不详细,可以结合官方文档看,也可以评论区交流,这篇文章有可以优化的地方希望大佬指教指教。

mybatis学习笔记11:解决字段名和属性的映射关系(代码片段)

解决字段名和属性的映射关系【Mybatis】学习笔记01:连接数据库,实现增删改【Mybatis】学习笔记02:实现简单的查【MyBatis】学习笔记03:配置文件进一步解读(非常重要)【MyBatis】学习笔记04:配置文件模板【MyBatis】学习笔记05... 查看详情

mybatis框架学习笔记(代码片段)

本篇Mybatis框架学习笔记;紧跟之前的学习Mybatis框架学习笔记(2)—>在mybatis框架核心配置文件中需要学习的配置configuration(配置)properties(属性)settings(设置)typeAliases(类型别名)typeHandlers 查看详情

mybatis框架学习笔记(代码片段)

本篇Mybatis框架学习笔记;紧跟之前的学习Mybatis框架学习笔记(1)—>小智RE0在mybatis框架核心配置文件中需要学习的配置configuration(配置)properties(属性)settings(设置)typeAliases(类型别名)typeHandl... 查看详情

mybatis学习笔记-05(代码片段)

mybatis学习笔记-051、复杂环境搭建步骤2、多对一处理2.1、实体类2.2、按照查询嵌套处理2.3、按照结果嵌套处理3、一对多处理3.1、实体类3.2、按结果嵌套查询3.3、按查询嵌套处理4、区别这一篇来写一些相对复杂的SQL语句。1、复杂... 查看详情

mybatis学习笔记-05(代码片段)

mybatis学习笔记-051、复杂环境搭建步骤2、多对一处理2.1、实体类2.2、按照查询嵌套处理2.3、按照结果嵌套处理3、一对多处理3.1、实体类3.2、按结果嵌套查询3.3、按查询嵌套处理4、区别这一篇来写一些相对复杂的SQL语句。1、复杂... 查看详情

mybatis学习笔记(代码片段)

Mybatis学习笔记本篇文章是观看B站UP主狂神说关于Mybatis讲解的视频,借鉴Mybatis官方文档以及CSDN博主黑心白莲相关文章整理的个人Mybatis笔记。因笔者能力有限,文章难免有错误之处,欢迎各位评论勘误,共同探讨&#... 查看详情

mybatis学习笔记-01(代码片段)

mybatis学习笔记-01认识mybatis安装mybatis准备工作我的第一个mybatis程序工具类MybatisUtil类(工具类)mybatis-config.xml(对应配置文件)实体类Dao层Dao接口UserMappr.xml测试UserMapprTest测试结果开启自学mybatis的时光。认识mybatis... 查看详情

mybatis学习笔记-01(代码片段)

mybatis学习笔记-01认识mybatis安装mybatis准备工作我的第一个mybatis程序工具类MybatisUtil类(工具类)mybatis-config.xml(对应配置文件)实体类Dao层Dao接口UserMappr.xml测试UserMapprTest测试结果开启自学mybatis的时光。认识mybatis... 查看详情

学习笔记mybatis学习笔记(代码片段)

本文是动力节点MyBatis教程的学习笔记。第一章1.三层架构(1)三层的功能表示层(UserInterfaceLayer):接受用户数据,显示请求的处理结果,包括jsp、html、servlet等。对应controller包;业务逻辑层(BusinessLogic... 查看详情

学习笔记mybatis学习笔记(代码片段)

本文是动力节点MyBatis教程的学习笔记。第一章1.三层架构(1)三层的功能表示层(UserInterfaceLayer):接受用户数据,显示请求的处理结果,包括jsp、html、servlet等。对应controller包;业务逻辑层(BusinessLogic... 查看详情

mybatis框架学习笔记(代码片段)

官方中文文档–>https://mybatis.org/mybatis-3/zh/getting-started.html或点击–>mybatis文档mybatis3版本的源码–>https://github.com/mybatis/mybatis-3/releases或点击–>mybatis3源码文章目录1.什么是mybatis2.基础搭建使用(1)添加相关maven依赖 查看详情

mybatis学习笔记(代码片段)

一、Mybatis简介1、MyBatis历史MyBatis最初是Apache的一个开源项目iBatis,2010年6月这个项目由ApacheSoftwareFoundation迁移到了GoogleCode。随着开发团队转投GoogleCode旗下,iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到GithubiBatis一词来源于... 查看详情

mybatis框架学习笔记(代码片段)

本篇Mybatis框架学习笔记;紧跟之前的学习Mybatis框架学习笔记(3)–>文章目录1.当出现数据库的列字段与实体类的不一致时;需要手动配置字段映射;2.两张表以上的多表映射;完成查询所有的员工(附带地查到员工对应的部门);注意有... 查看详情

mybatis学习笔记-02(代码片段)

mybatis学习笔记-02增删改查功能实现1.通过id查询用户Dao接口:UserMapperUserMapper.xmlUserMapperTest2.插入用户Dao接口:UserMapperUserMapper.xmlUserMapperTest3.更新用户Dao接口:UserMapperUserMapper.xmlUserMapperTest4.删 查看详情

mybatis学习笔记(代码片段)

文章目录1.MyBatis简介1.1MyBatis历史1.2MyBatis特性1.3和其它持久化层技术对比2.搭建MyBatis2.1开发环境2.2创建maven工程2.3创建MyBatis的核心配置文件2.4创建mapper接口2.5创建MyBatis的映射文件2.6通过junit测试功能2.7加入log4j日志功能3.核心配置... 查看详情

mybatis系统性详解(学习笔记)(代码片段)

目录mybatis知识传统JDBC不足mybatis基础mybatis核心应用配置与原理解析mybatis核心概念整体认识mybatis源码包mybatis基本流程类调用mybatis流程记录mybatis处理流程图mybatis*之sessionmybatis之mappermybatis之sqlmybatis之executormybatis之Cache一级缓存二... 查看详情

mybatis学习笔记-06(代码片段)

mybatis学习笔记-061.动态SQL环境搭建1.1、实体类1.2、BlogMapper接口1.3、BlogMapper.xml配置文件1.4、mybatis-config.xml核心配置文件1.5、唯一的id标识(Idutil)1.6、测试2、动态SQL之if语句3、choose、when、otherwise4、trimwhereset5、forEach这篇... 查看详情

mybatis学习笔记-06(代码片段)

mybatis学习笔记-061.动态SQL环境搭建1.1、实体类1.2、BlogMapper接口1.3、BlogMapper.xml配置文件1.4、mybatis-config.xml核心配置文件1.5、唯一的id标识(Idutil)1.6、测试2、动态SQL之if语句3、choose、when、otherwise4、trimwhereset5、forEach这篇... 查看详情