使用註解的方式相對於使用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)列實現。
配置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();