SpringBoot整合TKMyBatis实现增删改查

news2024/11/16 5:30:41

文章目录

    • 什么是TKMybatis?
    • SpringBoot整合TKMybatis
    • 实体类注解
    • TKMapper接口如何使用
    • 基本增删改操作
    • 批量查询和删除
    • 批量添加
    • 自定义查询条件Example
      • Example 条件设置
      • Example 使用

什么是TKMybatis?

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

SpringBoot整合TKMybatis

添加maven依赖

    <dependency>
      <groupId>tk.mybatis</groupId>
      <artifactId>mapper-spring-boot-starter</artifactId>
      <version>2.1.5</version>
    </dependency>

实体类注解

@Setter
@Getter
@Table(name = "user")
public class User {
    /**
     * 用户ID
     */
    @Id
    private String id;
    /**
     * 用户姓名
     */
    private String userName;
    /**
     * 用户密码
     */
    private String passWord;
    /**
     * 年龄
     */
    private Integer age;
    /**
     * 性别
     */
    private String gender;
}

@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等暂不描述

TKMapper接口如何使用

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

@Mapper
public interface UserMapper extends Mapper<User>, MySqlMapper {

}

基本增删改操作

@Service
public class UserService {
    
    @Resource
    private UserMapper userMapper;

    /**
     *  根据主键字段进行查询,方法参数必须包含完整的主键属性,查询条件使用等号
     */
    public User selectUserById(String userId){
        return userMapper.selectByPrimaryKey(userId);
    }
    /**
     *  查询全部结果
     */
    public List<User> selectAll(){
        return userMapper.selectAll();
    }
    /**
     *  根据实体中的属性值进行查询,查询条件使用等号
     */
    public List<User> selectByUserName(String userName){
        User user = new User();
        user.setUserName(userName);
        return userMapper.select(user);
    }
    /**
     *  根据实体中的属性进行查询,只能有一个返回值,有多个结果是抛出异常,查询条件使用等号。
     *  但是如果存在某个属性为int,则会初始化为0。可能影响到实际使用
     */
    public User selectOneByUserName(String userName){
        User user = new User();
        user.setUserName(userName);
        return userMapper.selectOne(user);

    }
    /**
     *  根据实体中的属性查询总数,查询条件使用等号
     */
    public Integer selectUserCount(String userName){
        User user = new User();
        user.setUserName(userName);
        return userMapper.selectCount(user);
    }
    /**
     *  保存一个实体,null的属性也会保存,不会使用数据库默认值
     */
    public void addUser(String userName,String passWord,Integer age,String gender){
        User user = new User();
        user.setId(String.valueOf(UUID.randomUUID()));
        user.setUserName(userName);
        user.setAge(age);
        user.setGender(gender);
        user.setPassWord(passWord);
        userMapper.insert(user);
    }
    /**
     *  保存一个实体,忽略空值,即没提交的值会使用使用数据库默认值
     */
    public void addUserService(String userName,String passWord){
        User user = new User();
        user.setId(String.valueOf(UUID.randomUUID()));
        user.setUserName(userName);
        user.setPassWord(passWord);
        userMapper.insertSelective(user);
    }
    /**
     *  根据主键字段进行删除,方法参数必须包含完整的主键属性
     */
    public void deleteById(String userId){
        userMapper.deleteByPrimaryKey(userId);
    }
    /**
     *  根据实体属性作为条件进行删除,查询条件使用等号
     */
    public void deleteByName(String userName){
        User user = new User();
        user.setUserName(userName);
        userMapper.delete(user);
    }
    /**
     *  根据主键更新实体全部字段,null值会被更新
     */
    public void updateById(String userId,String userName){
        User user = new User();
        user.setId(userId);
        user.setUserName(userName);
        userMapper.updateByPrimaryKey(user);
    }
    /**
     *  根据主键更新属性不为null的值
     */
    public void updateByIdSelective(String userId,String userName){
        User user = new User();
        user.setId(userId);
        user.setUserName(userName);
        userMapper.updateByPrimaryKeySelective(user);
    }    
}


批量查询和删除

批量查询 批量删除集成 SelectByIdsMapper, DeleteByIdsMappe 接口

@Mapper
public interface UserMapper extends Mapper<User>, SelectByIdsMapper, DeleteByIdsMapper {

}
     /**
     *  批量查询
     */
    public List<User> selectUserById(List<String> userIds){
        StringJoiner stringJoiner = new StringJoiner(",");
        for (String userId : userIds) {
            stringJoiner.add(userId);
        }
        return userMapper.selectByIds(stringJoiner.toString());
    }

    /**
     *  根据ID批量删除
     */
    public void deleteById(List<String> userIds){
        StringJoiner stringJoiner = new StringJoiner(",");
        for (String userId : userIds) {
            stringJoiner.add(userId);
        }
        userMapper.deleteByIds(stringJoiner.toString());
    } 

批量添加

批量添加需要继承MySqlMappe接口

@Mapper
public interface UserMapper extends Mapper<User>, MySqlMapper, SelectByIdsMapper, DeleteByIdsMapper {

}
    /**
     *  批量添加
     */
    public void batchAdd(){
       List<User> list = new ArrayList();
        for (int i = 1; i < 6; i++) {
            User user = new User();
            user.setId(String.valueOf(i));
            user.setUserName("zs");
        }
        userMapper.insertList(list);
    }

自定义查询条件Example

图中接口都有一个共同点,就是需要 Example 对象作为方法的参数,Example 对象包含了我们各种自定义的查询条件,相当于 sql 语句中 where 部分的条件。

每个接口都包含了一个方法,供我们调用。总结如下表:

方法功能描述
int deleteByExample(Object var1);一般参数就是Example对象,按照条件进行删除,返回删除的记录数
List selectByExample(Object var1);一般参数就是Example对象,按照条件进行查询,返回查询结果集
int selectCountByExample(Object var1);一般参数就是Example对象,按照条件进行查询,返回符合查询条件的记录数
T selectOneByExample(Object var1);一般参数就是Example对象,按照条件进行查询,结果只能为空或者一个,否则抛出异常
int updateByExample(@Param(“record”) T var1, @Param(“example”) Object var2);第一个参数是新记录,第二参数是example对象,用新记录替换掉符合条件的旧记录
int updateByExampleSelective(@Param(“record”) T var1, @Param(“example”) Object var2);功能同上,只是可以仅替换掉记录的部分字段
List selectByRowBounds(T var1, RowBounds var2);第一个参数是查询条件,第二个参数是 RowBounds 对象(包含2个属性,offset 和 limit),offset 表示起始行,limit 表示需要的记录数;方法的功能是按照查询条件进行查询,再按照 offset 和 limit 在结果集中取相应数量的记录。
List selectByExampleAndRowBounds(Object var1, RowBounds var2);第一个参数是 Example 对象,第二个参数是 RowBounds 对象,先根据 example 条件进行查询,再按照 offset 和 limit 取相应数量的记录。
List selectByConditionAndRowBounds(Object var1, RowBounds var2);同上

Example 条件设置

先创建 Example 对象,再创建 Example.criteria 对象,借助这两个对象,可以灵活地设置各种条件。Example 对象可以理解为 sql 语句层次的设置, 而 Example.criteria 对象可以理解为 sql 语句中的一个单一的条件表达式设置。

原理上可以理解为:一个 example 包含了若干个 criteria ,每个 criteria 就是 sql 语句中条件部分的一个括号部分(没有嵌套),比如 (id = 5),criteria 包含了一个方法 void setAndOr(String andOr),它的意思相当于在括号前面加上 and 还是 or,比如执行了方法 setAndOr(“and”),那么 criteria 相当于 and (id = 5),而 example 就把这些 criteria 拼凑起了,比如 example 包含了 2 个 criteria,分别是 (id = 5) 和 and (name = “张三”),那么此 example 的效果就是 (id = 5) and (name = “张三”)。

Example example = new Example(User.class);
Example.Criteria criteria = example.createCriteria();
方法功能描述
andAllEqualTo(Object param)所有字段都作为 where 后面的判断条件,判断值就是参数实体对象
andBetween(String property, Object value1, Object value2)where property between value1 and value2 ,范围条件,包含两端
andEqualTo(Object param)实体对象中不为 null 的字段作为 where 后面的判断条件
andEqualTo(String property, Object value)某一个<字段,值>作为 where 后面的判等条件
andGreaterThan(String property, Object value)大于条件,某个字段大于某个值
andGreaterThanOrEqualTo(String property, Object value)大于等于条件,某个字段大于等于某个值
andIn(String property, Iterable values)where property in (),范围条件
andIsNotNull(String property)where property is not null,判空条件
andIsNull(String property)where property is null,判空条件
andLessThan(String property, Object value)小于条件
andLessThanOrEqualTo(String property, Object value)小于等于条件
andLike(String property, String value)where property like value,注意 value 应该是一个匹配表达式
andNotBetween(String property, Object value1, Object value2)范围条件,不包含两端
andNotEqualTo(String property, Object value)要求字段不等于某个值
andNotIn(String property, Iterable values)要求字段不在某个范围内
andNotLike(String property, String value)模糊查询,要求不 like。
void setAndOr(String andOr)上面已经介绍过了

上表的方法都是“与”关系,即 and。 同样的,有相应的 “或” 关系,即 or。比如 orAllEqualTo、orGreaterThan 等等,都是将方法名中的 “and” 换成 “or”。

那 criteria 能否嵌套呢?能否有更方便的使用方式呢?回答:能,有。如下表:

方法功能描述
Example.Criteria orCondition(String condition, Object value)condition参数是个sql字符串,可以拼接进 sql 语句的,value 是一个值,会拼接到 condition 后面的,此方法的最终结果为 or condition + value。
Example.Criteria orCondition(String condition)功能同上,只是更加直接,一个字符串搞定,只是字符串参数可以写成类似这种 “id = ”+getId(),“( id = “+getId()+”)”,一样灵活,此方法的最终结果为 or condition。
Example.Criteria andCondition(String condition)不再赘述
Example.Criteria andCondition(String condition, Object value)不再赘述

Example 类包含的方法总结如下表:

方法功能描述
void setDistinct(boolean distinct)查询的结果是否要进行唯一性过滤,true表示过滤,false(默认)表示不过滤。
void setOrderByClause(String orderByClause)查询结果按照某个,或者某些字段进行升序,降序。比如参数是 “id asc” 就是按照 id 进行升序,“id asc,age desc” 就是按照 id 升序,在 id 相等的情况下,按照 age 降序。
Example selectProperties(String… properties)当利用 example 进行查询时,此方法可以设置想要查询的字段是哪些,比如我只需要查询一张表的部分字段。
Example.OrderBy orderBy(String property)排序,与 setOrderByClause 功能一样,只是用法不同,比如 orderBy(“id”).asc() 表示按照 id 升序, orderBy(“id”).asc().orderBy(“age”).desc() 表示按照 id 升序,再按照 age 降序
Example.Criteria or()创建一个 or 方式的、空的criteria,具体的 criteria 内容可以稍后设置。
void or(Example.Criteria criteria)直接以 or 的方式添加一个现有的 criteria
Example.Criteria and()同上,不过是 and 方式
void and(Example.Criteria criteria)同上,and 方式

Example 使用

    public List<User> getUserByExample(String userName,String age){
        Example example = new Example(User.class);
        //Example.Criteria criteria = example.and();  
        //criteria.andEqualTo("age",age)  这里直接简写了
        example.and().andEqualTo("age",age)
                .andLike("userName",'%' +userName + '%');
        List<User> users = userMapper.selectByExample(example);
        return users;
    }

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

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

相关文章

[4]MQTT协议基础--下

1.QoS服务质量等级 MQTT服务质量(Quality of Service 缩写 QoS)正是用于告知物联网系统&#xff0c;哪些信息是重要信息需要准确无误的传输&#xff0c;而哪些信息不那么重要&#xff0c;即使丢失也没有问题。 MQTT协议有三种服务质量级别&#xff1a; QoS 0 – 最多发一次…

公司jmeter分享

一、数据库压测组件功能说明 1.JDBC Connection Configuration:jdbc连接配置(一个测试计划可以有多个 JDBC Connection) 2.Variable Name for created pool: 创建池的变量名 连接绑定的变量名,JMeter可以使用多个连接,每个连接绑定到不同的变量;通过引用不同的绑定变量…

安全防范语音通知实现方案

语音通知作为一种强提醒的信息通知方式&#xff0c;非常适合使用在安全防范语音通知场景中&#xff0c;可以有效避免用户错过重要信息。那安全防范语音通知怎么实现&#xff1f;这里互亿无线小编为大家做个详细介绍&#xff1a; 一、如何发送安全防范语音通知信息 互亿无线语…

本地事务、分布式事务、CAP 定理与 BASE 理论、分布式事务几种方案、Linux 安装 Seata、Seata的使用-56

一&#xff1a;本地事务 1.1 事务的基本性质 1.数据库事务的几个特性&#xff1a;原子性(Atomicity )、一致性( Consistency )、隔离性或独立性( Isolation)和持久性(Durabilily)&#xff0c;简称就是 ACID&#xff1b; 原子性&#xff1a;一系列的操作整体不可拆分&#xf…

LVGL学习笔记8 - 字体

目录 1. 修改默认字体 2. 修改字体 3. 特殊字体 3.1 SUBPX字体 3.2 28像素压缩字体 3.3 16像素希伯来语/阿拉伯语/Perisan字母 3.4 16像素中文字体 3.5 8像素Ascii字体 3.6 16像素Ascii字体 3.7 内置图标 4. 超大字体 5. 编码方式 6. 添加字体 6.1 在线字体转换器 …

【微服务笔记01】微服务组件之Eureka注册中心的介绍及其基础环境的搭建

这篇文章&#xff0c;主要介绍微服务中的注册中心Eureka及其基础环境的搭建【源代码地址】。 目录 一、Eureka注册中心 1.1、什么是注册中心 1.2、注册中心原理 二、搭建Eureka注册中心环境 2.1、创建父工程&#xff0c;引入微服务依赖 2.2、创建Eureka服务端工程 &…

全球公开的DEM数据产品

1 简介 全球公开版地形数据包括&#xff1a;GTOPO30-DEM、ASTER-GDEM、SRTM90、ALOS-AW3D30等&#xff0c;其他的诸如World DEM及ALOS-AW3D (5m分辨率&#xff09;等全球地形数据不能免费获得。 SRTM&#xff1a;由NASA 及国家地理空间情报局NGA采用2000年2月发射的“奋进号”…

word文件损坏打不开如何修复?文件丢失怎么办?

我们日常办公中&#xff0c;经常用到Word文档。但是有时会遇到word文件损坏、无法打开的情况。这时该怎么办&#xff1f;接着往下看&#xff0c;小编在这里就给大家带来Word文件修复的方法&#xff0c;以及Word文件丢失如何恢复的方法&#xff01; 一、Word文件损坏怎么办 部分…

【vsan数据恢复】磁盘离线导致分布式存储瘫痪的数据恢复案例

vsan数据恢复环境&#xff1a; 一组4台服务器搭建vsan集群&#xff1b; 每台服务器配置有2组分别由6块硬盘组成的磁盘阵列&#xff0c;上层是虚拟机文件。 vsan故障&#xff1a; 在运行过程中&#xff0c;某一个节点的一块硬盘离线&#xff0c;vsan安全机制启动&#xff0c;开始…

梦想云图Node.JS服务 ( 最近更新时间:2022-12-30 10:04:50 )

说明 后台提供梦想Node.JS服务&#xff0c;方便调用控件后台功能&#xff0c;Windows服务程序所在目录:Bin\MxDrawServer\Windows&#xff0c;Linux服务程序所在目录:Bin\Linux\MxDrawServer 梦想云图Node.JS服务 &#xff08; 最近更新时间&#xff1a;2022-12-30 10:04:50 …

第三个脚本——时间加速and视频倍速

目录 本文主要内容 granr属性介绍 run-at属性 时间加速原理 视频倍速原理 完整示例 本文主要内容 介绍grant属性&#xff0c;run-at属性以及时间加速&#xff0c;视频倍速原理 granr属性介绍 相关函数四个&#xff1a; GM_setValue GM_getValue GM_listValues GM_del…

json基本使用与简介

一、简介 二、json两种构造结构 三、js解析JSON 1、JSON2解析JSON 2.用eval()方法把JSON字符串转化成JSON对象. 3&#xff0e;使用JSON2中的JSON对象的parser()方法解析JSON字符串 4. 使用JSON2中的JSON对象的stringify ()方法把JSON对象转换成字符串 5、案例 四、Java解…

【模型部署】人脸检测模型DBFace C++ ONNXRuntime推理部署(1)

系列文章目录 【模型部署】人脸检测模型DBFace C ONNXRuntime推理部署&#xff08;0&#xff09; 【模型部署】人脸检测模型DBFace C ONNXRuntime推理部署&#xff08;1&#xff09; 【模型部署】人脸检测模型DBFace C ONNXRuntime推理部署&#xff08;2&#xff09; 文章目录…

深度学习训练营之灵笼人物识别

深度学习训练营之灵笼人物识别原文链接环境介绍前置工作设置GPU导入数据数据查看数据预处理加载数据可视化数据检查数据配置数据集prefetch()功能详细介绍&#xff1a;归一化查看归一化后的数据构建VGG-19网络VGG优点VGG缺点利用官方给到的网络网络结构编译模型训练结果可视化预…

第03讲:GitHub的使用

一、创建远程仓库 访问GitHub官方网站&#xff0c;并创建账号&#xff0c;然后按照以下图示创建项目 复制仓库地址 二、远程仓库的操作 命令作用git remote -v查看当前所有远程地址别名git remote add 别名 远程地址起别名git push 别名 分支推送本地分支上的内容到远程仓库…

vscode+opencv+mingw+cmake配置vscode下的opencv环境

目录介绍安装VsCode安装mingw安装cmake安装opencv&#xff0c;以及其扩展库 opencv_contrib安装python利用cmake生成opencv的Makefile文件cmake命令进行编译&#xff0c;安装配置opencv环境变量配置VSCODE测试DEMO介绍 参考链接&#xff1a;https://www.cnblogs.com/czlhxm/p/…

教育行业回访话术

近些年来&#xff0c;随着知识经济的快速发展&#xff0c;教育市场呈现良好的增长态势。越来越多的人开始通过参加各种培训来提升自己&#xff0c;教育行业竞争十分激烈。 前言 近些年来&#xff0c;随着知识经济的快速发展&#xff0c;教育市场呈现良好的增长态势。而且由于受…

人力资源软件对中小企业的七点重要性

对于中小企业&#xff08;SMB&#xff09;来说&#xff0c;员工就意味着一切。你的员工几乎掌握着企业的整体增长和发展&#xff0c;他们可以成就企业&#xff0c;但也能破坏企业的发展。为了提高员工效率&#xff0c;中小型企业需要出色的人力资源管理。员工只有在受到重视和培…

被新手忽视的 自谐振频率点

在MHz的DCDC和RF LNA电路中&#xff0c;被新手忽视的 自谐振频率点Self-Resonant Frequency 计算公式为 下图显示了 1μF&#xff0c;封装为 1206 的陶瓷电容器的阻抗&#xff08;MLCC有经典的V型阻抗-频率曲线。随着频率升高&#xff0c;寄生电感的影响开始凸显&#xff0c;阻…

Faster RCNN网络源码解读(Ⅴ) --- GeneralizedRCNNTransform图像初始化代码解析

目录 一、代码作用&#xff08;transform.py&#xff09; ​编辑 二、代码解析 2.1 GeneralizedRCNNTransform类 2.1.1 初始化函数__init__ 2.1.2 normalize标准化处理 2.1.3 将图像以及bndbox进行缩放resize 2.1.4 batch_images 2.1.5 正向传播 forward 2.1.6 后…