前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mybatis新手进阶知识点,老鸟请走开

Mybatis新手进阶知识点,老鸟请走开

作者头像
Mshu
发布2022-03-22 14:20:44
3620
发布2022-03-22 14:20:44
举报
文章被收录于专栏:咸鱼不闲咸鱼不闲

ORM全称:object relation mapping,译为:对象关系映射。 ORM框架是将对象和数据库表字段建立映射,并提供CRUD操作的API的框架。

Java原生的与数据库连接的方式是JDBC,每次操作需要以下6个步骤

  1. 加载数据库驱动
  2. 创建连接
  3. 创建一个Statement
  4. 执行SQL
  5. 处理结果集
  6. 关闭连接

原生的方式步骤繁琐,开发效率低,市面上有很多的优秀的ORM框架:

  1. Hibernate 全自动ORM框架,弱化sql, 甚至不需要考虑建表,Hibernate会根据对象生成表甚至中间表。CURD一般不需要写sql。用起来方便,用好很难,有些老的项目还在用。
  2. Mybatis半自动ORM框架,本文的主角,被广泛使用,它支持自定义 SQL、存储过程以及高级映射。前身是ibatis, 另外还有一个在此基础上封装的号称为简化开发而生的框架MyBatis-Plus。提供通用的CURD,一般操作不需要写sql。
  3. JPA是大spring旗下ORM框架,特点是根据方法名就能自动实现方法逻辑,你敢信?不信可以看看这篇文章《简单才是美! SpringBoot+JPA

下面将介绍一些mybatis新手进阶知识点,老鸟请走开🤦‍♂️

嵌套查询

resultMap中嵌套一个查询。通过标签<association>select属性完成。select的值是另一个<select>查询的id,column属性为关联字段,用来实现关联查询。

根据user_id查询user

<association>中嵌套一个id为selectAddressByUserId的查询,查询这个用户的地址。

id为selectAddressByUserId的查询:根据用户id查询地址详情:

嵌套结果

上面的查询会有N+1的问题,就是执行两遍查询,可以使用联表查询解决这个问题,结果集同样是使用<resultMap>映射,<association>标签+resultMap属性。具体写法如下:

association标签的resultMap属性指向address的resultMap

联表查询sql

还可以一对多的映射,将<association>换成<collection>,实现一个人有多个女朋友的一对多关联查询。

myabtis会自动合并重复的user,girlFriends作为集合映射到user的girlFriends属性。

代码语言:javascript
复制
    <resultMap id="BaseResultWithGirlFriendsMap" type="com.mashu.springmybatis.entity.UserWithGirlFriends">
        <id column="user_id" property="userId" jdbcType="INTEGER"/>
        <result column="name" property="name" jdbcType="VARCHAR"/>
        <result column="email" property="email" jdbcType="VARCHAR"/>
        <collection property="girlFriends" ofType="com.mashu.springmybatis.entity.GirlFriend">
            <id column="girl_friend_id" property="girlFriendId" jdbcType="INTEGER"/>
            <result column="user_id" property="userId" jdbcType="VARCHAR"/>
            <result column="girl_friend_name" property="name" jdbcType="VARCHAR"/>
            <result column="age" property="age" jdbcType="INTEGER"/>
            <result column="weight" property="weight" jdbcType="INTEGER"/>
            <result column="height" property="height" jdbcType="INTEGER"/>
        </collection>
    </resultMap>

懒加载

除了联表查询解决N+1的问题,mybatis的懒加载似乎更好,拿第一个嵌套查询的栗子来说,如果开启了懒加载,

在不使用address的时候,只会执行查询user的sql,不会执行查询address的sql。

只有在使用中get了address属性才会执行查询address的sql,使用起来也很见简单:

yml配置

<association>加上fetchType="lazy"的属性即可。

但是,实现懒加载的问题比较多😢:

  1. 如果报错No serializer found for class org.apache.ibatis.executor.loader.javassist.JavassistProxyFactory.. 序列化问题需要在实体类上添加注解@JsonIgnoreProperties(value = {"handler"})
  2. 如果懒加载失败:检查是否是lombok中的@Data注解的toString()导致的
  3. 检查全局配置是否正确
  4. 还有在idea失败,在eclipce成功的。。。

一二级缓存

一级缓存,一次请求查询两次数据,第二次从缓存中取,mybatis默认开启 二级缓存,多次请求查询同一个数据,都能从缓存中取,需要手动开启

开启全局配置:

添加useCache="true"属性。

类型处理器

有时候我们在入库和出库的时候对字段做一些处理, 比如不支持utf8mb4的数据库存储emoji表情之前需要转义成utf8支持的unicode字符编码,出库后需要转化成emoji表情。 又或者用户的密码不能明文保存到数据库,入库需要进行一些加密操作。 mybatis的类型处理器,就可以在入库和出库前对数据做一些操作。 下面举个栗子将邮箱入库Base64加密,出库Base64解密。

自定义类型处理器类继承BaseTypeHandler抽象类。

字段添加typeHandler属性,并指向自定义类型处理器类的路径

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-09-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 嵌套查询
  • 嵌套结果
  • 懒加载
  • 一二级缓存
  • 类型处理器
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档