用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编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

mybatis和mybatis-plus设置值为null不起作用问题及解决

《mybatis和mybatis-plus设置值为null不起作用问题及解决》Mybatis-Plus的FieldStrategy主要用于控制新增、更新和查询时对空值的处理策略,通过配置不同的策略类型... 目录MyBATis-plusFieldStrategy作用FieldStrategy类型每种策略的作

如何利用Java获取当天的开始和结束时间

《如何利用Java获取当天的开始和结束时间》:本文主要介绍如何使用Java8的LocalDate和LocalDateTime类获取指定日期的开始和结束时间,展示了如何通过这些类进行日期和时间的处... 目录前言1. Java日期时间API概述2. 获取当天的开始和结束时间代码解析运行结果3. 总结前言在J

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

SpringBoot+MyBatis-Flex配置ProxySQL的实现步骤

《SpringBoot+MyBatis-Flex配置ProxySQL的实现步骤》本文主要介绍了SpringBoot+MyBatis-Flex配置ProxySQL的实现步骤,文中通过示例代码介绍的非常详... 目录 目标 步骤 1:确保 ProxySQL 和 mysql 主从同步已正确配置ProxySQL 的

MyBatis-Flex BaseMapper的接口基本用法小结

《MyBatis-FlexBaseMapper的接口基本用法小结》本文主要介绍了MyBatis-FlexBaseMapper的接口基本用法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具... 目录MyBATis-Flex简单介绍特性基础方法INSERT① insert② insertSelec

Idea实现接口的方法上无法添加@Override注解的解决方案

《Idea实现接口的方法上无法添加@Override注解的解决方案》文章介绍了在IDEA中实现接口方法时无法添加@Override注解的问题及其解决方法,主要步骤包括更改项目结构中的Languagel... 目录Idea实现接China编程口的方法上无法添加@javascriptOverride注解错误原因解决方

修改若依框架Token的过期时间问题

《修改若依框架Token的过期时间问题》本文介绍了如何修改若依框架中Token的过期时间,通过修改`application.yml`文件中的配置来实现,默认单位为分钟,希望此经验对大家有所帮助,也欢迎... 目录修改若依框架Token的过期时间修改Token的过期时间关闭Token的过期时js间总结修改若依

在idea中使用mysql数据库超详细教程

《在idea中使用mysql数据库超详细教程》:本文主要介绍如何在IntelliJIDEA中连接MySQL数据库,并使用控制台执行SQL语句,还详细讲解了如何使用MyBatisGenerator快... 目录一、连接mysql二、使用mysql三、快速生成实体、接口、sql文件总结一、连接mysql在ID

IDEA如何让控制台自动换行

《IDEA如何让控制台自动换行》本文介绍了如何在IDEA中设置控制台自动换行,具体步骤为:File-Settings-Editor-General-Console,然后勾选Usesoftwrapsin... 目录IDEA如何让控制台自http://www.chinasem.cn动换行操作流http://www