用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

相关文章

慢sql提前分析预警和动态sql替换-Mybatis-SQL

《慢sql提前分析预警和动态sql替换-Mybatis-SQL》为防止慢SQL问题而开发的MyBatis组件,该组件能够在开发、测试阶段自动分析SQL语句,并在出现慢SQL问题时通过Ducc配置实现动... 目录背景解决思路开源方案调研设计方案详细设计使用方法1、引入依赖jar包2、配置组件XML3、核心配

解决IDEA报错:编码GBK的不可映射字符问题

《解决IDEA报错:编码GBK的不可映射字符问题》:本文主要介绍解决IDEA报错:编码GBK的不可映射字符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录IDEA报错:编码GBK的不可映射字符终端软件问题描述原因分析解决方案方法1:将命令改为方法2:右下jav

MyBatis模糊查询报错:ParserException: not supported.pos 问题解决

《MyBatis模糊查询报错:ParserException:notsupported.pos问题解决》本文主要介绍了MyBatis模糊查询报错:ParserException:notsuppo... 目录问题描述问题根源错误SQL解析逻辑深层原因分析三种解决方案方案一:使用CONCAT函数(推荐)方案二:

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤及问题解决

《IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决》:本文主要介绍IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决,本文分步骤结合实例给大... 目录步骤 1:创建 Maven Web 项目步骤 2:添加 Spring MVC 依赖1、保存后执行2、将新的依赖

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

解决Maven项目idea找不到本地仓库jar包问题以及使用mvn install:install-file

《解决Maven项目idea找不到本地仓库jar包问题以及使用mvninstall:install-file》:本文主要介绍解决Maven项目idea找不到本地仓库jar包问题以及使用mvnin... 目录Maven项目idea找不到本地仓库jar包以及使用mvn install:install-file基

IDEA自动生成注释模板的配置教程

《IDEA自动生成注释模板的配置教程》本文介绍了如何在IntelliJIDEA中配置类和方法的注释模板,包括自动生成项目名称、包名、日期和时间等内容,以及如何定制参数和返回值的注释格式,需要的朋友可以... 目录项目场景配置方法类注释模板定义类开头的注释步骤类注释效果方法注释模板定义方法开头的注释步骤方法注

如何解决idea的Module:‘:app‘platform‘android-32‘not found.问题

《如何解决idea的Module:‘:app‘platform‘android-32‘notfound.问题》:本文主要介绍如何解决idea的Module:‘:app‘platform‘andr... 目录idea的Module:‘:app‘pwww.chinasem.cnlatform‘android-32

Spring Boot项目中结合MyBatis实现MySQL的自动主从切换功能

《SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能》:本文主要介绍SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能,本文分步骤给大家介绍的... 目录原理解析1. mysql主从复制(Master-Slave Replication)2. 读写分离3.

idea maven编译报错Java heap space的解决方法

《ideamaven编译报错Javaheapspace的解决方法》这篇文章主要为大家详细介绍了ideamaven编译报错Javaheapspace的相关解决方法,文中的示例代码讲解详细,感兴趣的... 目录1.增加 Maven 编译的堆内存2. 增加 IntelliJ IDEA 的堆内存3. 优化 Mave