Marco's Java【Mybatis进阶(三) 使用注解实现Mybatis】

2022-10-23 13:15:21

前言

我们先来看两个东西,一个是HIBERNATE严肃的图标,一个是我们可爱的愤怒的小鸡,学了这么久的Mybatis,我居然没有把它的Logo放出来给大家伙儿瞧瞧,是我失策了,哈哈~
不过刚好就这一节,我们就来聊聊
在这里插入图片描述
在这里插入图片描述

Hibernate 和 Mybatis框架

之前有简单的提到过这两个框架,并且简单的做了一个对比,以及为什么我们选择Mybatis会多一点,我们再来重新温习一下。

Hibernate 框架
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,建立对象与数据库表的映射。是一个全自动的、完全面向对象的持久层框架,Hibernate一般用在传统的MIS系统开发。

Mybatis框架
Mybatis是一个开源对象关系映射框架,原名:ibatis,2010年由谷歌接管以后更名。是一个半自动化的持久层框架。Mybatis一般应用在互联网项目的开发,它的运行的性能高于hibernate的性能,但开发速度低于hibernate的开发速度

从上面的介绍,我们不难看出来两者的区别和联系,首先两者都是开源的对象关系映射ORM框架,但是大家发现一个很明显的区别没有?
就是Hibernate 是全自动,完全面向对象的,而Mybatis是半自动化,非完全面向对象的。
大家学习了这么久,应该知道为什么Mybatis被称之为半自动化的框架了,那么何为全自动化?使用什么来实现的?
可以说Hibernate的全自动化的实现得益于注解,通过将注解、反射、代理的完全整合封装,实现一套完整的或者说完全面向对象的一套API,不用写任何Sql,直接"傻瓜式"式调用就可以实现我们的JDBC全自动化操作。

Mybatis核心注解@Param

说了这么多,终于要切入正题了,什么是注解,相信大家已经不用我再讲啦,不清楚的朋友直接戳Marco’s Java 之【Annotation注解】
通过使用注释,我们可以实现对象的赋值,给类、属性、方法起别名等等作用,既然我们通过反射能够获取到注解,那么就意味着我们很多Sql操作,都在写在注解上,虽然起别名做标记这种事情感觉对于注解来说是大材小用,但是恰恰就是这一个功能会省掉我们不少的麻烦。

大家回顾我们之前学习的内容有没有发现,我们Dao层写的方法全部都是传一个值的?
欸?有的朋友会问了,我们接受的值是多个啊?
对,我们接收的时候确实接收了多个,那是因为我们先使用Map先将我们的参数封装起来了。我们还是来看个栗子吧~

<selectid="queryPage"parameterType="Map"resultMap="userResultMap">
	select * from u_user limit #{startPage},#{limit}</select>
publicclassTestMybatis{publicstaticvoidmain(String[] args){
		SqlSession session= MybatisUtil.getSession();
		UserMapper mapper= session.getMapper(UserMapper.class);int page=2;int limit=5;
		Map<String, Object> params=newHashMap<String, Object>();
		params.put("startPage",(page-1)* limit);
		params.put("limit", limit);
		List<User> users= mapper.queryPage(params);for(User user: users){
			System.out.println(user);}
		session.close();}}

栗子比较简单,相信凭大家的实力完全没有问题!
那我想说明的是我们想传参数进去,必须要经过Map这个通道,然后在XML中接收数据,
像不像哆啦A梦里的放大缩小灯道具?
小时候看哆啦A梦时,觉得这个道具贼神奇,我还记得那一集哆啦A梦想让大家进到模型城堡里面去玩,但是大家的体型太大了,根本进不去,他就掏出了缩小灯,先让大家的体型缩小。那这里的Map就好比缩小灯,本来好几个参数是没有办法传值的,但是我现在把你们全都装起来,缩小了,一起带进去不就可以啦

但是参数一多了,我们要不停的往Map里装数据,显得很麻烦,而且大家应该知道Map的大小其实是受限制的,或者说是参数多了,查询起来相对会慢。那么这个时候我们就可以使用注解。配置如下。

public List<User>queryPage(@Param(value="startPage")int startPage,@Param(value="limit")int limit);

那我们还是来测试一下

publicclassTestMybatis{publicstaticvoidmain(String[] args){
		SqlSession session= MybatisUtil.getSession();
		UserMapper mapper= session.getMapper(UserMapper.class);int page=2;int limit=5;
		List<User> users= mapper.queryPage((page-1)* limit,limit);for(User user: users){
			System.out.println(user);}
		session.close();}}

这样就算paramType不写值,我们的数据也不会走丢,妈妈再也不用担心我迷路啦~
在这里插入图片描述

Mybatis注解实现SQL

注解除了当作注释、标记来用,还可以通过在注解里写sql来实现JDBC操作
配置mybatis-config.xml

当我们使用注解实现SQL的时候,必然要使用接口绑定,那么之前用到的的mapper配置就不行了,
我们可以选择采用以下两种配置方式:

配置一:<package name=“com.marco.mapper”/>mappers标签下进行如下配置,可以扫描包下的所有类和xml
配置二:<mapper class=“com.marco.UserMapper”/>mappers标签下进行如下配置,可以配置指定的接口

在这里插入图片描述

publicinterfaceUserMapper{@Select("delete from u_user where id = #{id}")publicvoiddeleteUser(int id);}
publicclassTestMybatis{publicstaticvoidmain(String[] args){
		SqlSession session= MybatisUtil.getSession();
		UserMapper mapper= session.getMapper(UserMapper.class);
		mapper.deleteUser(119);
		session.commit();}}

运行之后结果如下
在这里插入图片描述

Mybatis注解方式实现ResultMap

因为大家之前接触过XML配置ResultMap,所以这种写法应该能够接受,我就直接上配置啦

publicinterfaceUserMapper{@Select("select user_name, password, real_name, img, is_del from u_user where real_name like concat('%',#{realName},'%')")@Results({@Result(column="user_name", property="userName"),@Result(column="real_name", property="realName"),@Result(column="is_del", property="isDel")})public List<User>fuzzyQuery(String realName);}
publicclassTestMybatis{publicstaticvoidmain(String[] args){
		SqlSession session= MybatisUtil.getSession();
		UserMapper mapper= session.getMapper(UserMapper.class);
		List<User> users= mapper.fuzzyQuery("mar");for(User user: users){
			System.out.println(user);}}}

在这里插入图片描述

Mybatis注解方式实现动态SQL

Mybatis注解方式实现动态SQL相对来说要复杂很多,在注解中使用动态SQL的前后必须要用<script></script>包裹,我们这边写个小栗子供大家参考,因为比较复杂,所以后期开发的时候我们也不会使用注解来实现动态SQL,大佬例外哈~

publicinterfaceUserMapper{@Select("<script>select user_name, password, real_name, img, is_del""from u_user <where><if test='realName != null""and realName !=\"\"'>real_name like concat('%',#{realName},'%')</if></where></script>")@Results({@Result(column="user_name", property="userName"),@Result(column="real_name", property="realName"),@Result(column="is_del", property="isDel")})public List<User>fuzzyQuery(@Param(value="realName")String realName);}

总结

到此为止我们的注解就讲完啦,大家发现没有,其实除了@Param,其他Mybatis注解的功能,我们都可以使用XML来实现,或许有的朋友会觉得注解实现起来会比较简单,那我就来谈谈我对注解的看法
Mybatis注解的优点

  • 能够通过给元素起别名的方式,准确的定位到元素并获取相应的值
  • 在Java中进行配置,更贴合我们编程的思想,更"亲切"

Mybatis注解的缺点

  • 代码结构复杂,好比说我们的Mybatis注解方式实现动态SQL
  • 即使我们使用注解写Sql,也必须在XML做基本配置,因此维护的时候,开发人员即要关注java文件中注解 也要关注xml文件sql配置

不过,没有硬性规定,大家习惯用哪一种就可以啦,当然对于不想写Sql的朋友建议我也不建议去学Hibernate,个人比较推荐我们之前提到的一款国产Mysql辅助工具Mysql Plus,长下面这个样子,真的很逗比!但是很好用,后续有机会我会出一套关于Mysql Plus学习的博客哦~

在这里插入图片描述

  • 作者:Marco Zheng
  • 原文链接:https://blog.csdn.net/weixin_44698119/article/details/94763222
    更新时间:2022-10-23 13:15:21