TKMybatis 介绍和使用

目录

一、什么是 TKMybatis

二、TKMybatis 使用

2.1 Springboot 项目中加入依赖

2.2 使用讲解

2.2.1 实体类中使用

2.2.2 dao中使用

2.2.3 Service 层中使用

2.3 实际案例

2.3.1 dao 层使用

2.3.2 service 层使用


一、什么是 TKMybatis

TKMybatis 是基于 Mybatis 框架开发的一个工具,内部实现了对单表的基本数据操作,只需要简单继承 TKMybatis 提供的接口,就能够实现无需编写任何 sql 即能完成单表操作。

 

二、TKMybatis 使用

2.1 Springboot 项目中加入依赖

<!--通用mapper起步依赖-->
<dependency><groupId>tk.mybatis</groupId><artifactId>mapper-spring-boot-starter</artifactId><version>2.0.4</version>
</dependency>

在 POJO 类中加入依赖

<!--每个工程都有Pojo,都需要用到该包对应的注解-->
<dependency><groupId>javax.persistence</groupId><artifactId>persistence-api</artifactId><version>1.0</version><scope>compile</scope>
</dependency>

在启动类中配置 @MapperScan 扫描

@SpringBootApplication
@MapperScan(basePackages = {"com.tom.order.mapper"})
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}
}

 

2.2 使用讲解

2.2.1 实体类中使用

在实体类中,常用的注解和意义为:

@Table:描述数据库表信息,主要属性有name(表名)、schema、catalog、uniqueConstraints等。

@Id:指定表主键字段,无属性值。

@Column:描述数据库字段信息,主要属性有name(字段名)、columnDefinition、insertable、length、nullable(是否可为空)、precision、scale、table、unique、updatable等。

@ColumnType:描述数据库字段类型,可对一些特殊类型作配置,进行特殊处理,主要属性有jdbcType、column、typeHandler等。

其他注解如:@Transient、@ColumnResult、@JoinColumn、@OrderBy、@Embeddable等暂不描述

 

2.2.2 dao中使用

单表操作,只需要继承 tk.mybatis 下的 Mapper 接口即可使用

import tk.mybatis.mapper.common.Mapper;@Repository
public interface BrandMapper extends Mapper<Brand> {
}

查看具体使用:内部都已经封装了基本的单表操作

 

2.2.3 Service 层中使用

操作类型介绍
增加Mapper.insert(record);保存一个实体,null的属性也会保存,不会使用数据库默认值
Mapper.insertSelective(record);保存一个实体,忽略空值,即没提交的值会使用使用数据库默认值
 
删除Mapper.delete(record);根据实体属性作为条件进行删除,查询条件使用等号
Mapper.deleteByExample(example)根据Example条件删除数据
Mapper.deleteByPrimaryKey(key)根据主键字段进行删除,方法参数必须包含完整的主键属性
 
修改Mapper.updateByExample(record,example)根据Example条件更新实体`record`包含的全部属性,null值会被更新
Mapper.updateByExampleSelective(record, example)根据Example条件更新实体`record`包含的不是null的属性值
Mapper.updateByPrimaryKey(record)根据主键更新实体全部字段,null值会被更新
Mapper.updateByPrimaryKeySelective(record)根据主键更新属性不为null的值
 
查询Mapper.select(record)根据实体中的属性值进行查询,查询条件使用等号
Mapper.selectAll()查询全部结果
Mapper.selectByExample(example)根据Example条件进行查询
Mapper.selectByPrimaryKey(key)根据主键字段进行查询,方法参数必须包含完整的主键属性,查询条件使用等号
Mapper.selectCount(record)根据实体中的属性查询总数,查询条件使用等号
Mapper.selectCountByExample(example)根据Example条件进行查询总数
Mapper.selectOne(record)

根据实体中的属性进行查询,只能有一个返回值,有多个结果是抛出异常,查询条件使用等号。

但是如果存在某个属性为int,则会初始化为0。可能影响到实际使用

 

2.3 实际案例

2.3.1 dao 层使用

 
import tk.mybatis.mapper.common.Mapper;/*** DAO 使用通用Mapper* DSO接口需要继承 tk.mybatis.mapper.common.Mapper*/
@Repository
public interface BrandMapper extends Mapper<Brand> {}

 

2.3.2 service 层使用

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.commons.lang.StringUtils;
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 BrandServiceImpl implements BrandService {@Autowiredprivate BrandMapper brandMapper;public Example createExample(Brand brand) {// 自定义条件搜索对象 ExampleExample example = new Example(Brand.class);Example.Criteria criteria = example.createCriteria(); //条件构造器if (brand != null) {if (!StringUtils.isEmpty(brand.getName())) {criteria.andLike("name", '%' + brand.getName() + '%');}if (!StringUtils.isEmpty(brand.getLetter())) {criteria.andEqualTo("letter", brand.getLetter());}}return example;}@Overridepublic List<Brand> findAll() {return brandMapper.selectAll();}@Overridepublic List<Brand> findList(Brand brand) {Example example = createExample(brand);return brandMapper.selectByExample(example);}@Overridepublic Brand findById(Integer id) {return brandMapper.selectByPrimaryKey(id);}/*** 分页查询* @param page  当前页* @param size  每页显示的条数* @return*/@Overridepublic PageInfo<Brand> pageSearch(Integer page, Integer size) {// 分页实现// 后面的查询必须是紧跟集合查询PageHelper.startPage(page, size);// 查询集合List<Brand> brands = brandMapper.selectAll();return new PageInfo<Brand>(brands);}@Overridepublic PageInfo<Brand> pageSearchAndCondition(Brand brand, Integer page, Integer size) {// 开始分页PageHelper.startPage(page, size);// 搜索数据Example example = createExample(brand);List<Brand> list = brandMapper.selectByExample(example);return new PageInfo<Brand>(list);}/*** 增加品牌* @param brand*/@Overridepublic void add(Brand brand) {// 使用通用 Mapper.insertSelective// 方法中但凡带有selective就会忽略空值int i = brandMapper.insertSelective(brand);}/*** 根据id修改品牌* @param brand*/@Overridepublic void update(Brand brand) {// 使用通用mapper.update();brandMapper.updateByPrimaryKeySelective(brand);}/*** 根据id删除* @param id*/@Overridepublic void del(Integer id) {brandMapper.deleteByPrimaryKey(id);}
}

 

三、扩展介绍

https://juejin.im/post/5cbfd158f265da038860b82f

 

 

 


---------------------
作者:AldarLin
来源:CSDN
原文:https://blog.csdn.net/qq_34416331/article/details/106322596
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/284008.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WinForm(三)揭开可视化控件的面纱

WinForm所见即所得的UI设计框架&#xff0c;开发效率确实有所提升&#xff0c;同时降低了编程门槛&#xff0c;让WinForm更普及。拖拖拽拽就能设计出一个界面&#xff0c;那么我们拖拽的这些东西是什么&#xff1f;它们是什么原理&#xff1f;。WinForm我觉得很好的一点是&…

RestTemplate 详解

在项目中&#xff0c;当我们需要远程调用一个 HTTP 接口时&#xff0c;我们经常会用到 RestTemplate 这个类。这个类是 Spring 框架提供的一个工具类。Spring 官网对它的介绍如下&#xff1a; RestTemplate: The original Spring REST client with a synchronous, template met…

初识Spark2.0之Spark SQL

内存计算平台Spark在今年6月份的时候正式发布了spark2.0&#xff0c;相比上一版本的spark1.6版本&#xff0c;在内存优化&#xff0c;数据组织&#xff0c;流计算等方面都做出了较大的改变&#xff0c;同时更加注重基于DataFrame数据组织的MLlib&#xff0c;更加注重机器学习整…

ABP详细教程——模块类

概述模块化是ABP vNext的最大亮点&#xff0c;也是ABP vNext框架的核心&#xff0c;而模块类是ABP vNext框架模块化的核心要素。这一章节&#xff0c;我就从模块类的用法、运行机制、源代码等层面&#xff0c;带大家详细了解ABP vNext的模块类。用法在ABP的约定中&#xff0c;每…

[转]Eureka工作原理

目录 Eureka 工作原理 Eureka 核心概念 自我保护机制 Eureka 集群原理 Eurka 工作流程 总结 Eureka 工作原理 上节内容为大家介绍了&#xff0c;注册中心 Eureka 产品的使用&#xff0c;以及如何利用 Eureka 搭建单台和集群的注册中心。这节课我们来继续学习 Eureka&…

重谈联想5G编码投票事件

此前&#xff0c;司马南谈了联想好几个问题&#xff0c;其中最尖锐的要属国有资产流失&#xff0c;这是联想管理层无法回避的死穴。不过&#xff0c;司马南批判联想5G投票背刺H公司&#xff0c;这基本就是造谣了。当年&#xff0c;媒体把编码投票炒作的很厉害&#xff0c;抨击联…

JStorm2.1.1集群的安装和使用

为什么80%的码农都做不了架构师&#xff1f;>>> JStorm2.1.1集群的安装和使用 Storm是一个免费开源、分布式、高容错的实时计算系统&#xff0c;而JStorm是阿里巴巴开源的基于Storm采用Java重写的一套分布式实时流计算框架&#xff0c;在性能和支持的集群规模上做了…

Hystrix 原理

Hystrix是什么&#xff1f; Hystrix是Netflix开源库&#xff0c;这是一个针对分布式系统的延迟和容错库。 Hystrix 供分布式系统使用&#xff0c;提供延迟和容错功能&#xff0c;隔离远程系统、访问和第三方程序库的访问点&#xff0c;防止级联失败&#xff0c;保证复杂的分布…

「深度」无人机实名制政策特稿|市场看好、资本关注,“反黑飞”正在崛起

从政策和需求来看&#xff0c;“反黑飞”越来越重要&#xff0c;市场也正在不断崛起。 对于大多数人来说&#xff0c;今天是最适合明目张胆“装嫩”的六一儿童节。不过&#xff0c;在无人机厂商和无人机玩家的眼里&#xff0c;今天是无人机实名制政策正式实施的日子。 近年来&…

在navicat中新建数据库

前言&#xff1a; 在本地新建一个名为editor的数据库&#xff1b; 过程&#xff1a; 1.&#xff1b; 2.选择&#xff1a;utf8mb4 -- UTF-8 Unicode字符集&#xff0c;原因在于&#xff1a;utf8mb4兼容utf8&#xff0c;且比utf8能表示更多的字符。&#xff0c;而且它支持表情符号…

MASA Stack 第三期社区例会

MASA Blazor 0.5.0发版内容功能Autocomplete&#xff1a;支持通过设置AutoSelectFirst参数开启自动选择第一项的功能&#xff0c;支持CacheItems参数&#xff0c;增强使用上下键的用户体验。BottomNavigation&#xff1a;&#xff1a;一个替代侧边栏的新组件。它主要用于移动应…

[转]高并发架构设计之--「服务降级」、「服务限流」与「服务熔断」

目录 服务降级 1 、简介 2 、使用场景 3 、核心设计 3.1 分布式开关 3.2 自动降级分类 3.3 配置中心 3.4 处理策略 3.5 降级分类 3.6 服务降级要考虑的问题 4 、高级特性 4.1 分级降级 4.2 降级权值 5 、总结与展望 服务限流 一、为什么要做服务限流设计&…

SpringBoot获取ApplicationContext

2019独角兽企业重金招聘Python工程师标准>>> 有两种方法&#xff1a; 创建Component实现ApplicationContextAware接口&#xff0c;SpringBoot会自动调用这个类的setApplicationConext()方法。鼓励使用这种方式。SpringApplication.run(MyApplication.class, args)这…

SkiaSharp 之 WPF 自绘 投篮小游戏(案例版)

此案例主要是针对光线投影法碰撞检测功能的示例&#xff0c;顺便做成了一个小游戏&#xff0c;很简单&#xff0c;但是&#xff0c;效果却很不错。投篮小游戏规则&#xff0c;点击投篮目标点&#xff0c;就会有一个球沿着相关抛物线&#xff0c;然后&#xff0c;判断是否进入篮…

zuul集成ribbon完成服务通信和负载均衡

目录 Zuul2服务通信 超时相关 默认超时配置 自定义超时配置 负载均衡 Zuul2服务通信 描述&#xff1a;zuul2通过Ribbon完成客户端负载均衡以及与服务器群集进行通信。 zuul2的通信是集成Ribbon实现的&#xff0c;在Origin中集成Ribbon基本配置&#xff08;例如IClientCo…

时任上海来伊份互联网事业群总裁王戈钧 :传统企业(线上+线下)移动互联网改造...

2017年12月22日-23日&#xff0c;第13届信息化领袖峰会暨2017中国数字化贡献人物颁奖盛典在上海盛大开幕。本次峰会由上海市经济和信息化委员会指导&#xff0c;上海市国有资产信息中心、上海市计算机用户协会、上海市信息服务业行业协会、上海大数据联盟、上海市高等教育学会支…

【.NET6+Modbus】Modbus TCP协议解析、仿真环境以及基于.NET实现基础通信

接下来的内容&#xff0c;我会以从头开发一个简单的基于modbus tcp通信的案例&#xff0c;来实现一个基础的通信功能。有关环境&#xff1a;开发环境&#xff1a;VS 2022企业版运行环境&#xff1a;Win 10 专业版.NET 环境版本&#xff1a;.NET 6【备注】 源码在文末 1、新建一…

源码深度剖析Eureka与Ribbon服务发现原理

本文基于 spring cloud dalston&#xff0c;同时文章较长&#xff0c;请选择舒服姿势进行阅读。 Eureka 与 Ribbon 是什么&#xff1f;和服务发现什么关系&#xff1f; Eureka 与 Ribbon 都是 Netflix 提供的微服务组件&#xff0c;分别用于服务注册与发现、负载均衡。同时&a…

std的find和reverse_iterator联合使用

上代码&#xff1a; // test2013.cpp : 定义控制台应用程序的入口点。 //#include "stdafx.h" #include <stdlib.h> #include <stdio.h> #include<iostream> #include<vector> #include<map> #include<string> using namespace …

论如何提升学习的能力

为啥要学习如果有一件事情是能改变你自己的&#xff0c;我想这件事情必然就是学习&#xff0c;我的人生重要的转折点也是从学习这件事情始发的&#xff0c;那么&#xff0c;我们就从这里开始。学习不仅仅是为了找到答案&#xff0c;而是为了找到方法&#xff0c;找到一个可以找…