1. mybatis常用标签

基本的就不说了,主要记录一下动态sql的

1.if 标签
if标签通常用于WHERE语句、UPDATE语句、INSERT语句中,通过判断参数值来决定是否使用某个查询条件、判断是否更新某一个字段、判断是否插入某个字段的值。
<if test="name != null and name != ''">and NAME = #{name}
</if>2.foreach 标签foreach标签主要用于构建in条件,可在sql中对集合进行迭代。也常用到批量删除、添加等操作中。<!-- in查询所有,不分页 --><select id="selectIn" resultMap="BaseResultMap">select name,hobby from student where id in<foreach item="item" index="index" collection="list" open="(" separator="," close=")">#{item}</foreach></select>3 choose标签
有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个。
MyBatis提供了choose 元素,按顺序判断when中的条件出否成立,
如果有一个成立,则choose结束。当choose中所有when的条件都不满则时,
则执行 otherwise中的sql。类似于Java 的switch 语句,choose为switch,
when为case,otherwise则为default。 if是与(and)的关系,而choose是或(or)的关系。<select id="getStudentListChoose" parameterType="Student" resultMap="BaseResultMap">     SELECT * from STUDENT WHERE 1=1    <where>     <choose>     <when test="Name!=null and student!='' ">     AND name LIKE CONCAT(CONCAT('%', #{student}),'%')      </when>     <when test="hobby!= null and hobby!= '' ">     AND hobby = #{hobby}      </when>                   <otherwise>     AND AGE = 15  </otherwise>     </choose>     </where>
</select>   4. where标签
这个“where”标签会知道如果它包含的标签中有返回值的话,它就插入一个‘where’。
此外,如果标签返回的内容是以AND 或OR 开头的,则它会剔除掉。<select id="getStudentListWhere" parameterType="Object" resultMap="BaseResultMap">     SELECT * from STUDENT      <where>   <if test="name!=null and name!='' ">     NAME LIKE CONCAT(CONCAT('%', #{name}),'%')      </if>     <if test="hobby!= null and hobby!= '' ">     AND hobby = #{hobby}      </if>  </where>
</select>    5. set 标签
当在update语句中使用if标签时,使用set标签可以将动态的配置set关键字,和剔除追
加到条件末尾的任何不相关的逗号。<update id="updateStudent" parameterType="Object">UPDATE STUDENT<set><if test="name!=null and name!='' ">NAME = #{name},</if><if test="hobby!=null and hobby!='' ">MAJOR = #{major},</if><if test="hobby!=null and hobby!='' ">HOBBY = #{hobby}</if></set>WHERE ID = #{id};</update>6.include标签
sql标签中id属性对应include标签中的refid属性。通过include标签将sql片段
和原sql片段进行拼接成一个完整的sql语句进行执行。
例如:
<sql id="sqlid">res_type_id,res_type
</sql><select id="selectbyId" resultType="com.property.vo.PubResTypeVO">select<include refid="sqlid"/>from pub_res_type
</select>7.<-- 整合-->
<select id="queryUserByVo"resultType="net.seehope.spring.project.pojo.User"parameterType="net.seehope.spring.project.pojo.vo.UserQueryVo">select * from user<where><if test="user !=null"><if test="user.username!=null and user.username != ''">and username = #{user.username}</if><if test="user.id!=null and user.id != 0">and id = #{user.id}</if><if test="user.birthday!=null ">and birthday = #{user.birthday}</if><if test="user.sex!=null and user.sex!=''">and sex = #{user.sex}</if><if test="user.address!=null and user.address!='' ">and address = #{user.address}</if></if><if test="ids!=null and ids.size()!=0"><foreach collection="ids" open=" and id in (" close=")"separator="," item="id">#{id}</foreach></if></where></select>
<trim prefix="" suffix="" suffixOverrides="" prefixOverrides=""></trim>
prefix:在trim标签内sql语句加上前缀。
suffix:在trim标签内sql语句加上后缀。
suffixOverrides:指定去除多余的后缀内容,如:suffixOverrides=",",去除trim标签内sql语句多余的后缀","。
prefixOverrides:指定去除多余的前缀内容8.多表联查中:
JavaType和ofType都是用来指定对象类型的,但是JavaType是用来指定pojo中属性的类型,而ofType指定的是映射到list集合属性中pojo的类型。collection、association标签是用于体现关联的。 如一个实体与另一个实体之间是一对多的关系, 那么在一的一方使用 collection 标签,对应多的一方的一个集合, 在多的一方使用association标签对应一的一方的一个实体
<collection property="orderDetail"ofType="net.seehope.ssm.pojo.OrderDetail"><result property="id" column="id" /><result property="ordersId" column="orders_id" /><result property="itemsId" column="items_id" /><result property="itemsNum" column="items_num" /><!-- collection、association标签是用于体现关联的。 如一个实体与另一个实体之间是一对多的关系, 那么在一的一方使用 collection 标签,对应多的一方的一个集合, 在多的一方使用association标签对应一的一方的一个实体 --><association property="items"javaType="net.seehope.ssm.pojo.Items"><result property="id" column="id" /><result property="name" column="name" /><result property="price" column="price" /><result property="detail" column="detail" /><result property="pic" column="pic" /></association></collection>

2.缓存(一级缓存、二级缓存)

2.1区别:
一级缓存的作用域在sqlSession中
二级缓存的作用域是针对mapper做缓存,根据namespace

2.2 一级缓存
一级缓存是框架默认给我们开启的,不需要做任何配置。
例如我们查询了id为1的用户,mybatis会将用户的对象存储在一级缓存中,如果在此中间sqlSession发生了增删改操作,则mybatis会清空一级缓存,避免脏读

2.2 二级缓存

//开启缓存
SqlSession session=sqlSessionFactory .openSession();

二级缓存是mapper级别的缓存,多个sqlSession操作同一个mapper,不管sqlSession是否相同,只要mapper的namespace相同即可共享数据。

工作原理:
sqlSession 关闭后(close) ,一级缓存的数据会保存到二级缓存中,新的相同就会去二级缓存中去查询。

二级缓存开启要求:
1,xml 配置中开启 二级缓存
2,去mapper映射文件中使用二级缓存
3,需要将要存储数据的 pojo 实现 Serializable接口,为了将数据取出做反序列化操作,因为二级的缓存的存储方式多种多样,有可能存储在内存中,也可能储存到磁盘中。
4.可全局,也可在想哪个类开缓存就放在哪XXXMapper.xml

3.MyBatis中井号与$的区别

3.1 #{变量名}可以进行预编译、类型匹配等操作,会转化成jdbc的类型

3.2 ${变量名}不进行数据类型匹配,直接替换,可进行字符串拼接,容易sql注入,而且类型不会自行转化

4.懒加载(延迟加载)

说明:Mybatis中对于延迟加载设置,只对于resultMap中的collection和association起作用,可以应用到一对一、一对多、多对一、多对多的所有关联查询中

4.1场景

多对一查询:推荐立即加载
需求场景:查询账户时,基本需要显示用户信息

一对多查询:推荐延迟加载(减少内存浪费)
需求场景:查询用户信息时,不需要立即把用户的全部账户显示,推荐使用延迟加载

<!--全局参数设置-->
<settings><!--延迟加载总开关--><setting name="lazyLoadingEnabled" value="true"/><!--将aggressiveLazyLoading设置为false表示按需加载,默认为true--><setting name="aggressiveLazyLoading" value="false"/>
</settings>
<!--根据team的id查找player-->
<select id="selectPlayerByTeamId" resultType="Player">select id,name from t_player WHERE tid=#{id}
</select><!--关联属性映射关系-->
<!--集合的数据来自select查询,该查询的条件是selectTeamByIdAlone查询出的id-->
<resultMap id="teamMapAlone" type="Team"><id column="id" property="id"/><result column="name" property="name"/><collection property="playerList" ofType="Player" select="selectPlayerByTeamId" column="id"/>
</resultMap><select id="selectTeamByIdAlone" resultMap="teamMapAlone">SELECT id,name FROM t_team where id=#{id}
</select>

dao层

Team selectTeamByIdAlone(int id);

测试:

 @Test
public void selectTeamByIdAlone() {Team team = teamDao.selectTeamByIdAlone(1);System.out.println(team.getName());System.out.println(team.getPlayerList().size());
}

开启懒加载后,只要代码中不使用player相关的数据,mybatis就不会进行sql查询,只有当真正使用的时候才会去发出sql语句查询。

mybatis(超详细,常用)相关推荐

  1. MyBatis超详细介绍——SQL语句构建器类

    MyBatis超详细介绍--SQL语句构建器类 (本文作为学习笔记,了解更多请参考:MyBatis参考文档) MyBatis3提供了SQL类帮助构造SQL语句: private String sele ...

  2. SpringBoot整合Mybatis超详细流程

    SpringBoot整合Mybatis超详细流程 文章目录 SpringBoot整合Mybatis超详细流程 前言 详细流程 0.引入Mybatis 1.创建数据 2.创建程序目录 3.理解后台访问流 ...

  3. MyBatis超详细笔记

    文章目录 1.MyBatis入门 1.1 **简介**: 1.2 持久层 1.3 为什么需要MyBatis? 2.第一个MyBatis程序 2.1 搭建环境 2.2编写代码 2.3 测试 3. CRU ...

  4. Ubuntu18 的超详细常用软件安装

    点赞再看,动力无限.Hello world : ) 微信搜「 程序猿阿朗 」. 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多知识点和系列文章. 心血 ...

  5. mybatis超详细的笔记记录

    什么是 MyBatis? MyBatis 是一款优秀的持久层框架,它支持自定义 SQL.存储过程以及高级映射.MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作.MyBat ...

  6. MyBatis超详细执行流程图

  7. Nginx实战部署常用功能演示(超详细版),绝对给力~~~

    前言 上次分享了一些开发过程中常用的功能,但如果到真实环境中,其实还需要一些额外的配置,比如说跨域.缓存.配置SSL证书.高可用等,老规矩,还是挑几个平时比较常用的进行演示分享.上篇详见Nginx超详 ...

  8. Mybatis注解开发(超详细)

    Mybatis注解开发 mybatis的常用注解 使用 Mybatis 注解实现基本 CRUD 项目目录结构 编写实体类 使用注解方式开发持久层接口 编写 SqlMapConfig.xml 配置文件 ...

  9. 史上最全的Linux常用——目录和文件管理命令——收藏这一篇就够了!(超全,超详细)

    史上最全的Linux常用--目录和文件管理命令--收藏这一篇就够了!(超全,超详细) Linux目录结构 命令 查看文件内容:-cat 查看文件内容:-more 查看文件内容:-less 查看文件内容 ...

最新文章

  1. 退役笔记一#MySQL = lambda sql : sql + #39; Source Code 4 Explain Plan #39;
  2. 虚函数和纯虚函数的区别?
  3. qq聊天界面 java程序 51cto_Java QQ项目详细设计之:组操作模块
  4. 删除win7多余的系统还原点_【Win7封装教程2019版】系列(二)必要的系统调整
  5. 连接远程Windows主机中的虚拟机
  6. xp硬盘上安装ubuntu12.04双系统
  7. okhttp返回内容乱码_okHttp 采坑指南-interceptor(乱码)
  8. 原生JS实现一个无缝轮播图插件(支持vue)
  9. Python入门:Dataframe的索引模式
  10. MT4缠论公式指标(缠中狩猎外汇MT4缠论分笔分段中枢公式指标)
  11. 百度文库付费文档免费下载
  12. 如何使用Global Mapper分幅导出地图
  13. 关于js中的then()
  14. 编程题:核桃的数量(求最小公倍数的问题)
  15. polsarpro滤波后没有bmp文件_win10系统右键新建菜单中没有bmp如何解决
  16. sql根据指定符号拆分字符串表函数
  17. mpeg2是信源还是信道编码_解析信源编码与信道编码之间的区别
  18. 需求经理作业——第二组头脑风暴结果
  19. Hexo-显示用户头像
  20. 线程池ExecutorService中submit和execute区别

热门文章

  1. 增强型热图绘制R(superheat, heatmap.2, pheatmap)
  2. 最新研究 | 解码特定任务和一般任务的大脑功能结构
  3. html视频一直播放代码,通过HTML5调用播放视频的一些注意事项和代码方法
  4. 夜间灯光影像区域稳定像元提取
  5. linux登陆域_Ubuntu 13.04 登录Windows域
  6. 欧氏空间内积定义_向量空间、赋范空间、内积空间、欧式空间、希尔伯特空间...
  7. 简单问题还是得简单处理
  8. 《涨知识啦41》——半导体中的光吸收
  9. 益和VA实现任意服务器迁移,IP地址变化不再受限
  10. 生物医学统计方法总结