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

前面兩篇說了一下springboot整合mybatis跟使用阿里的druid包,此次給你們介紹一下mybatis3.0後增長的註解基本使用吧,限於篇幅,下篇在介紹基於註解的動態SQL,本篇只介紹mybatis的基本使用,跟注意的地方java

 

先介紹一下開發環境:spring

  1. jdk版本是1.8
  2. springboot的版本是1.4.1
  3. 開發工具爲 intellij idea
  4. 引入mybatis的依賴,這裏就不用說了,若是不知道引入哪一個依賴,請看我第一篇博客

 

 

篇幅介紹:

  1.    先介紹增刪改查四個註解(附帶參數註解以及插入返回註解) 
  2.    而後是返回參數類型註解
  3.    一對多,一對一註解使用

------------------------------------分割線-------------------------------------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');

而後開始介紹咱們的註解函數

 

而後是咱們後面開發中使用頻率最高的四個註解:工具

  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!

到這,文章就結束了!

以上,均爲本人測試而得出的結果,可能會有出入,或者錯誤,歡迎指正

歡迎轉載,請註明出處跟做者,謝謝!

相關文章
相關標籤/搜索