概述
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学习与踩坑记录的全部内容,希望文章能够帮你解决mybatis学习与踩坑记录所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复