如果你是SSM項目引入通用mapper記得要引入hibernate中的一個hibernate-jpa-2.1-api-1.0.0.Final.jar包(注意必須要Mybatis整合Spring噢,其實tk.mybatis是替換了原有的mybatis-spring連接包中的內容):
如果你是maven項目的話,就比較方便了,使用以下的依賴:
這時才能在POJO上使用注解來映射字段和表名,以及一些特殊的使用:
開始演示
pojo中的注解映射表:
package com.domain;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* @author mzy
* 定義orders表對應的實體類
*/
/*
說明:
表名默認使用類名,駝峰轉下划線(只對大寫字母進行處理),如UserInfo默認對應的表名為user_info。
表名可以使用@Table(name = "tableName")進行指定,對不符合第一條默認規則的可以通過這種方式指定表名.
字段默認和@Column一樣,都會作為表字段,表字段默認為Java對象的Field名字駝峰轉下划線形式.
可以使用@Column(name = "fieldName")指定不符合第3條規則的字段名
使用@Transient注解可以忽略字段,添加該注解的字段不會作為表字段使用.
建議一定是有一個@Id注解作為主鍵的字段,可以有多個@Id注解的字段作為聯合主鍵.
如果是MySQL的自增字段,加上@GeneratedValue(generator = "JDBC")即可。如果是其他數據庫,可以參考官網文檔。
*/
@Table(name = "t_order")
public class Order {
/**
*
CREATE TABLE orders(
order_id INT PRIMARY KEY AUTO_INCREMENT,
order_no VARCHAR(20),
order_price FLOAT
);
*/
//Order實體類中屬性名和orders表中的字段名是不一樣的
@GeneratedValue(generator = "JDBC") // 自增的主鍵映射
@Id
@Column(name = "order_id")
private int id; //id===>order_id
@Column(name = "order_no")
private String orderNo; //orderNo===>order_no
@Column(name = "order_price")
private float price; //price===>order_price
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getOrderNo() {
return orderNo;
}
public void setOrderNo(String orderNo) {
this.orderNo = orderNo;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
@Override
public String toString() {
return "Order [id=" + id + ", orderNo=" + orderNo + ", price=" + price+ "]";
}
}
此刻如果只涉及普通的單表查詢就不需要創建xml文件映射了,那個*mapper.xml文件實在麻煩,但是Mybatis 3.4.0才開始出現諸注解配置mapper,但是注解配置mapper還是比較麻煩,比較長亂,所以此刻引入通用mapper我們就只在擴大粒度的時候才會加xml文件,並且*mapper.xml中sql會少很多。
這時的Mapper就只用繼承通用Mapper<T>,但是注意要傳入泛型:
package com.mapper;
import org.springframework.stereotype.Repository;
import com.domain.Order;
import tk.mybatis.mapper.common.Mapper;
/*
DAO的寫法
在傳統的Mybatis寫法中,DAO接口需要與Mapper文件關聯,即需要編寫SQL來實現DAO接口中的方法。
而在通用Mapper中,DAO只需要繼承一個通用接口,即可擁有豐富的方法:
繼承通用的Mapper,必須指定泛型
*/
@Repository
public interface OrderMapper extends Mapper<Order>{
/*
一旦繼承了Mapper,繼承的Mapper就擁有了Mapper所有的通用方法:
Select
方法:List<T> select(T record);
說明:根據實體中的屬性值進行查詢,查詢條件使用等號
方法:T selectByPrimaryKey(Object key);
說明:根據主鍵字段進行查詢,方法參數必須包含完整的主鍵屬性,查詢條件使用等號
方法:List<T> selectAll();
說明:查詢全部結果,select(null)方法能達到同樣的效果
方法:T selectOne(T record);
說明:根據實體中的屬性進行查詢,只能有一個返回值,有多個結果是拋出異常,查詢條件使用等號
方法:int selectCount(T record);
說明:根據實體中的屬性查詢總數,查詢條件使用等號
Insert
方法:int insert(T record);
說明:保存一個實體,null的屬性也會保存,不會使用數據庫默認值
方法:int insertSelective(T record);
說明:保存一個實體,null的屬性不會保存,會使用數據庫默認值
Update
方法:int updateByPrimaryKey(T record);
說明:根據主鍵更新實體全部字段,null值會被更新
方法:int updateByPrimaryKeySelective(T record);
說明:根據主鍵更新屬性不為null的值
Delete
方法:int delete(T record);
說明:根據實體屬性作為條件進行刪除,查詢條件使用等號
方法:int deleteByPrimaryKey(Object key);
說明:根據主鍵字段進行刪除,方法參數必須包含完整的主鍵屬性
Example方法
方法:List<T> selectByExample(Object example);
說明:根據Example條件進行查詢
重點:這個查詢支持通過Example類指定查詢列,通過selectProperties方法指定查詢列
方法:int selectCountByExample(Object example);
說明:根據Example條件進行查詢總數
方法:int updateByExample(@Param("record") T record, @Param("example") Object example);
說明:根據Example條件更新實體record包含的全部屬性,null值會被更新
方法:int updateByExampleSelective(@Param("record") T record, @Param("example") Object example);
說明:根據Example條件更新實體record包含的不是null的屬性值
方法:int deleteByExample(Object example);
說明:根據Example條件刪除數據
*/
}
測試:
package com.test;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.domain.Order;
import com.mapper.OrderMapper;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class TestBySpring {
@Autowired
OrderMapper Mapper;
@Test
public void testCommonMapper() {
List<Order> list = Mapper.selectAll();
System.err.println(list);
}
}