前面兩篇說了一下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!
到這,文章就結束了!
以上,均爲本人測試而得出的結果,可能會有出入,或者錯誤,歡迎指正
歡迎轉載,請註明出處跟做者,謝謝!