前面两篇说了一下springboot整合mybatis跟使用阿里的druid包,这次给大家介绍一下mybatis3.0后增加的注解基本使用吧,限于篇幅,下篇在介绍基于注解的动态SQL,本篇只介绍mybatis的基本使用,跟注意的地方
先介绍一下开发环境:
- jdk版本是1.8
- springboot的版本是1.4.1
- 开发工具为 intellij idea
- 引入mybatis的依赖,这里就不用说了,如果不知道引入哪个依赖,请看我第一篇博客
篇幅介绍:
- 先介绍增删改查四个注解(附带参数注解以及插入返回注解)
- 然后是返回参数类型注解
- 一对多,一对一注解使用
------------------------------------分割线-------------------------------------
我们先创建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');
然后开始介绍我们的注解
然后是我们后面开发中使用频率最高的四个注解:
上面四个注解,应该是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主键的形式来获取,如果不使用别名,你是不能获取到主键值的,
- userGeneratedKeys 默认是false,表示使用生成的ID
- keyProperty 映射的是model里面主键的名称
------------------------------------分割线-------------------------------------
接下来,我们介绍返回参数的4个注解:
-
@ResultMap 配合@Results注解使用,返回一个映射的对象(以前使用过mybatis的同学应该知道,在XML里面会有个映射对象,就叫ResultMap,这个注解就是该作用)
-
@ResultType 返回一个自定义对象,例如,一个表有10个字段,你只想用5个字段,而且又多条数据,这个注解就有用武之地了,
- @Results 里面用于映射自定义的model,以及自定义model的别名,可以配合@ResultMap使用
- @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
------------------------------------分割线-------------------------------------
最后,我们介绍一下,一对多跟一对一的注解使用:
-
@One跟@Many都是在注解 @Result 内使用,@Result注解内有个 one跟many的属性,对应的是注解@One跟@Many
- @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"),
@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!
到这,文章就结束了!
以上,均为本人测试而得出的结果,可能会有出入,或者错误,欢迎指正
欢迎转载,请注明出处跟作者,谢谢!