mybatis resultmap高级映射

应用场景:如果sql查询的列名和pojo的属性名不一致,可以使用resultMap将列名和pojo的属性名作一个对应关系,就可以映射成功了.(如果返回值为interger等数据类型时使用resultType)

一对一

resultmap用<association>

应用场景:如order中有字段orderdetail,是一对一关系,映射到association中的column即orderdetail中有的字段

一对多

resultmap 用<collection>

场景:如pojo类user中有一个book属性,则user与book属于一对多关系(编程tips:userBook类可继承user类,减少代码量)

tips:此处userbookresultmap可继承自上一个userresultmap

多对多

collection和association一起使用,使用方法与上述相似,注意先后顺序

mybatis的一些高级用法:

动态sql

动态sql使用方法,先将sql写出来,再用相应的标签替换,注意使用<trim>标签来剔除and,or和“,”,避免出bug

(1)<sql>片段:需要查询的字段比较多时,可将字段写在该标签中,用id来标识,使用时只需<include>即可。如

(2) <trim>标签:

使用:

  • <trim>:prefix="":前缀
  • prefixoverride="AND | OR":去掉第一个and或or
  • suffixoverride=",":去掉最后一个,
  • suffix=“”后缀

应用场景:在动态sql使用过程中,需要判断字段是否为空,这时就会出现sql语句错误的情况,如多了and,or或着导致某些地方语句不正确,这时会出现sql执行出错或者查不到数据的情况,需要用该标签进行过滤(在实际使用中要特别注意,如果忽视找bug需要好久。。。)

(3)where-if语句,set-if语句

select * from user <where><if    test="username != null ">username = #{username}</if></where>
复制代码

说明:通用<where>,该标签会判断返回语=语句中是否有值,有得话就会插入一个where,而且如果返回值的开头是and 或or时他会剔除掉。同理,set-if语句与上述语句作用类似。这两个标签通常用<trim>替换

(4)choose(when,otherise)

说明:与java中的switch语句类似

使用:

<choose><when test="username != null  and username !=' '  "> //不为空格用单引号</when><otherwise>  ....</otherwise>
</choose>
复制代码

(5)foreach语句

<foreach  collection="ids"   item="id"   open="and ("  close=")"  separator="or" >
</foreach>
复制代码

说明:

  • collection:指定输入对象中的集合属性
  • item:每次遍历生成的对象
  • open:开始遍历时的拼接字符串
  • close:结束时拼接的字符串
  • separator:遍历对象之间需要拼接的字符串

(6)   bind语句:

使用bind元素我们可以预先定义一些变量,然后在查询语句中使用,如

<bind name="un" value="username + '%' "></bind>

SELECT* FROM user2 WHERE user_name LIKE #{un}

继承

resultmap使用继承机制可以减少很多代码量,而且简单直观,相应的pojo类继承也是同理

mybatis三剑客

(1)mybatis-generater:用于快速生成pojo,dao,mapper和mapper.xml

(2)mybatis-plugin(需要安装):

  1. dao层与mapper.xml文件关联,快速跳转到对应的代码行
  2. 编辑xml文件时支持自动补全
  3. 检查id冲突或属性冲突

(3)mybatis-pagehalper:一个动态分页和排序的插件,原理是通过spring的AOP来实现的,这个插件能在执行sql的时候,把相关的数据再执行一次

mybatis二级缓存

系统已经默认开启了一级缓存,当我们获取到一个SqlSession对象之后,如果调用SqlSession中的同一个方法查询同一条数据,那么第二次查询将不会去数据库中查询。

手动开启缓存:在mapper.xml中配置<cache>节点:如

<cache eviction="LRU" size=1024 readOnly=true />

replace into语法

replace into 跟 insert 功能类似,不同点在于:replace into 首先尝试插入数据到表中, 如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据。 否则,直接插入新数据。

要注意的是:插入数据的表必须有主键或者是唯一索引!否则的话,replace into 会直接插入数据,这将导致表中出现重复的数据。

mybatsi注解方式

例如:

一对一或一对多属性用@many,@one

@Select("select * from group_info where id = #{groupId}")
@Results({     //声明结果集,当返回结果不是java基本数据类型时使用
@Result(property ="id", column ="id"),              //property为实体类中的属性,column为数据库中的字段
@Result(property ="authorities", column ="id",   //colunm为authorities实体类对应数据库的字段
javaType = List.class,
many =@Many(select ="com.baicizhan.dao.user.GroupAuthMapper.getGroupAuthorities",
fetchType = FetchType.EAGER))
})复制代码
@Insert("insert into user_session(xdid, openid, token, wx_session) values(#{xdid}, #{openid}, #{token}, #{wxSession})")
@SelectKey(statement="SELECT LAST_INSERT_ID()", keyProperty="id", before=false, resultType=int.class)复制代码

@SelectKey的作用:SelectKey在Mybatis中是为了解决Insert数据时不支持主键自动生成的问题,并且返回的值是自增的主键

mybatis注解方式高级用法

1.动态sql:

在注解上不能直接使用动态的SQL,需要在其前后加入<script></script>

2.注解方式实现like语句:LIKE 也是不能够直接使用的 可以借助concat函数实现

例如:@Select("SELECT name from user WHERE email LIKE concat(#{prefix},'%') limit 5")

踩坑记录

大小写导致字段与数据库映射错误问题

MYSQL在Windows下不区分大小写,但在Linux上默认区分大小写。因此,数据库名、表名、字段名都不允许出现任何大写字母,避免节外生枝。以下划线分割

@Select("select * from group_info where id = #{groupId}")
@Results({
@Result(property ="id", column ="id"),
@Result(property ="authorities", column ="id",
javaType = List.class,many =@Many(select ="com.baicizhan.dao.user.GroupAuthMapper.getGroupAuthorities",
fetchType = FetchType.EAGER))
})复制代码

mapper文件映射时mybatis会选择驼峰式的方式对数据库的列与实体类映射,有时数据库中的列用“_”进行命名时就会出现映射不到的情况

解决方法:

1.在sql语句中使用“AS”关键字使实体类与数据库列名映射,如Open_ID as openId

2.在ResultMap中配置属性:column = "数据库列名",propetis="实体类属性名"

mybatis学习与踩坑记录相关推荐

  1. AirSim学习和踩坑记录(不定时更新)

    版权声明:本文为博主原创文章,遵循Creative Commons - Attribution-ShareAlike 4.0 International - CC BY-SA 4.0版权协议,转载请附 ...

  2. python打包exe之打包深度学习模型踩坑记录及其解决办法。

    在现实生活中,有时候我们写的程序需要发给小伙伴用,而小伙伴没有python,这时候我们需要将程序打包成exe文件发给小伙伴用. 今天讲下打包深度学习模型 打包一般要用到cmd命令行,要求cmd能执行p ...

  3. AffordaceNet属性学习网络踩坑记录(二)

    1.在编译代码网络下的caffe时,要注意是在root权限还是用户权限下,需要在同一权限下执行caffe编译和训练网络.推荐在root目录下执行 2.在运行测试网络时,使用的python路径为代码路径 ...

  4. 【学习记录】QT5界面设计的踩坑记录

    学习记录:QT5 界面设计的踩坑记录 前言 一.Qlabel显示视频与图片 1. 图片显示 1.1 显示格式 1.2 label随界面缩放 1.3 界面刷新 2. 视频显示 二.常见控件的StyleS ...

  5. MAC-XXL_JOB学习踩坑记录-Failed to create parent directories for [/data/applogs/xxl-job/xxl-job-admin.log

    MAC-XXL_JOB学习踩坑记录 源码下载地址 启动报错 源码下载地址 ①.GitHub:https://github.com/xuxueli/xxl-job ②.码云:https://gitee. ...

  6. cesium给地图添加比例尺学习踩坑记录

    cesium给地图添加比例尺学习踩坑记录 因项目需要在cesium地图中展示比例尺,本来应该是很简单的事,但却碰到了一个引用文件的坑,特此记录: *1.引用依赖文件 相信需要用到cesium比例尺组件 ...

  7. Slam学习笔记——ROS踩坑记录

    Slam学习笔记--ROS踩坑记录 1. 安装 2. ROS文件系统 2.1 工作区 2.2 包package 2.2.1 包的操作 2.2.2 描述文件package.xml 2.3 节点node ...

  8. 双系统Ubuntu22.04深度学习环境配置与踩坑记录

    双系统Ubuntu22.04深度学习环境配置踩坑记录 前言 目录 相关版本 主要参考教程 Ubuntu安装 Nvidia和CUDA安装 踩坑经历 官网安装所遇问题 cuDNN安装 Anaconda安装 ...

  9. osx php7 imagick,[PHP] MacOS 自带php环境安装imagick扩展踩坑记录 | 码农部落

    前言 最近学习yii2,在搭建环境后,发现在访问contact页面时报错,如下: "Either GD PHP extension with FreeType support or Imag ...

最新文章

  1. wxPython的简单应用
  2. 监控Tomcat解决方案(监控应用服务器系列文章分享)
  3. body区域怎么传一个数组_用户输入的虎狼之词,怎么校验之后不见了?
  4. chrome浏览器被reimage pair 劫持怎么处理
  5. python学习笔记(四)字典(dict)
  6. 如何在Java应用里集成Spark MLlib训练好的模型做预测
  7. Jquery全选单选功能
  8. oracle10 ins tcx,安装Oracle10g遭遇ins_ctx.mk问题-Oracle
  9. 自定义协同程序:CustomYieldInstruction
  10. 计算机网络实验五静态路由与RIP协议,实验锐捷实训8-1--配置静态路由和rip协议...
  11. 抄底公式---预测黑马
  12. 多元线性回归--machine learning
  13. 如何在前端用vue使用字典dicts?
  14. Redis 内存数据库
  15. 2022道路运输企业安全生产管理人员操作证考试题及在线模拟考试
  16. 一个投标经理的标书检查笔记,拿来就用!
  17. MFC框架 afx_msg CComboBox OnDropdown
  18. 有了它,将大大丰富VR内容,3D VR摄像机Vuze VR开启预定
  19. 构建根文件系统的/dev目录
  20. 去中心化云存储的前世今生 | 存储技术分享活动回顾

热门文章

  1. 微信或手机浏览器在线显示office文件(已測试ios、android)
  2. 网格分割后,边界点的获取方法
  3. 【iOS发展-44】通过案例谈iOS重构:合并、格式化输出、宏观变量、使用数组来存储数据字典,而且使用plist最终的知识...
  4. 【JavaScript】AJAX总结(异步JavaScript和XML)
  5. linux之dd命令
  6. 在线HTML实体转字符串工具
  7. 使用netcat的正向 / 反向shell
  8. Docker搭建nexus3私服
  9. Python基础:集合与文件操作
  10. Netpas:不一样的SD-WAN+ 保障网络通讯品质