MyBatis學習(六):註解

使用註解的方式相對於使用XML的方式開發方便了許多,其基本原理並無多大變化。

使用XML的開發方式中,我們需要實體類和相對應的XML的映射文件;
使用註解的開發方式中,我們只是把XML映射文件修改成了JAVA接口類,通過創建一個接口,在接口裏面定義一系列的操作方法,並在方法之前加上註解。除此之外,和XML配置方式有以下幾個不同:

在mybatis-config.xml總配置文件中:映射方式不同,前三個爲XML方式,後兩個爲註解方式

    <mappers>
      <mapper resource="com/cn/bean/Category.xml"/>
	  <mapper resource="com/cn/bean/Product.xml"/>
	  <mapper resource="com/cn/bean/Order.xml"/>  
	  <mapper class="com.cn.bean.CategoryMapper"/>
	  <mapper class="com.cn.bean.ProductMapper"/>
    </mappers>

在獲取對數據庫的操作對象時:

//xml方式 直接使用session對象對數據庫進行操作
	String resource="mybatis-config.xml";
	InputStream inputStream=Resources.getResourceAsStream(resource);
	SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
	SqlSession session=sqlSessionFactory.openSession();
//接口方式 需要使用session對象獲取接口類對象
	String resource="mybatis-config.xml";
	InputStream sourceStream=Resources.getResourceAsStream(resource);
	SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(sourceStream);
	SqlSession session=sessionFactory.openSession();
	CategoryMapper mapper=session.getMapper(CategoryMapper.class);

註解方式實現CURD:

	@Insert("insert into category(name) values(#{name})")
	public void addCategory(Category c);
	
	@Select("select * from category")
	public List<Category> listCategory();
	
	@Update("update category set name = #{name} where id=#{id}")
	public void updateCategory(Category c);
			
	@Delete("delete from category where id = #{id}")
	public void deleteCategory(int id);
	//使用時直接用接口類對象調用方法即可(有參數需要傳入參數)

註解方式實現一對多、多對一、多對多

一對多 有如下表關係:
上表爲category,下表爲product;一個category對應多個product,兩者之間的聯繫在數據庫表中通過在product表中增加cid(category id)列實現。
category
product
配置CategoryMapper接口(這是接口類,並非實體類)的一對多查詢,查詢時需要使用ProductMapper接口的條件查詢(使用cid查詢Product)

//CategoryMapper
	@Select("select * from category")
	@Results({
		@Result(property="id",column="id"),
		@Result(property="products",javaType=List.class,column="id",many=@Many(select="com.cn.bean.ProductMapper.listByCategory"))
	})
	public List<Category> listCategoreWithProduct();
//ProductMapperr
@Select("select * from product where cid = #{cid}")
	public List<Product> listByCategory(int cid);

此處注意的地方在於一對多查詢的配置方式,首先一個基本的查詢查詢Category類中的所有基本屬性,然後通過配置@Results註解來實現一對多,類似XML中的ResultMap

同樣@Results註解也可以用來配置實體類屬性和數據庫表字段的對應關係,使用@Result標籤(property、column);如果屬性名稱和數據庫表中的字段名稱相同,可以不加配置,至於一對多的關係,只能通過手動配置實現,如上@Result(property=“products”,javaType=List.class,column=“id”,many=@Many(select=“com.cn.bean.ProductMapper.listByCategory”))
property指示了實體類中的屬性,javaType指示類型(可以不寫,MyBatis可以自動解析),column指示兩者如何關聯(即傳入many中查詢的屬性),many指示對應關係通過什麼得到,select=“”指示需要使用column中的參數調用com.cn.bean包下的ProductMapper類的listByCategory方法進行查詢。

此處需要注意:如果傳入的參數爲當前表的主鍵,需要使用@Result配置一下列的對應信息,否則查詢結果中會缺少當前表主鍵的信息。

註解實現多對一

多對一和一對多的實現方式類似,只是在註解的使用上有一點區別:
(Product和Category多對一)

//ProductMapper類
	//多對一方法測試
	@Select("select * from product")
	@Results({
	@Result(property="category",column="cid",one=@One(select="com.cn.bean.CategoryMapper.getCategoryById"))
	})
	public List<Product> listProductsWithCategory();
//CategoryMapper
	@Select("select * from category where id = #{id}")
	public Category getCategoryById(int id);

註解實現多對多

在使用XML配置多對多的關係的時候我們已經知道,多對多關係通過建立中間表實現,被分解爲兩個一對多的關係。(訂單-訂單項-商品,一個訂單含有多個訂單項,一件商品屬於多個訂單項;通過訂單去查找訂單項就是一對多對一(多))。
配置ProductMapper:根據ID獲取Product

	@Select("select * from product where id= #{id}")
	public List<Product> getProductByID(int id);

配置OrderItemMapper:多對一,根據cid獲取OrderItem

@Select ("select * from orderItem where oid = #{oid}")
@Results({
	@Result(property="product",column="pid",one=@One(select="com.cn.bean.ProductMapper.getProductByID"))
})
public List<OrderItem> getByOrder(int oid);

配置OrderMapper:一對多,調用OrderItemMapper中的方法

@Select("select * from `order`")
@Results({
	@Result(property="id", column="id"),
	@Result(property="orderItems",javaType=List.class,column="id",many=@Many(select="com.cn.bean.OrderItemMapper.getByOrder"))
})
public List<Order> listOrder();

註解實現動態SQL

使用註解實現動態SQL需要新建獲取動態SQL的類,比如爲Category類創建動態SQL的獲取類:

public class CategoryDynaSQLProvider {
	public String select()
	{
		return new SQL()
				.SELECT("*")
				.FROM("category")
				.WHERE("id = #{id}")
				.WHERE("name like concat('%',#{name},'%')")
				.toString();
	}
}

SQL類中有如下的方法:可以用來拼接SQL語句,動態SQL中的if、where標籤等,均可以使用java代碼實現。
在這裏插入圖片描述
使用方法:在CategoryMapper類中,使用動態SQL語句的標籤

@SelectProvider(type=com.cn.dynamicSQL.CategoryDynaSQLProvider.class,method="select")
	public List<Category> listCategoryUseDynaSQL();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章