ORM全称:object relation mapping,译为:对象关系映射。 ORM框架是将对象和数据库表字段建立映射,并提供CRUD操作的API的框架。
Java原生的与数据库连接的方式是JDBC,每次操作需要以下6个步骤
原生的方式步骤繁琐,开发效率低,市面上有很多的优秀的ORM框架:
下面将介绍一些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属性。
<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"
的属性即可。
但是,实现懒加载的问题比较多😢:
@JsonIgnoreProperties(value = {"handler"})
一级缓存,一次请求查询两次数据,第二次从缓存中取,mybatis默认开启 二级缓存,多次请求查询同一个数据,都能从缓存中取,需要手动开启
开启全局配置:
添加useCache="true"属性。
有时候我们在入库和出库的时候对字段做一些处理, 比如不支持utf8mb4的数据库存储emoji表情之前需要转义成utf8支持的unicode字符编码,出库后需要转化成emoji表情。 又或者用户的密码不能明文保存到数据库,入库需要进行一些加密操作。 mybatis的类型处理器,就可以在入库和出库前对数据做一些操作。 下面举个栗子将邮箱入库Base64加密,出库Base64解密。
自定义类型处理器类继承BaseTypeHandler
抽象类。
字段添加typeHandler
属性,并指向自定义类型处理器类的路径
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有