通用mapper插件(tk.mybatis),是在mybatis基础上,提供各种高效的工具,不必再为简单的单表查询写sql语句。
目录
Springboot整合tk.mybatis
Springboot整合tk.mybatis与自定义xml文件共用
Springboot整合tk.mybatis与注解方式共用
Springboot整合tk.mybatis
1.首先在pom文件中引入依赖 (tk.mybatis基础为mybatis,所以自然就包含了mybatis依赖)
<!--通用Mapper启动器-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.0.3</version>
</dependency>
tk.mybatis在application.yml中配置与mybatis一样,先默认就行,可以先不用配置。
与数据库进行交互时,默认自动支持 字段下划线 与 属性驼峰 之间转换。
2.创建实体类
package com.leyou.item.pojo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import tk.mybatis.mapper.annotation.KeySql;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Transient;
import java.util.Date;
@Data
@Table(name = "tb_spu") // 与数据库对应的表名
public class Spu {
@Id
@KeySql(useGeneratedKeys = true)
private Long id;
private Long brandId;
private Long cid1; // 1级类目
private String title; // 标题
private String subTitle; // 子标题
// 下面是特殊情况时,才用到
@JsonIgnore // 返回json时,会忽略该属性,不返回该属性,需要引入jackson-databind依赖
private Date lastUpdateTime; // 最后修改时间
@Transient // 数据库中没有该字段
private String bname;
@Transient // 数据库中没有该字段
private String cname;
}
上面如果想要使用 @JsonIgnore 需要引入jackson-databind依赖,单独一个依赖即可
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.6</version>
</dependency>
3.编写mapper文件
继承 Mapper<T>接口,便有增删改查,一些单表操作方法
package com.leyou.item.mapper;
import com.leyou.item.pojo.SpecGroup;
import tk.mybatis.mapper.common.Mapper;
public interface SpecGroupMapper extends Mapper<SpecGroup> {
}
批量处理 IdListMapper<T, Long> InsertListMapper<T>
继承 InsertListMapper<T>,T为实体类,支持批量新增插入。需要注意有两个包
import tk.mybatis.mapper.additional.insert.InsertListMapper; 该类中的实体类主键可以自定义
import tk.mybatis.mapper.common.special.InsertListMapper;该类中的实体类主键,必须写成id,否则批量插入时报错
继承 IdListMapper<Category, Long>接口,第一个泛型是实体类,第二个是实体类主键类型,提供select和delete操作ids
该接口提供 selectByIdList 方法,即参数是 主键id集合,返回值是 实体类集合。
package com.leyou.item.mapper;
import com.leyou.item.pojo.Category;
import tk.mybatis.mapper.additional.idlist.IdListMapper;
import tk.mybatis.mapper.common.Mapper;
public interface CategoryMapper extends Mapper<Category>, IdListMapper<Category, Long> {
}
// ----------------------------------------------------------------------------------------
// 使用方法
public List<Category> queryByIds(List<Long> ids){
List<Category> list = categoryMapper.selectByIdList(ids);
if (CollectionUtils.isEmpty(list)){
throw new LyException(ExceptionEnum.CATEGORY_NOT_FOUND);
}
return list;
}
批量操作时,可以自定义一个通用BaseMapper,如以下接口,再让编写的mapper继承这个BaseMapper,达到提取优化
需要注意的是:自定义的通用mapper,想要生效,必须要加上@RegisterMapper注解。
package com.leyou.common.mapper;
import tk.mybatis.mapper.additional.idlist.IdListMapper;
import tk.mybatis.mapper.additional.insert.InsertListMapper;
import tk.mybatis.mapper.annotation.RegisterMapper;
import tk.mybatis.mapper.common.Mapper;
@RegisterMapper // 让BaseMapper生效,必须加上该注解
public interface BaseMapper<T> extends Mapper<T>, IdListMapper<T, Long>, InsertListMapper<T> {
}
4.配置扫描文件
第一种:在自己的Mapper类上添加 @Mapper注解
第二种:在springboot启动类上,配置 @MapperScan("com.leyou.item.mapper") 推荐第二种
5. service直接导入mapper,启动时,会自动生成mapper代理对象,包含了select等方法
@Service
public class SpecificationService {
@Autowired
private SpecGroupMapper specGroupMapper;
public List<SpecGroup> queryGroupByCid(Long cid) {
SpecGroup group = new SpecGroup();
group.setCid(cid);
List<SpecGroup> list = specGroupMapper.select(group);// 根据实体类的非空属性查询
if (CollectionUtils.isEmpty(list)){
// 没查到
throw new LyException(ExceptionEnum.SPEC_GROUP_NOT_FOUND);
}
return list;
}
}
// 带条件查询方式
Example example = new Example(实体类.class);
example.createCriteria().orLike("name", "%"+ key + "%").orEqualTo("letter", key.toUpperCase());
String orderByClause = sortBy + (desc ? " DESC" : " ASC");
example.setOrderByClause(orderByClause);
List<Brand> list = brandMapper.selectByExample(example);
Springboot整合tk.mybatis与自定义xml文件共用
1、mapper文件:
package com.leyou.item.mapper;
import com.leyou.item.pojo.Brand;
import tk.mybatis.mapper.common.Mapper;
import java.util.List;
public interface BrandMapper extends Mapper<Brand> {
List<Brand> queryByCategoryId(Long cid);
}
2、 xml文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.leyou.item.mapper.BrandMapper">
<select id="queryByCategoryId" resultType="com.leyou.item.pojo.Brand">
SELECT b.* FROM tb_brand b
INNER JOIN tb_category_brand cb on b.id = cb.brand_id
WHERE cb.category_id = #{cid}
</select>
</mapper>
3、 application.yml文件中配置xml路径: (我的xml文件放在了src/main/java下面,没有放在resources下面)
如果你们也是放在了src/main/java下面,yml配置xml路径使用classpath时,还需要在pom中添加个build,否则不能正确加载
配置build请访问下面这个链接 (点开后,直接滑到最下面,复制那个build就行)
解决springboot配置文件yml中classpath找不到src/main/java下的xml文件:
server:
port: 8081
spring:
datasource:
username: root
password: root
#使用 MySQL连接驱动是8.0以上,需要在Url后面加上时区, GMT%2B8代表中国时区,不然报时区错误
url: jdbc:mysql://localhost:3306/leyou?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF8
# 注意: 新版本驱动包,要使用以下类作为驱动类
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
mapper-locations: classpath:com/leyou/item/mapper/xml/*Mapper.xml
即可正确使用
Springboot整合tk.mybatis与注解方式共用
直接在Mapper中写就行
package com.leyou.item.mapper;
import com.leyou.item.pojo.Brand;
import org.apache.ibatis.annotations.Insert;
import tk.mybatis.mapper.common.Mapper;
import java.util.List;
public interface BrandMapper extends Mapper<Brand> {
@Insert("INSERT INTO tb_category_brand (category_id, brand_id) VALUES (#{cid}, #{id})")
int insertCategoryBrand(Long cid, Long id);
}