我是靠谱客的博主 震动月亮,最近开发中收集的这篇文章主要介绍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(需要安装):

  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学习与踩坑记录的全部内容,希望文章能够帮你解决mybatis学习与踩坑记录所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部