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

相关推荐
程序员岳焱2 分钟前
Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解
后端·sql·mysql
爱编程的喵2 分钟前
深入理解JavaScript原型机制:从Java到JS的面向对象编程之路
java·前端·javascript
龚思凯8 分钟前
Node.js 模块导入语法变革全解析
后端·node.js
天行健的回响10 分钟前
枚举在实际开发中的使用小Tips
后端
on the way 12313 分钟前
行为型设计模式之Mediator(中介者)
java·设计模式·中介者模式
保持学习ing15 分钟前
Spring注解开发
java·深度学习·spring·框架
wuhunyu16 分钟前
基于 langchain4j 的简易 RAG
后端
techzhi16 分钟前
SeaweedFS S3 Spring Boot Starter
java·spring boot·后端
异常君41 分钟前
Spring 中的 FactoryBean 与 BeanFactory:核心概念深度解析
java·spring·面试
Channing Lewis1 小时前
sql server如何创建表导入excel的数据
数据库·oracle·excel