1. 程式人生 > >Mapper3通用介面的使用

Mapper3通用介面的使用

Mapper3介面有兩種形式,一種是提供了一個方法的介面。還有一種是不提供方法,但是繼承了多個單方法的介面,一般是某類方法的集合。

參考:https://blog.csdn.net/fangwenzheng88/article/details/78713091

基礎介面

public interface Mapper<T> extends
        BaseMapper<T>,
        ExampleMapper<T>,
        RowBoundsMapper<T>,
        Marker {

}

實現基本的增刪改查,不用自己寫重複的sql

public class BaseServiceImpl<M extends Mapper<T>, T> implements BaseService<T> {

	@Autowired
	protected M mapper;
	public T getById(Object id) {
		return mapper.selectByPrimaryKey(id);
	}

	public PageModel<T> getList(ReceiveParameterModel receiveParameterModel) {
		PageModel<T> pageModel = null;
		if (receiveParameterModel != null) {

			Class<T> clazz = (Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[1];
			Example example = ExampleUtil.getExample(clazz, receiveParameterModel);
			if (receiveParameterModel.getPage() == null || receiveParameterModel.getRows() == null) {
				Integer total = mapper.selectCountByExample(example);
				List<T> list = mapper.selectByExample(example);
				pageModel = new PageModel<T>(total, list);
			}
			if (receiveParameterModel.getPage() != null && receiveParameterModel.getRows() != null) {
				PageHelper.startPage(receiveParameterModel.getPage(), receiveParameterModel.getRows());
				pageModel = new PageModel<T>(mapper.selectByExample(example));
			}
		}
		return pageModel;
	}

	public T insert(T entity) {
		mapper.insert(entity);
		return entity;
	}

	public T update(T entity) {
		mapper.updateByPrimaryKeySelective(entity);
		return entity;
	}

	public T updateNull(T entity) {
		mapper.updateByPrimaryKey(entity);
		return entity;
	}

	public void delete(List<Object> obj) {
		obj.forEach(ob -> mapper.deleteByPrimaryKey(ob));
	}

}

Select

例如SelectMapper<T>是一個單方法的介面,BaseSelectMapper<T>是一個繼承了4個基礎查詢方法的介面。

方法:

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);

根據主鍵欄位進行刪除,方法引數必須包含完整的主鍵屬性

CRUD組合介面

BaseMapper<T>

繼承了base組合介面中的4個組合介面,包含完整的CRUD方法

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條件刪除資料

Example組合介面

ExampleMapper<T>

包含上面Example中的5個方法

Condition方法

Condition方法和Example方法作用完全一樣,只是為了避免Example帶來的歧義,提供的的Condition方法

List<T> selectByCondition(Object condition);

根據Condition條件進行查詢

int selectCountByCondition(Object condition);

根據Condition條件進行查詢總數

int updateByCondition(@Param("record") T record, @Param("example") Object condition);

根據Condition條件更新實體record包含的全部屬性,null值會被更新

int updateByConditionSelective(@Param("record") T record, @Param("example") Object condition);

根據Condition條件更新實體record包含的不是null的屬性值

int deleteByCondition(Object condition);

根據Condition條件刪除資料

Condition組合介面

ConditionMapper<T>

包含上面Condition中的5個方法

RowBounds

預設為記憶體分頁,可以配合PageHelper實現物理分頁

List<T> selectByRowBounds(T record, RowBounds rowBounds);

根據實體屬性和RowBounds進行分頁查詢

List<T> selectByExampleAndRowBounds(Object example, RowBounds rowBounds);

根據example條件和RowBounds進行分頁查詢

List<T> selectByConditionAndRowBounds(Object condition, RowBounds rowBounds);

根據example條件和RowBounds進行分頁查詢,該方法和selectByExampleAndRowBounds完全一樣,只是名字改成了Condition

RowBounds組合介面

RowBoundsMapper<T>

包含上面RowBounds中的前兩個方法,不包含selectByConditionAndRowBounds

special特殊介面

這些介面針對部分資料庫設計,不是所有資料庫都支援

int insertList(List<T> recordList);

批量插入,支援批量插入的資料庫可以使用,例如MySQL,H2等,另外該介面限制實體包含id屬性並且必須為自增列

int insertUseGeneratedKeys(T record);

插入資料,限制為實體包含id屬性並且必須為自增列,實體配置的主鍵策略無效

Ids介面

通過操作ids字串進行操作,ids 如 "1,2,3" 這種形式的字串,這個方法要求實體類中有且只有一個帶有@Id註解的欄位,否則會丟擲異常。

List<T> selectByIds(String ids)

根據主鍵字串進行查詢,類中只有存在一個帶有@Id註解的欄位
int deleteByIds(String ids)

根據主鍵字串進行刪除,類中只有存在一個帶有@Id註解的欄位

Ids組合介面

IdsMapper<T>

Mapper介面

Mapper<T>

該介面相容Mapper2.x版本,繼承了BaseMapper<T>ExampleMapper<T>RowBoundsMapper<T>三個組合介面。

	@Override
	public PageModel<Dictionary> getAllDictionary(ReceiveParameterModel receiveParameterModel) {
		if (receiveParameterModel != null && (receiveParameterModel.getRows() == null  || receiveParameterModel.getPage() == null)) {
			int selectCount = mapper.selectCount(new Dictionary());
			Example example = ExampleUtil.getExample(Dictionary.class, receiveParameterModel);
			List<Dictionary> selectByExample = mapper.selectByExample(example);			
			PageModel<Dictionary> pageModel = new PageModel<>(selectCount,selectByExample);
			return pageModel;
		}else if(receiveParameterModel != null && receiveParameterModel.getPage() != null && receiveParameterModel.getRows() != null){
			PageHelper.startPage(receiveParameterModel.getPage(), receiveParameterModel.getRows());
			Example example = ExampleUtil.getExample(Dictionary.class, receiveParameterModel);
			List<Dictionary> selectByExample = mapper.selectByExample(example);
			//PageInfo<Dictionary> pageInfo = new PageInfo<>(selectByExample);
			return new PageModel<Dictionary>(selectByExample);
		}
		return null;
	}