tk.mapper框架使用

说明:tk.mapper是一款DAO框架,也是基于Mybatis的,个人感觉,他是基于MyBatis和MyBatis-plus、MyBatis-Flex之间的过渡框架------能调用DAO的API,不手写SQL,但功能没有后面这两款框架多。本文介绍tk.mapper框架的使用。

一、使用

第一步:引入依赖

Spring-Boot项目,导入以下依赖

xml 复制代码
	<dependency>
	    <groupId>tk.mybatis</groupId>
	    <artifactId>mapper</artifactId>
	    <version>4.1.5</version>
	</dependency>
	
	<dependency>
	    <groupId>org.mybatis.spring.boot</groupId>
	    <artifactId>mybatis-spring-boot-starter</artifactId>
	    <version>2.2.2</version>
	</dependency>

当然,还需要导入数据库驱动依赖,这个取决于你的数据库。

如果是MySQL

8.x版本

xml 复制代码
    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <scope>runtime</scope>
    </dependency>

5.x版本

xml 复制代码
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>

如果是Postgresql

xml 复制代码
	<dependency>
	    <groupId>org.postgresql</groupId>
	    <artifactId>postgresql</artifactId>
	    <version>42.7.3</version>
	</dependency>

第二步:实体类关联数据库表

在实体类上,加上@Table(name = "i_users")注解,name的属性值表示数据库表的名称,如下:

java 复制代码
import lombok.Data;

import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;

@Table(name = "i_users")
@Data
public class User implements Serializable {

    @Id
    private Integer id;

    @Column(name = "username")
    private String username;

    private String password;
}

@Id注解,表示改字段为该表的主键

@Column注解,name属性值表示在数据库该字段的名称,当字段名与属性名不一致时,可以用这个注解取别名,建立映射

第三步:创建Repository

创建针对User表的数据库访问对象(DAO),如下:

java 复制代码
import com.hezy.pojo.User;
import org.springframework.stereotype.Repository;
import tk.mybatis.mapper.common.Mapper;

@Repository
public interface UserRepository extends Mapper<User> {
}

继承Mapper,尖括号里面填实体类,后面就可以用框架自带的API操作数据库了。

第四步:测试

创建一个UserController,用框架自带的全查API,selectAll(),小试一下。

java 复制代码
import com.hezy.pojo.User;
import com.hezy.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("user")
public class UserController {

    @Autowired
    private UserRepository userRepository;

    @GetMapping
    public List<User> getUser() {
        return userRepository.selectAll();
    }
}

数据库表如下:

启动项目,调用接口,如下:

整合完成

二、API

下面介绍框架自带的API使用,分为添加、删除、修改和查询;

(1)添加数据

java 复制代码
@Test
public void insertUserTest() {
	// 1.全字段插入
	User user1 = new User();
	user1.setUsername("wangwu");
	user1.setPassword("123465");
	userRepository.insert(user1);
	
	// 2.部分字段插入
	User user2 = new User();
	user2.setUsername("zhaoliu");
	userRepository.insertSelective(user2);
}

注:在需要使用数据库默认值时,需要用部分字段插入,insertSelective()。如密码字段数据库默认值为123456,如果用全字段插入insert(),那么插入的数据密码字段会是null

(2)删除数据

java 复制代码
@Test
public void deleteUserTest() {
	// 1.根据对象删除,用这种方式最好给对象set一个唯一约束的字段,不然会删掉所有password=123456的记录
	User user1 = new User();
	user1.setPassword("123456");
	userRepository.delete(user1);
	
	// 2.根据主键删除
	userRepository.deleteByPrimaryKey(5);
	
	// 3.构建条件删除,username等于zhaoliu的记录
	Example example = new Example(User.class);
	example.createCriteria().andEqualTo("username", "zhaoliu");
	userRepository.deleteByExample(example);
}

(3)修改数据

java 复制代码
@Test
public void updateUserTest() {
    // 1.根据主键全字段更新,未设置的字段为null或者用数据库默认值
    User user1 = new User();
    user1.setId(4);
    user1.setUsername("zhangsan");
    user1.setPassword("123456");
    userRepository.updateByPrimaryKey(user1);

    // 2.根据主键部分字段更新,未设置的字段保持原样
    User user2 = new User();
    user2.setId(4);
    user2.setUsername("lisi");
    userRepository.updateByPrimaryKeySelective(user2);

    // 3.构建条件全字段更新,更新username=lisi的记录,password字段为123456,username字段未设置,更新后,username=null
    User user3 = new User();
    user3.setPassword("123456");
    Example example1 = new Example(User.class);
    example1.createCriteria().andEqualTo("username", "lisi");
    userRepository.updateByExample(user3, example1);

    // 4.构建条件部分字段更新,更新username=lisi的记录,password字段为123456,username字段未设置,更新后,username保持原样
    User user4 = new User();
    user4.setPassword("123456");
    Example example2 = new Example(User.class);
    example2.createCriteria().andEqualTo("username", "lisi");
    userRepository.updateByExampleSelective(user4, example2);
}

注意区分全字段更新和部分字段更新

(4)查询数据

java 复制代码
@Test
public void selectUserTest() {
    // 1.全查
    List<User> users = userRepository.selectAll();
    System.out.println(users);

    // 2.根据主键查
    User user = userRepository.selectByPrimaryKey(4);
    System.out.println(user);

    // 3.查询password=123456的一条记录,如果有多个会报TooManyResultsException
    User user2 = new User();
    user2.setPassword("123456");
    User user3 = userRepository.selectOne(user2);
    System.out.println(user3);

    // 4.统计password=123456的记录数
    User user4 = new User();
    user4.setPassword("123456");
    int count1 = userRepository.selectCount(user4);
    System.out.println(count1);

    // 5.构建条件查询,username字段为null的记录
    Example example1 = new Example(User.class);
    example1.createCriteria().andIsNull("username");
    List<User> userList = userRepository.selectByExample(example1);
    System.out.println(userList);

    // 6.构建条件统计,统计记录以li开头的记录,注意这里andLike的value里面写的是like后面的完整部分,要带上通配符
    Example example2 = new Example(User.class);
    example2.createCriteria().andLike("username", "li%");
    int count2 = userRepository.selectCountByExample(example2);
    System.out.println(count2);

    // 7.分页查询,假设每页显示2条,查询第2页的内容
    int pageIndex = 2;
    int pageSize = 2;
    int offset = (pageIndex - 1) * pageSize;
    RowBounds rowBounds = new RowBounds(offset, pageSize);
    List<User> bounds = userRepository.selectByRowBounds(new User(), rowBounds);
    System.out.println(bounds);

    // 8.根据条件分页查询,查询password=123456的记录,并且按照每页显示2条,查询第2页的内容
    Example example = new Example(User.class);
    example.createCriteria().andEqualTo("password", "123456");
    List<User> andRowBounds = userRepository.selectByExampleAndRowBounds(example, rowBounds);
    System.out.println(andRowBounds);
}

注意andLike()查询,里面要填通配符,不能像MyBatis-Plus那样,有细分左like、右like的API;

总结

本文介绍了tk.mapper框架的使用,实际上就是整合加API的使用,没有什么技术点,这些API在实际用的时候再去看都来得及,完全不用记。

Mybatis、MyBatis-Plus介绍参看下面这两篇文章:

完整代码:https://github.com/HeZhongYing/tk_mapper_demo

相关推荐
胡耀超30 分钟前
Java多线程在单体、微服务、服务网格与云原生架构中的理解与线程安全保障:总结与对比
java·云原生·架构
代码之光_198031 分钟前
SpringBoot与微服务:网上租赁系统的现代化构建
spring boot·后端·微服务
武子康1 小时前
大数据-152 Apache Druid 集群模式 配置启动【下篇】 超详细!
java·大数据·clickhouse·flink·apache
Databend1 小时前
Databend 实现高效实时查询:深入解读 Dictionary 功能
数据库
费曼乐园1 小时前
Spring中引入 @PostConstruct 注解的原因
java·spring
IT技术员2 小时前
【docker学习】Linux系统离线方式安装docker环境方法
java·linux·学习·spring cloud·docker
计算机学姐2 小时前
基于php的民宿预订管理系统
开发语言·vue.js·windows·后端·php·intellij-idea·phpstorm
海岛日记2 小时前
uniapp url取消#
java·数据库·uni-app
qq_365320602 小时前
IDEA几大常用AI插件
java·人工智能·intellij-idea
巨人与阿伟2 小时前
Redis持久化、主从与哨兵架构详解
数据库·redis·架构