文档章节

Spring-Boot整合mybatis(三)-注解的基本使用

贺小五
 贺小五
发布于 2017/03/25 01:26
字数 2293
阅读 4542
收藏 99

前面两篇说了一下springboot整合mybatis跟使用阿里的druid包,这次给大家介绍一下mybatis3.0后增加的注解基本使用吧,限于篇幅,下篇在介绍基于注解的动态SQL,本篇只介绍mybatis的基本使用,跟注意的地方

 

先介绍一下开发环境:

  1. jdk版本是1.8
  2. springboot的版本是1.4.1
  3. 开发工具为 intellij idea
  4. 引入mybatis的依赖,这里就不用说了,如果不知道引入哪个依赖,请看我第一篇博客

 

 

篇幅介绍:

  1.    先介绍增删改查四个注解(附带参数注解以及插入返回注解) 
  2.    然后是返回参数类型注解
  3.    一对多,一对一注解使用

------------------------------------分割线-------------------------------------

 

我们先创建2个表,SQL如下

create table city (id int primary key auto_increment, name varchar(32), state varchar(32), country varchar(32));
create table school (id int primary key auto_increment, name varchar(32), state varchar(32), cityId varchar(32));

创建2个是因为,我们会使用到级联的一对一,跟一对多查询

然后我们插入一些数据:

insert into school(name, state, cityId) values('北大附中','ON','1');
insert into school(name, state, cityId) values('人大附中','ON','1');
insert into school(name, state, cityId) values('清华附中','ON','1');


INSERT INTO city(name,state,country) VALUES ('北京','ON','CN');
INSERT INTO city(name,state,country) VALUES ('上海','ON','CN');
INSERT INTO city(name,state,country) VALUES ('广州','OFF','CN');

然后开始介绍我们的注解

 

然后是我们后面开发中使用频率最高的四个注解:

  1. @Select  查询
  2. @Insert 插入
  3. @Delete 删除
  4. @Update 修改

上面四个注解,应该是mybatis注解中使用频率最高的,四个都是method(方法)注解,然后我们在mapper下增加如下代码:

 

	/**
	 * 创建人:贺小五
	 * 创建时间:2017-03-22 23:28:33
	 * 描述:
	 * 		根据主键查询单个city对象
	 */
	@Select("SELECT * FROM city WHERE id = #{id}")
	City findById(@Param("id") int id);

	/**
	 * 创建人:贺小五
	 * 创建时间:2017-03-23 16:36:14
	 * 描述:
	 * 		更新对象
	 */
	@Update(" update city set name=#{city.name},state=#{city.state} where id=#{city.id} ")
	void upadate(@Param("city") City city);

	/**
	 * 创建人:贺小五
	 * 创建时间:2017-03-22 23:28:43
	 * 描述:
	 * 		插入数据,返回主键
	 */
	@Insert(" insert into city(name, state, country) values(#{city.name}, #{city.state}, #{city.country}) ")
	void insert(@Param("city") City city);


	/**
	 * 创建人:贺小五
	 * 创建时间:2017-03-22 23:46:03
	 * 描述:
	 * 		根据主键删除数据
	 */
	@Delete(" delete from city where id = #{id} ")
	void deleteId(@Param("id")int id);

 

 

上面代表了基本的增删改查,可能有同学会问了,@Param注解是干嘛用的,这个注解是用于你取参数是,可以根据取的别名进行取参,例如#{id}这样,如果你不想用这个注解也行,我们可以这么写:

 

	/**
	 * 创建人:贺小五
	 * 创建时间:2017-03-22 23:28:33
	 * 描述:
	 * 		根据主键查询单个city对象
	 */
	@Select("SELECT * FROM city WHERE id = #{0}")
	City findById(int id);

 

不通过id的别名进行取参,而是根据下标来进行取值,

 

 

可能也有同学想说,我插入后,想返回主键,可以,我们可以增加使用注解@Options来让它返回主键

 

	/**
	 * 创建人:贺小五
	 * 创建时间:2017-03-22 23:28:43
	 * 描述:
	 * 		插入数据,返回主键
	 */
	@Insert(" insert into city(name, state, country) values(#{city.name}, #{city.state}, #{city.country}) ")
	@Options(useGeneratedKeys = true, keyProperty = "city.id")
	int insert(@Param("city") City city);

 

注意了,这里必须使用别名,而且获取注解也是你执行该函数后,调用 插入model.get主键的形式来获取,如果不使用别名,你是不能获取到主键值的,

  1. userGeneratedKeys 默认是false,表示使用生成的ID
  2. keyProperty 映射的是model里面主键的名称

 

------------------------------------分割线-------------------------------------

 

接下来,我们介绍返回参数的4个注解:

  1. @ResultMap  配合@Results注解使用,返回一个映射的对象(以前使用过mybatis的同学应该知道,在XML里面会有个映射对象,就叫ResultMap,这个注解就是该作用)

  2. @ResultType 返回一个自定义对象,例如,一个表有10个字段,你只想用5个字段,而且又多条数据,这个注解就有用武之地了,

  3. @Results    里面用于映射自定义的model,以及自定义model的别名,可以配合@ResultMap使用
  4. @Result   注解@Results的子集,用于配合@Results注解的使用,用于映射表字段跟类属性使用,配合@One以及@Many进行一对一,一对多的使用

 

    因为以上每个注解内的参数比较多,时间有限,暂时不一一介绍了,有兴趣的可以自己进入注解查看源码跟注释就能看明白了,我这只介绍下基本的使用,具体使用代码如下:

 

	/**
	 * 创建人:贺小五
	 * 创建时间:2017-03-24 22:13:11
	 * 描述:
	 * 		级联查询,一对一,返回自定义对象
	 */
	@Select(" select * from school where id=#{id} ")
	@Results(
			id = "school",
			value = {
					@Result(column = "id",property = "id"),
					@Result(column = "name",property = "name"),
					@Result(column = "state",property = "state"),
					@Result(column = "cityId",property = "cityId")
					)
			}
	)
	School findOneToOne(@Param("id")int id);


	/**
	 * 创建人:贺小五
	 * 创建时间:2017-03-24 22:13:51
	 * 描述:
	 * 		根据ID跟状态,返回自定义对象
	 */
	@Select(" select * from school where id=#{id} and state=#{state} ")
	@ResultMap(value = "school")
	School findResultMap(@Param("id")int id,@Param("state")String state);


	/**
	 * 创建人:贺小五
	 * 创建时间:2017-03-23 15:17:59
	 * 描述:
	 * 		根据ID查询,返回自定义的List<Map> 集合
	 */
	@Select(" SELECT c.id AS cityId ,c.name AS cityName ,s.id AS schoolId,s.name AS schoolName FROM city c LEFT JOIN school s ON s.cityId = c.id WHERE c.id = #{id} ")
	@ResultType(List.class)
	List<Map<String,String>> findByMaps(@Param("id")int id);


	/**
	 * 创建人:贺小五
	 * 创建时间:2017-03-24 23:09:43
	 * 描述:
	 * 		根据ID查询,返回自定义的MAP集合
	 */
	@Select(" SELECT c.id AS cityId ,c.name AS cityName  FROM city c WHERE c.id =#{id} ")
	@ResultType(Map.class)
	Map<String,String> findByMap(@Param("id")int id);

 

 

在这介绍下上面注解内使用的一些参数解释

 @Results 

  •    id 映射model的别名,用于给@ResultMap注解内参数使用
  •    value[] 内部只能使用@Result 注解,用于表字段跟属性的映射

@Result

  •    column 表字段名称
  •    property 属性字段名称

@ResultMap

  • value  @Results 的id值

@ResultType

  • Class<?>  只能使用 class,例如你返回一个List,参数就是 List.clss,Map的话就是Map.class

 

 

------------------------------------分割线-------------------------------------

 

最后,我们介绍一下,一对多跟一对一的注解使用:

  1. @One跟@Many都是在注解 @Result 内使用,@Result注解内有个 one跟many的属性,对应的是注解@One跟@Many

  2. @One 一对一注解,表示返回的是一个关联对象
  3. @Many 一对多注解,表示返回的是一个关联对象集合

 

然后我们使用这两个注解非常简单,只需要在上面的注解添加上一些东西就好了,代码如下:

	/**
	 * 创建人:贺小五
	 * 创建时间:2017-03-24 22:13:11
	 * 描述:
	 * 		级联查询,一对一,返回自定义对象
	 */
	@Select(" select * from school where id=#{id} ")
	@Results(
			id = "school",
			value = {
					@Result(column = "id",property = "id"),
					@Result(column = "name",property = "name"),
					@Result(column = "state",property = "state"),
					@Result(column = "cityId",property = "cityId"),
					@Result(column = "cityId",property = "city",one = @One(select = "com.demo.mybatisDemo.CityMapper.findById"))
			}
	)
	School findOneToOne(@Param("id")int id);


	/**
	 * 创建人:贺小五
	 * 创建时间:2017-03-22 23:28:33
	 * 描述:
	 * 		根据主键查询单个city对象
	 */
	@Select("SELECT * FROM city WHERE id = #{id}")
	City findById(@Param("id") int id);


	/**
	 * 创建人:贺小五
	 * 创建时间:2017-03-24 23:04:41
	 * 描述:
	 * 		用于一对多级联查询使用的SQL
	 */
	@Select(" select * from school where cityId=#{cityId} ")
	School findManyToOne(@Param("cityId")int id);



	/**
	 * 创建人:贺小五
	 * 创建时间:2017-03-24 22:19:21
	 * 描述:
	 * 		级联查询,一对多,返回自定义的对象
	 */
	@Select(" select * from  city where id=#{id} ")
	@Results(
		id = "city",
		value = {
			@Result(column = "id",property = "id",id = true),
			@Result(column = "name",property = "name"),
			@Result(column = "state",property = "state"),
			@Result(column = "country",property = "country"),
			@Result(column = "id",property = "schools",many = @Many(select = "com.demo.mybatisDemo.SchoolMapper.findManyToOne"))
		}
	)
	City findOneToMany(@Param("id")int id);

 

实体对象代码如下:

 

public class School {

	private Integer id;

	private String name;

	private String state;

	private String cityId;

	private City city;

   /**省略GET跟SET方法**/
}

public class City {

	private Integer id;

	private String name;

	private String state;

	private String country;

	private List<School> schools;
 
    /**省略GET跟SET方法**/
}

 

  鉴于一对多跟一对一id值的不一样,我觉得还是有必要介绍一下:

  • 一对一(@One)注解中的id,使用的是属性名称
  • 一对多(@Many)注解中的id,是你本对象的主键属性名称
  • 我们只需要在@Result注解内添加 many=@Many注解,就能使用一对多,但是需要注意的地方是,@Many注解内使用的select必须是一个注解函数,而且,在级联的对象里面,必须有级联对象的集合属性.
  • 我们只需要在@Result注解内添加 one=@One注解,就能使用一对一,但是需要注意的地方是,@One注解内使用的select必须是一个注解函数,而且,在级联的对象里面,必须有级联对象的属性.
  • 级联对象查询结果,受你注解指向的select查询SQL的影响
  • 注解指向的select查询,是包名+接口名+方法名而成

 

以上就是开发中我们会常用到的一些注解,下篇我们介绍使用注解来完成动态SQL!

到这,文章就结束了!

以上,均为本人测试而得出的结果,可能会有出入,或者错误,欢迎指正

欢迎转载,请注明出处跟作者,谢谢!

© 著作权归作者所有

贺小五

贺小五

粉丝 73
博文 47
码字总数 48425
作品 0
海淀
程序员
私信 提问
加载中

评论(7)

贺小五
贺小五 博主

引用来自“苏炜”的评论

一对多 为什么多的那方返回的是实体不是集合?
一对多是级联查询的意思,在实体里面,我们是包含了集合,你级联查询下去,会放入实体里面的集合
不会发程序的动弹员
不会发程序的动弹员
一对多 为什么多的那方返回的是实体不是集合?
攻城狮的愤怒
攻城狮的愤怒
很详细,谢谢。
贺小五
贺小五 博主

引用来自“sifu973”的评论

这个使用mybatis generator 生成pojo ,NameMapper.java,NameMapper.xml比较好,无需写一句sql语句
逆向生成的,只有基本的 crud,业务SQL是没有的,这只是一种方式之一,并没有好与不好之分,只是看个人喜欢啦
sifu973
sifu973
这个使用mybatis generator 生成pojo ,NameMapper.java,NameMapper.xml比较好,无需写一句sql语句
贺小五
贺小五 博主

引用来自“郑勇”的评论

写的不错
谢谢夸奖
郑勇
写的不错
Spring Boot 整合 MyBatis

最近项目原因可能会继续开始使用MyBatis,已经习惯于spring-data的风格,再回头看xml的映射配置总觉得不是特别舒服,接口定义与映射离散在不同文件中,使得阅读起来并不是特别方便。 Spring...

中关村的老男孩
06/24
92
0
Spring Boot整合Mybatis实例

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和...

英雄有梦没死就别停
2018/06/27
92
0
Mybatis 通用 Mapper 4.0.0 发布

通用 Mapper4 是一个可以实现任意 MyBatis 通用方法的框架,项目提供了常规的增删改查操作以及Example相关的单表操作。通用 Mapper 是为了解决 MyBatis 使用中 90% 的基本操作,使用它可以很...

Liuzh_533
2018/03/19
43K
26
Springboot 中 Mybatis 的使用

官方文档: Mybatis开发团队为Spring Boot 提供了 MyBatis-Spring-Boot-Starter 方便使用。 要使用MyBatis-Spring-Boot-Starter模块,只需要在类路径中包含 mybatis-spring-boot-autoconfig...

不开心时不要学习
2018/01/19
3K
0
Spring Boot [集成-MyBatis]

导读: 在上篇文章中我们介绍了spring-data-jpa的一些常用方法,在这篇文章中我们在介绍关于mybatis与Spring Boot 的集成,及一些常用方法 集成: 这里有两种方式,一种是常规的Spring 应用的...

yangrd
2018/08/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java 8 Optional:优雅地避免 NPE

本篇文章将详细介绍 Optional 类,以及如何用它消除代码中的 null 检查。在开始之前首先来看下什么是 NPE,以及在 Java 8 之前是如何处理 NPE 问题的。 空指针异常(NullPointException,简称...

武培轩
9分钟前
0
0
CountDownLatch实现的并发框架

目录结构 package com.**.**.base.support.executor;import lombok.NoArgsConstructor;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;imp......

MR_TE
10分钟前
0
0
学习记录(day06-事件、按键修饰符、计算属性)

[TOC] 1.1 事件修饰符/按键修饰符 vue 通过事件修饰符对dom事件细节进行控制 <标签 @事件.修饰符="函数"></标签>.prevent ---阻止浏览器默认行为.stop ---阻止浏览器事件冒泡.e...

庭前云落
30分钟前
0
0
006-Sigle-基于blockstack去中心化博客

本篇文章主要讲解有关基于Blockstack的Sigle是一个去中心化的博客项目; 官网地址:https://www.sigle.io/ Github地址:https://github.com/pradel/sigle 页面展示: 介绍: A beautiful de...

Riverzhou
37分钟前
13
0
驰骋工作流引擎开发平台属性功能的隐藏显示介绍

关键字: 工作流程管理系统 工作流引擎 asp.net工作流引擎 java工作流引擎. 表单引擎 工作流功能说明 工作流设计 工作流快速开发平台 业务流程管理 bpm工作流系统 java工作流主流框架 自定义...

孟娟
39分钟前
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部