前面两篇说了一下springboot整合mybatis跟使用阿里的druid包,此次给你们介绍一下mybatis3.0后增长的注解基本使用吧,限于篇幅,下篇在介绍基于注解的动态SQL,本篇只介绍mybatis的基本使用,跟注意的地方java
先介绍一下开发环境:spring
------------------------------------分割线-------------------------------------springboot
咱们先建立2个表,SQL以下mybatis
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个是由于,咱们会使用到级联的一对一,跟一对多查询app
而后咱们插入一些数据:ide
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);
/** * 建立人:贺小五 * 建立时间:2017-03-22 23:28:33 * 描述: * 根据主键查询单个city对象 */ @Select("SELECT * FROM city WHERE id = #{0}") City findById(int id);
不经过id的别名进行取参,而是根据下标来进行取值,测试
/** * 建立人:贺小五 * 建立时间: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里面主键的名称
------------------------------------分割线-------------------------------------
@ResultMap 配合@Results注解使用,返回一个映射的对象(之前使用过mybatis的同窗应该知道,在XML里面会有个映射对象,就叫ResultMap,这个注解就是该做用)
@ResultType 返回一个自定义对象,例如,一个表有10个字段,你只想用5个字段,并且又多条数据,这个注解就有用武之地了,
由于以上每一个注解内的参数比较多,时间有限,暂时不一一介绍了,有兴趣的能够本身进入注解查看源码跟注释就能看明白了,我这只介绍下基本的使用,具体使用代码以下:
/** * 建立人:贺小五 * 建立时间: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
------------------------------------分割线-------------------------------------
而后咱们使用这两个注解很是简单,只须要在上面的注解添加上一些东西就行了,代码以下:
/** * 建立人:贺小五 * 建立时间: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!
到这,文章就结束了!
以上,均为本人测试而得出的结果,可能会有出入,或者错误,欢迎指正
欢迎转载,请注明出处跟做者,谢谢!