Springboot 集成 tk.mybatis

一 Spring Boot 集成 tk.mybatis

tk.mybatis 是 MyBatis 的一个插件,用于简化 MyBatis 的开发。

1.添加依赖

Spring Boot 项目中的 pom.xml 文件中添加 MyBatis、TkMyBatis 和 MySQL的依赖。

xml 复制代码
<dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper-spring-boot-starter</artifactId>
    <version>2.1.5</version> <!-- 请根据实际情况选择版本 -->
</dependency>
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.2.0</version> <!-- 请根据实际情况选择版本 -->
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.26</version> <!-- 请根据实际情况选择版本 -->
</dependency>

2.配置数据源

application.propertiesapplication.yml 文件中配置数据源

yaml 复制代码
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mydatabase
    username: your_username
    password: your_password

或者

ini 复制代码
spring.datasource.url=jdbc:mysql://localhost:3306/your_database
spring.datasource.username=your_username
spring.datasource.password=your_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

3.创建实体类

创建对应数据库表实体类 ,并确保属性与表字段一一对应

@Table 注解指定对应的数据库表

java 复制代码
import javax.persistence.*;
import lombok.Data;

@Data
@Table(name = "your_table")
public class YourEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private String id;

    private String name;
}

4.创建 Mapper接口

创建Mapper接口继承自 Mapper<T> ,其中 T 是实体类的类型。

java 复制代码
import tk.mybatis.mapper.common.Mapper;

public interface YourMapper extends Mapper<YourEntity> {
    // 这里可以添加自定义的查询方法
}

5.启动类上添加注解

Spring Boot 的启动类上添加 @MapperScan 注解,指定 Mapper接口的包路径

@MapperScantk.mybatis.spring.annotation.MapperScan

java 复制代码
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import tk.mybatis.spring.annotation.MapperScan;

@MapperScan(basePackages = "com.example.yourapp.mapper")
@SpringBootApplication
public class SpringbootMainApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootMainApplication.class, args);
    }

}

6.使用 Mapper

Service 类中注入 Mapper并使用它。

java 复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class YourService {

    @Autowired
    private YourMapper yourMapper;

    public List<YourEntity> getAllEntities() {
        return yourMapper.selectAll();
    }

    // Add other methods as needed
}

二 对象和数据库记录映射

如果实体类的实例字段 中包含对象 ,需要考虑如何对象数据库记录 如何相互映射

通常情况下,使用 MyBatis 的 TypeHandler来处理对象字段的映射。

1.实体类(包含对象字段)

@ColumnType 注解作用:指定 OtherObjectTypeHandler.class 作为类型处理器

java 复制代码
import lombok.Data;
import tk.mybatis.mapper.annotation.ColumnType;
import javax.persistence.*;

@Data
@Table(name = "your_table")
public class YourEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private String id;

    private String name;

    // 对象字段
    @Column(name = "other_object")
    @ColumnType(typeHandler = OtherObjectTypeHandler.class)
    private OtherObject otherObject;
}

2.映射(TypeHandler)

继承BaseTypeHandler抽象类,创建一个 TypeHandler类来处理 Object对象字段的映射(对象与数据库字段的转换)。

java 复制代码
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class OtherObjectTypeHandler extends BaseTypeHandler<OtherObject> {

    private final ObjectMapper objectMapper = new ObjectMapper();

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, OtherObject parameter, JdbcType jdbcType) throws SQLException {
        // 设置 PreparedStatement 中的参数,将 OtherObject 对象转换为需要的类型
        try {
            ps.setObject(i, objectMapper.writeValueAsString(parameter));
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public OtherObject getNullableResult(ResultSet rs, String columnName) throws SQLException {
        // 从 ResultSet 中获取数据并转换为 OtherObject 对象
        try {
            return objectMapper.readValue(rs.getString(columnName), OtherObject.class);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public OtherObject getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        // 从 ResultSet 中获取数据并转换为 OtherObject 对象
        try {
            return objectMapper.readValue(rs.getString(columnIndex), OtherObject.class);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public OtherObject getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        // 从 CallableStatement 中获取数据并转换为 OtherObject 对象
        try {
            return objectMapper.readValue(cs.getString(columnIndex), OtherObject.class);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }
}

三 Example的应用

在 tk.mybatis 中,Example 类提供了一种便捷的方式来构建动态的 SQL 查询条件。 通过使用 Example 类,可以在不同的场景下动态地构建查询条件,而不需要手动编写复杂的 SQL 语句。

java 复制代码
import org.lbb.mapper.YourMapper;
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 YourService {

    @Autowired
    private YourMapper yourMapper;

    /**
     * 根据 id 获取实体
     */
    public YourEntity getEntity(String id) {
        // 1.创建 Example 对象
        Example example = new Example(YourEntity.class);
        // 2.创建 Criteria 对象,用于设置查询条件
        Example.Criteria criteria = example.createCriteria();
        // 3.设置查询条件
        criteria.andEqualTo("id", id);
        return yourMapper.selectOneByExample(example);
    }

    /**
     * 根据 name 获取实体
     */
    public List<YourEntity> getEnties(String name) {
        // 1.创建 Example 对象
        Example example = new Example(YourEntity.class);
        // 2.创建 Criteria 对象,用于设置查询条件
        Example.Criteria criteria = example.createCriteria();
        // 3.设置查询条件
        criteria.andEqualTo("name", name);
        return yourMapper.selectByExample(example);
    }
}

Criteria 对象中可以添加不同的条件,比如 andEqualToandLikeandGreaterThan 等等,来实现更加灵活的查询。

四 分页

1.PageHelper

💡 分页拦截器

依赖

xml 复制代码
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>{pagehelper-version}</version>
</dependency>
java 复制代码
public List<YourEntity> pagingByPageHelper(int pageNum, int pageSize) {
    // 设置分页参数
    PageHelper.startPage(pageNum, pageSize);
    // 执行查询
    List<YourEntity> entities = yourMapper.selectAll();
    // 获取分页信息
    PageInfo<YourEntity> pageInfo = new PageInfo<>(entities);
    log.info("{}", pageInfo.getPageNum());
    // 返回分页结果
    return pageInfo.getList();
}

pageNumpageSize ,分别表示要查询的页码每页显示的记录数

通过 PageHelper.startPage 方法设置分页参数

查询结果会被自动分页,存储在 PageInfo 对象中,可以从中获取分页信息和当前页的数据列表。

2.RowBounds

RowBounds 是 MyBatis 提供的一种简单的分页实现方式,它通过在查询时指定起始行返回的最大行数来实现分页。

在 tk.mybatis 中,selectByRowBounds 方法可以直接在 Mapper 接口中使用,它接受两个参数:

  1. 查询条件(实体属性)
  2. RowBounds 对象
java 复制代码
public List<YourEntity> pagingByRowBounds(int pageNum, int pageSize) {
    // 创建 PageRowBounds 对象,表示分页的起始行和每页显示的行数
    PageRowBounds pageRowBounds = new PageRowBounds((pageNum - 1) * pageSize, pageSize);
    // 执行分页查询,传入查询条件(实体属性)和 PageRowBounds 对象
    List<YourEntity> entities = yourMapper.selectByRowBounds(null, pageRowBounds);
    return entities;
}

创建 PageRowBounds 对象,设置起始行每页显示的行数

调用 yourMapper.selectByRowBounds 方法执行分页查询,传入了查询条件为 null (表示查询所有记录)和 PageRowBounds 对象。

在使用 selectByRowBounds 方法时,需要手动计算分页的起始行,并创建对应的 PageRowBounds 对象。

这种方式相对比较底层,需要更多的手动操作,但在某些情况下可能更加灵活。

相关推荐
小小寂寞的城7 分钟前
Jenkins里构建一个简单流水线
java·运维·jenkins
Kookoos16 分钟前
【实战】基于 ABP vNext 构建高可用 S7 协议采集平台(西门子 PLC 通信全流程)
后端·物联网·c#·.net
帮帮志19 分钟前
vue3与springboot交互-前后分离【完成登陆验证及页面跳转】
spring boot·后端·交互
wowocpp24 分钟前
idea springboot 配置文件 中文显示
java·spring boot·intellij-idea
User_芊芊君子28 分钟前
【Java面试题】——this 和 super 的区别
java·开发语言
柴薪之王、睥睨众生29 分钟前
(自用)Java学习-5.8(总结,springboot)
java·开发语言·spring boot·学习·mybatis
牛马baby29 分钟前
Java高频面试之并发编程-17
java·开发语言·面试
不辉放弃1 小时前
java连数据库
java·mysql
熊大如如9 小时前
Java 反射
java·开发语言
猿来入此小猿9 小时前
基于SSM实现的健身房系统功能实现十六
java·毕业设计·ssm·毕业源码·免费学习·猿来入此·健身平台