用idea学习持久层框架Mybatis第三天(结束撒花)

2023-11-06 19:21

本文主要是介绍用idea学习持久层框架Mybatis第三天(结束撒花),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

      • 测试环境搭建
      • 按照查询嵌套处理
      • 按照结果嵌套处理
    • 11、一对多
      • 1.环境搭建,就跟刚才一样
      • 按照结果嵌套处理
      • 按照查询嵌套查询
      • 小结
    • 12、动态SQL
      • 搭建环境
      • IF
      • choose(when,otherwise)
      • trim(where,set)
      • SQL片段
    • 13、缓存
      • 13.1、简介
      • 13.2、Mybatis缓存
      • 13.3、一级缓存
      • 13.4、二级缓存
      • 13.5、缓存原理
      • 13.6、自定义缓存Ehcache

测试环境搭建

​ 1.导入lombok

​ 2.新建实体类Teacher,Student

​ 3.建立Mapper接口

​ 4.建立Mapper.xml文件

​ 5.在核心配置文件中绑定注册我们的Mapper接口或者文件

​ 6.测试查询是否能够成功

按照查询嵌套处理

<!--
思路:    1.查询所有的学生信息  2.根据查询出来的学生的tid,寻找对应的老师 
-->
<select id="getStudent" resultMap="StudentTeacher">   SELECT * FROM mybatis.student;
</select>
<resultMap id="StudentTeacher" type="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="Teacher">  SELECT * FROM  teacher WHERE id=#{id}
</select>

按照结果嵌套处理

<!--按照结果嵌套处理-->
<select id="getStudent" 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 property="id" column="sid"/>   <result property="name" column="sname"/>   <association property="teacher" javaType="Teacher">      <result property="name" column="tname"/>   </association>
</resultMap>

回顾Mysql多对一查询方式:

​ ○子查询

​ ○联表查询

11、一对多

比如:一个老师拥有多个学生

对于老师而言,就是一对多的关系。

1.环境搭建,就跟刚才一样

​ 实体类

public class Teacher {private int id;   private String name;    //一个老师拥有多个学生  private List<Student> students;
}
public class Student {    private int id;   private String name;    private int tid;
}

按照结果嵌套处理

<!--按结果嵌套查询-->
<select id="getTeacher" resultMap="TeacherStudent"> 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=#{tid}
</select>
<resultMap id="TeacherStudent" type="Teacher">   <result property="id" column="tid"/>   <result property="name" column="tname"/>   <!--指定属性的类型    集合中的泛型信息,我们使用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="TeacherStudent2"> SELECT  * FROM mybatis.teacher WHERE id=#{tid}
</select>
<resultMap id="TeacherStudent2" type="Teacher">   <collection property="students" javaType="ArrayList" ofType="Student" select="getStudentByTeacherId" column="id"/>
</resultMap>
<select id="getStudentByTeacherId" resultType="Student"> SELECT * FROM mybatis.student WHERE tid=#{tid}
</select>

小结

​ 1.关联-association 【多对一】

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

​ 3.javaType&ofType

​ 1.javaType用来指定实体类中属性的类型

​ 2.ofType用来指定映射到List或者集合中的pojo类型,泛型中的约束类型。

注意点:

​ ○保证sql的可读性,通俗易懂

​ ○注意一对多和多对一中,属性名和字段的问题。

​ ○如果问题不好排查,可以使用日志,建议使用Log4j。

12、动态SQL

什么是动态SQL:动态SQL就是指根据不同的条件生成不同的SQL语句

搭建环境

create table blog(  `id` VARCHAR(50) NOT NULL  COMMENT '博客id', `title` VARCHAR(100) NOT NULL COMMENT '博客标题', `author` VARCHAR(30) NOT NULL COMMENT '博客作者', `create_time` DATETIME NOT NULL COMMENT '创建时间', `views` INT(30) NOT NULL COMMENT '浏览量'
)ENGINE=innoDB DEFAULT CHARSET=utf8

创建一个基础工程

​ 1.导包

​ 2.编写配置文件

​ 3.编写实体类

public class Blog {    private int id;  private String title;   private String author;   private Date createTime;   private int views;    public Blog() {    }    public Blog(int id, String title, String author, Date createTime, int views) {   this.id = id;      this.title = title;      this.author = author;    this.createTime = createTime;    this.views = views;  }   public int getId() {    return id;   }    public void setId(int id) {   this.id = id;   }   public String getTitle() {    return title; }   public void setTitle(String title) {    this.title = title;    }    public String getAuthor() {      return author;   }  public void setAuthor(String author) {        this.author = author;   }    public Date getCreateTime() {      return createTime;  }   public void setCreateTime(Date createTime) {  this.createTime = createTime;    }    public int getViews() {    return views;  }   public void setViews(int views) {   this.views = views;   }    @Override public String toString() {  return "Blog{" +               "id=" + id +              ", title='" + title + '\'' +        ", author='" + author + '\'' +     ", createTime=" + createTime +     ", views=" + views +        '}';  }
}

​ 4.编写实体类对应Mapper接口和Mapper.xml文件

IF

<select id="queryBlogIF" parameterType="map" resultType="Blog">   SELECT * FROM mybatis.blog WHERE 1=1    <if test="title !=null">    AND title=#{title}   </if>  <if test="author !=null">   and author=#{author} </if>
</select>

choose(when,otherwise)

<select id="queryBlogChoose" parameterType="map" resultType="blog">  SELECT * FROM mybatis.blog   <where>        <choose>      <when test="title !=null">          title=#{title}       </when>         <when test="author !=null">       and author=#{author}      </when>          <otherwise>  and views=#{views}     </otherwise>       </choose>   </where>
</select>

trim(where,set)

<select id="queryBlogIF" parameterType="map" resultType="Blog">  SELECT * FROM mybatis.blog  <where>        <if test="title !=null">        title=#{title}     </if>      <if test="author !=null">       and author=#{author}   </if>   </where>
</select>
<update id="updateBlog" parameterType="map">  update mybatis.blog  <set>       <if test="title !=null">           title=#{title},       </if>       <if test="author !=null">    author=#{author}     </if>  </set> WHERE id=#{id}
</update>

所谓的动态SQL,本质还是SQL语句,只是我们可以在SQL层面,去执行一个逻辑代码

SQL片段

有的时候,我们可能会将一些功能的部门抽取出来,方便复用。

​ 1.使用SQL标签抽取公共的部分

<sql id="if-title-author">    <if test="title !=null">      title=#{title}   </if>    <if test="author !=null">  and author=#{author}   </if>
</sql>

​ 2.在需要使用的地方使用include标签引用即可

<select id="queryBlogIF" parameterType="map" resultType="Blog"> SELECT * FROM mybatis.blog  <where>    <include refid="if-title-author"></include>   </where>
</select>

注意事项:

​ ○最好基于单表来定义SQL片段。

​ ○不要存在where标签

动态SQL就是在拼接SQL语句,我们只要保证SQL的正确性,按照SQL的格式,去排列组合就可以了。

13、缓存

13.1、简介

13.2、Mybatis缓存

13.3、一级缓存

13.4、二级缓存

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9bwVRvrB-1583340238415)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1583338316535.png)]

步骤:

​ 1.开启全局缓存

<!--显式的开启全局缓存-->
<setting name="cacheEnabled" value="true"/>

​ 2.在要使用二级缓存的mapper中开启

<!--在当前Mapper.xml中使用二级缓存-->
<cache/>

也可以自定义参数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V7V12hPt-1583340238418)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1583338918711.png)]

​ 3.测试

​ 1.问题:我们需要将实体类序列化,否则就会报错

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V3hmpsNF-1583340238419)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1583338982256.png)]

​ 小结:

​ 只要开启了二级缓存,在同一个Mapper下就有效

​ 所有的数据都会先放在一级缓存

​ 只有当会话提交或者关闭的时候,或者关闭的时候,才会提交到二级缓存中。

13.5、缓存原理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jjbJbRy0-1583340238422)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1583339554566.png)]

13.6、自定义缓存Ehcache

​ 要先导包

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xtzZmnKm-1583340238425)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1583339772122.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yLJ6RNvv-1583340238426)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1583339871229.png)]

这篇关于用idea学习持久层框架Mybatis第三天(结束撒花)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/358578

相关文章

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

MyBatis ResultMap 的基本用法示例详解

《MyBatisResultMap的基本用法示例详解》在MyBatis中,resultMap用于定义数据库查询结果到Java对象属性的映射关系,本文给大家介绍MyBatisResultMap的基本... 目录MyBATis 中的 resultMap1. resultMap 的基本语法2. 简单的 resul

Mybatis的分页实现方式

《Mybatis的分页实现方式》MyBatis的分页实现方式主要有以下几种,每种方式适用于不同的场景,且在性能、灵活性和代码侵入性上有所差异,对Mybatis的分页实现方式感兴趣的朋友一起看看吧... 目录​1. 原生 SQL 分页(物理分页)​​2. RowBounds 分页(逻辑分页)​​3. Page

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

Mybatis Plus Join使用方法示例详解

《MybatisPlusJoin使用方法示例详解》:本文主要介绍MybatisPlusJoin使用方法示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录1、pom文件2、yaml配置文件3、分页插件4、示例代码:5、测试代码6、和PageHelper结合6

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

MyBatis设计SQL返回布尔值(Boolean)的常见方法

《MyBatis设计SQL返回布尔值(Boolean)的常见方法》这篇文章主要为大家详细介绍了MyBatis设计SQL返回布尔值(Boolean)的几种常见方法,文中的示例代码讲解详细,感兴趣的小伙伴... 目录方案一:使用COUNT查询存在性(推荐)方案二:条件表达式直接返回布尔方案三:存在性检查(EXI

IDEA如何实现远程断点调试jar包

《IDEA如何实现远程断点调试jar包》:本文主要介绍IDEA如何实现远程断点调试jar包的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录问题步骤总结问题以jar包的形式运行Spring Boot项目时报错,但是在IDEA开发环境javascript下编译

MyBatis编写嵌套子查询的动态SQL实践详解

《MyBatis编写嵌套子查询的动态SQL实践详解》在Java生态中,MyBatis作为一款优秀的ORM框架,广泛应用于数据库操作,本文将深入探讨如何在MyBatis中编写嵌套子查询的动态SQL,并结... 目录一、Myhttp://www.chinasem.cnBATis动态SQL的核心优势1. 灵活性与可

IDEA中Maven Dependencies出现红色波浪线的原因及解决方法

《IDEA中MavenDependencies出现红色波浪线的原因及解决方法》在使用IntelliJIDEA开发Java项目时,尤其是基于Maven的项目,您可能会遇到MavenDependenci... 目录一、问题概述二、解决步骤2.1 检查 Maven 配置2.2 更新 Maven 项目2.3 清理本