mybatis学习与踩坑记录
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(需要安装):
- dao层与mapper.xml文件关联,快速跳转到对应的代码行
- 编辑xml文件时支持自动补全
- 检查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学习与踩坑记录相关推荐
- AirSim学习和踩坑记录(不定时更新)
版权声明:本文为博主原创文章,遵循Creative Commons - Attribution-ShareAlike 4.0 International - CC BY-SA 4.0版权协议,转载请附 ...
- python打包exe之打包深度学习模型踩坑记录及其解决办法。
在现实生活中,有时候我们写的程序需要发给小伙伴用,而小伙伴没有python,这时候我们需要将程序打包成exe文件发给小伙伴用. 今天讲下打包深度学习模型 打包一般要用到cmd命令行,要求cmd能执行p ...
- AffordaceNet属性学习网络踩坑记录(二)
1.在编译代码网络下的caffe时,要注意是在root权限还是用户权限下,需要在同一权限下执行caffe编译和训练网络.推荐在root目录下执行 2.在运行测试网络时,使用的python路径为代码路径 ...
- 【学习记录】QT5界面设计的踩坑记录
学习记录:QT5 界面设计的踩坑记录 前言 一.Qlabel显示视频与图片 1. 图片显示 1.1 显示格式 1.2 label随界面缩放 1.3 界面刷新 2. 视频显示 二.常见控件的StyleS ...
- 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. ...
- cesium给地图添加比例尺学习踩坑记录
cesium给地图添加比例尺学习踩坑记录 因项目需要在cesium地图中展示比例尺,本来应该是很简单的事,但却碰到了一个引用文件的坑,特此记录: *1.引用依赖文件 相信需要用到cesium比例尺组件 ...
- Slam学习笔记——ROS踩坑记录
Slam学习笔记--ROS踩坑记录 1. 安装 2. ROS文件系统 2.1 工作区 2.2 包package 2.2.1 包的操作 2.2.2 描述文件package.xml 2.3 节点node ...
- 双系统Ubuntu22.04深度学习环境配置与踩坑记录
双系统Ubuntu22.04深度学习环境配置踩坑记录 前言 目录 相关版本 主要参考教程 Ubuntu安装 Nvidia和CUDA安装 踩坑经历 官网安装所遇问题 cuDNN安装 Anaconda安装 ...
- osx php7 imagick,[PHP] MacOS 自带php环境安装imagick扩展踩坑记录 | 码农部落
前言 最近学习yii2,在搭建环境后,发现在访问contact页面时报错,如下: "Either GD PHP extension with FreeType support or Imag ...
最新文章
- wxPython的简单应用
- 监控Tomcat解决方案(监控应用服务器系列文章分享)
- body区域怎么传一个数组_用户输入的虎狼之词,怎么校验之后不见了?
- chrome浏览器被reimage pair 劫持怎么处理
- python学习笔记(四)字典(dict)
- 如何在Java应用里集成Spark MLlib训练好的模型做预测
- Jquery全选单选功能
- oracle10 ins tcx,安装Oracle10g遭遇ins_ctx.mk问题-Oracle
- 自定义协同程序:CustomYieldInstruction
- 计算机网络实验五静态路由与RIP协议,实验锐捷实训8-1--配置静态路由和rip协议...
- 抄底公式---预测黑马
- 多元线性回归--machine learning
- 如何在前端用vue使用字典dicts?
- Redis 内存数据库
- 2022道路运输企业安全生产管理人员操作证考试题及在线模拟考试
- 一个投标经理的标书检查笔记,拿来就用!
- MFC框架 afx_msg CComboBox OnDropdown
- 有了它,将大大丰富VR内容,3D VR摄像机Vuze VR开启预定
- 构建根文件系统的/dev目录
- 去中心化云存储的前世今生 | 存储技术分享活动回顾