目錄
一、什麼是 TKMybatis
TKMybatis 是基於 Mybatis 框架開發的一個工具,內部實現了對單表的基本數據操作,只需要簡單繼承 TKMybatis 提供的接口,就能夠實現無需編寫任何 sql 即能完成單表操作。
二、TKMybatis 使用
2.1 Springboot 項目中加入依賴
<!--通用mapper起步依賴-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.0.4</version>
</dependency>
2.2 使用講解
2.2.1 實體類中使用
在實體類中,常用的註解和意義爲:
@Table:描述數據庫表信息,主要屬性有name(表名)、schema、catalog、uniqueConstraints等。
@Id:指定表主鍵字段,無屬性值。
@Column:描述數據庫字段信息,主要屬性有name(字段名)、columnDefinition、insertable、length、nullable(是否可爲空)、precision、scale、table、unique、updatable等。
@ColumnType:描述數據庫字段類型,可對一些特殊類型作配置,進行特殊處理,主要屬性有jdbcType、column、typeHandler等。
其他註解如:@Transient、@ColumnResult、@JoinColumn、@OrderBy、@Embeddable等暫不描述
2.2.2 dao中使用
單表操作,只需要繼承 tk.mybatis 下的 Mapper 接口即可使用
import tk.mybatis.mapper.common.Mapper;
@Repository
public interface BrandMapper extends Mapper<Brand> {
}
查看具體使用:內部都已經封裝了基本的單表操作
2.2.3 Service 層中使用
操作 | 類型 | 介紹 |
增加 | Mapper.insert(record); | 保存一個實體,null的屬性也會保存,不會使用數據庫默認值 |
Mapper.insertSelective(record); | 保存一個實體,忽略空值,即沒提交的值會使用使用數據庫默認值 | |
刪除 | Mapper.delete(record); | 根據實體屬性作爲條件進行刪除,查詢條件使用等號 |
Mapper.deleteByExample(example) | 根據Example條件刪除數據 | |
Mapper.deleteByPrimaryKey(key) | 根據主鍵字段進行刪除,方法參數必須包含完整的主鍵屬性 | |
修改 | Mapper.updateByExample(record,example) | 根據Example條件更新實體`record`包含的全部屬性,null值會被更新 |
Mapper.updateByExampleSelective(record, example) | 根據Example條件更新實體`record`包含的不是null的屬性值 | |
Mapper.updateByPrimaryKey(record) | 根據主鍵更新實體全部字段,null值會被更新 | |
Mapper.updateByPrimaryKeySelective(record) | 根據主鍵更新屬性不爲null的值 | |
查詢 | Mapper.select(record) | 根據實體中的屬性值進行查詢,查詢條件使用等號 |
Mapper.selectAll() | 查詢全部結果 | |
Mapper.selectByExample(example) | 根據Example條件進行查詢 | |
Mapper.selectByPrimaryKey(key) | 根據主鍵字段進行查詢,方法參數必須包含完整的主鍵屬性,查詢條件使用等號 | |
Mapper.selectCount(record) | 根據實體中的屬性查詢總數,查詢條件使用等號 | |
Mapper.selectCountByExample(example) | 根據Example條件進行查詢總數 | |
Mapper.selectOne(record) |
根據實體中的屬性進行查詢,只能有一個返回值,有多個結果是拋出異常,查詢條件使用等號。 但是如果存在某個屬性爲int,則會初始化爲0。可能影響到實際使用 |
2.3 實際案例
2.3.1 dao 層使用
import tk.mybatis.mapper.common.Mapper;
/**
* DAO 使用通用Mapper
* DSO接口需要繼承 tk.mybatis.mapper.common.Mapper
*/
@Repository
public interface BrandMapper extends Mapper<Brand> {
}
2.3.2 service 層使用
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import tk.mybatis.mapper.entity.Example;
import java.util.List;
@Service
public class BrandServiceImpl implements BrandService {
@Autowired
private BrandMapper brandMapper;
public Example createExample(Brand brand) {
// 自定義條件搜索對象 Example
Example example = new Example(Brand.class);
Example.Criteria criteria = example.createCriteria(); //條件構造器
if (brand != null) {
if (!StringUtils.isEmpty(brand.getName())) {
criteria.andLike("name", '%' + brand.getName() + '%');
}
if (!StringUtils.isEmpty(brand.getLetter())) {
criteria.andEqualTo("letter", brand.getLetter());
}
}
return example;
}
@Override
public List<Brand> findAll() {
return brandMapper.selectAll();
}
@Override
public List<Brand> findList(Brand brand) {
Example example = createExample(brand);
return brandMapper.selectByExample(example);
}
@Override
public Brand findById(Integer id) {
return brandMapper.selectByPrimaryKey(id);
}
/**
* 分頁查詢
* @param page 當前頁
* @param size 每頁顯示的條數
* @return
*/
@Override
public PageInfo<Brand> pageSearch(Integer page, Integer size) {
// 分頁實現
// 後面的查詢必須是緊跟集合查詢
PageHelper.startPage(page, size);
// 查詢集合
List<Brand> brands = brandMapper.selectAll();
return new PageInfo<Brand>(brands);
}
@Override
public PageInfo<Brand> pageSearchAndCondition(Brand brand, Integer page, Integer size) {
// 開始分頁
PageHelper.startPage(page, size);
// 搜索數據
Example example = createExample(brand);
List<Brand> list = brandMapper.selectByExample(example);
return new PageInfo<Brand>(list);
}
/**
* 增加品牌
* @param brand
*/
@Override
public void add(Brand brand) {
// 使用通用 Mapper.insertSelective
// 方法中但凡帶有selective就會忽略空值
int i = brandMapper.insertSelective(brand);
}
/**
* 根據id修改品牌
* @param brand
*/
@Override
public void update(Brand brand) {
// 使用通用mapper.update();
brandMapper.updateByPrimaryKeySelective(brand);
}
/**
* 根據id刪除
* @param id
*/
@Override
public void del(Integer id) {
brandMapper.deleteByPrimaryKey(id);
}
}