用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

相关文章

MyBatis常用XML语法详解

《MyBatis常用XML语法详解》文章介绍了MyBatis常用XML语法,包括结果映射、查询语句、插入语句、更新语句、删除语句、动态SQL标签以及ehcache.xml文件的使用,感兴趣的朋友跟随小... 目录1、定义结果映射2、查询语句3、插入语句4、更新语句5、删除语句6、动态 SQL 标签7、ehc

IDEA和GIT关于文件中LF和CRLF问题及解决

《IDEA和GIT关于文件中LF和CRLF问题及解决》文章总结:因IDEA默认使用CRLF换行符导致Shell脚本在Linux运行报错,需在编辑器和Git中统一为LF,通过调整Git的core.aut... 目录问题描述问题思考解决过程总结问题描述项目软件安装shell脚本上git仓库管理,但拉取后,上l

MyBatis延迟加载与多级缓存全解析

《MyBatis延迟加载与多级缓存全解析》文章介绍MyBatis的延迟加载与多级缓存机制,延迟加载按需加载关联数据提升性能,一级缓存会话级默认开启,二级缓存工厂级支持跨会话共享,增删改操作会清空对应缓... 目录MyBATis延迟加载策略一对多示例一对多示例MyBatis框架的缓存一级缓存二级缓存MyBat

idea npm install很慢问题及解决(nodejs)

《ideanpminstall很慢问题及解决(nodejs)》npm安装速度慢可通过配置国内镜像源(如淘宝)、清理缓存及切换工具解决,建议设置全局镜像(npmconfigsetregistryht... 目录idea npm install很慢(nodejs)配置国内镜像源清理缓存总结idea npm in

idea+spring boot创建项目的搭建全过程

《idea+springboot创建项目的搭建全过程》SpringBoot是Spring社区发布的一个开源项目,旨在帮助开发者快速并且更简单的构建项目,:本文主要介绍idea+springb... 目录一.idea四种搭建方式1.Javaidea命名规范2JavaWebTomcat的安装一.明确tomcat

idea突然报错Malformed \uxxxx encoding问题及解决

《idea突然报错Malformeduxxxxencoding问题及解决》Maven项目在切换Git分支时报错,提示project元素为描述符根元素,解决方法:删除Maven仓库中的resolv... 目www.chinasem.cn录问题解决方式总结问题idea 上的 maven China编程项目突然报错,是

mybatis直接执行完整sql及踩坑解决

《mybatis直接执行完整sql及踩坑解决》MyBatis可通过select标签执行动态SQL,DQL用ListLinkedHashMap接收结果,DML用int处理,注意防御SQL注入,优先使用#... 目录myBATiFBNZQs直接执行完整sql及踩坑select语句采用count、insert、u

MyBatis Plus大数据量查询慢原因分析及解决

《MyBatisPlus大数据量查询慢原因分析及解决》大数据量查询慢常因全表扫描、分页不当、索引缺失、内存占用高及ORM开销,优化措施包括分页查询、流式读取、SQL优化、批处理、多数据源、结果集二次... 目录大数据量查询慢的常见原因优化方案高级方案配置调优监控与诊断总结大数据量查询慢的常见原因MyBAT

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

Java 缓存框架 Caffeine 应用场景解析

《Java缓存框架Caffeine应用场景解析》文章介绍Caffeine作为高性能Java本地缓存框架,基于W-TinyLFU算法,支持异步加载、灵活过期策略、内存安全机制及统计监控,重点解析其... 目录一、Caffeine 简介1. 框架概述1.1 Caffeine的核心优势二、Caffeine 基础2