Springboot整合通用mapper插件(tk.mybatis)及与(自定义xml文件)或(注解方式)一块用

通用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文件:https://blog.csdn.net/qq_41357211/article/details/99855643

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

 

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值