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

前言

我们先来看两个东西,一个是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先将我们的参数封装起来了。我们还是来看个栗子吧~

<select id="queryPage" parameterType="Map" resultMap="userResultMap" >
	select * from u_user limit #{startPage},#{limit}
</select>
public class TestMybatis {
	public static void main(String[] args) {
		SqlSession session = MybatisUtil.getSession();
		UserMapper mapper = session.getMapper(UserMapper.class);
		int page = 2;
		int limit = 5;
		Map<String, Object> params = new HashMap<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);

那我们还是来测试一下

public class TestMybatis {
	public static void main(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标签下进行如下配置,可以配置指定的接口

在这里插入图片描述

public interface UserMapper {
	@Select("delete from u_user where id = #{id}")
	public void deleteUser(int id); 
}
public class TestMybatis {
	public static void main(String[] args) {
		SqlSession session = MybatisUtil.getSession();
		UserMapper mapper = session.getMapper(UserMapper.class);
		mapper.deleteUser(119);
		session.commit();
	}
}

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

Mybatis注解方式实现ResultMap

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

public interface UserMapper {
	@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);
}
public class TestMybatis {
	public static void main(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,大佬例外哈~

public interface UserMapper {
	@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学习的博客哦~

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值