springboot整合tk-mybatis、PageHelper

Mybatis-Plus极大简化了我们的开发,作为mybatis的增强版,Mybatis-Plus确实帮我们减少了很多SQL语句的编写,通过其提供的API,可以方便地完成增删查改操作。但是,其实除了Mybatis-Plus以外,还有一个技术tk-mybatis可以达到同样的效果,只不过随着MP的兴起,tk-mybatis已经渐渐被淡忘,就像曾经的JSP+Servlet。

为了证明tk-mybatis曾经存在过,这篇文章就详细介绍一下tk-mybatis的使用方法。


目录

第一步:准备数据

第二步:创建项目

第三步:添加依赖

第四步:修改配置

第五步:创建数据库实体类

第六步:创建持久层的接口

第七步:使用tk-mybatis的API

第八步、整合PageHelper分页查询

1、添加PageHelper依赖

2、设置分页拦截器

3、在所有代码之前开启分页


第一步:准备数据

创建数据库tkmybatis,在tkmybatis数据库下执行以下SQL脚本。

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
 
-- ----------------------------
-- Table structure for song
-- ----------------------------
DROP TABLE IF EXISTS `song`;
CREATE TABLE `song`  (
  `id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '歌曲编号',
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '歌曲名',
  `singer` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '歌手',
  `note` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '歌曲信息',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '歌曲表' ROW_FORMAT = Dynamic;
 
-- ----------------------------
-- Records of song
-- ----------------------------
INSERT INTO `song` VALUES ('20210522153649', '贩卖日落', '蓝心羽', '');
INSERT INTO `song` VALUES ('20210522153812', '宠坏', '李俊佑、潘柚彤', '');
INSERT INTO `song` VALUES ('20210522153941', '爱的魔法', '金莎', '');
INSERT INTO `song` VALUES ('20210522154139', '多肉少女', '赵芷彤Cassie', '');
INSERT INTO `song` VALUES ('20210522154331', '爱一点', '王力宏、章子怡', '');
INSERT INTO `song` VALUES ('20210522154653', '换世奇恋', '排骨教主', '《画江湖之换世门生 原声带》');
INSERT INTO `song` VALUES ('20210522154751', '镜心之歌', '邵夷贝', '');
INSERT INTO `song` VALUES ('20210522154945', '诺言', '陈洁丽', '《百变机兽之洛洛历险记》动画ED');
INSERT INTO `song` VALUES ('20210522155118', '无别', '张信哲', '《天官赐福》动画OP');
INSERT INTO `song` VALUES ('20210522155349', '快乐星猫', '牛奶咖啡', '《快乐星猫》动画主题曲');
INSERT INTO `song` VALUES ('20210522160205', '起风了', '周深', '');
INSERT INTO `song` VALUES ('20210522161509', '星辰觉醒', '屠化冰', '');
INSERT INTO `song` VALUES ('20210522184153', '可不可以撩', '曹懵萌', '');
INSERT INTO `song` VALUES ('20210522184207', '心动的感觉', '醋醋', '');
INSERT INTO `song` VALUES ('20210522184449', '百花香', '魏新雨', '');
INSERT INTO `song` VALUES ('20210522184618', '陨落', '不是花火呀', '');
INSERT INTO `song` VALUES ('20210522185212', '花开半夏', '爱朵女孩', '');
INSERT INTO `song` VALUES ('20210522190138', '白月光', '张信哲', '');
INSERT INTO `song` VALUES ('20210522191452', '小幸运', '田馥甄', '');
INSERT INTO `song` VALUES ('20210522192302', '大天蓬', '李袁杰', '');
INSERT INTO `song` VALUES ('20210522192641', '飞鸟和蝉', '任然', '');
INSERT INTO `song` VALUES ('20210522193453', '爱,存在', '你的好上好佳', '');
INSERT INTO `song` VALUES ('20210525233923', '喜欢你', '邓紫棋', '');
INSERT INTO `song` VALUES ('20210525233936', '勇气', '梁静茹', '');
INSERT INTO `song` VALUES ('20210530193908', '一爱难求', '徐佳莹', '《扶摇》电视剧主题曲');
INSERT INTO `song` VALUES ('20210530194109', '桃花诺', '邓紫棋', '《上古情歌》电视剧主题曲');
INSERT INTO `song` VALUES ('20210530194410', '枕上书', '董贞', '《三生三世枕上书》网络剧主题曲');
INSERT INTO `song` VALUES ('20210530194546', '千年', '金志文、吉克隽逸', '《天乩之白蛇传说》网络剧插曲');
INSERT INTO `song` VALUES ('20210530194901', '古画', '鞠婧祎', '《如意芳霏》电视剧插曲');
INSERT INTO `song` VALUES ('20210530211557', '魔法城堡', 'TFBOYS', '');
INSERT INTO `song` VALUES ('20210601181447', '最美的期待', '周笔畅', '');
INSERT INTO `song` VALUES ('20210601195425', '晴天', '周杰伦', '');
INSERT INTO `song` VALUES ('20210601195830', '稻香', '周杰伦', '');
INSERT INTO `song` VALUES ('20210601195838', '七里香', '周杰伦', '');
INSERT INTO `song` VALUES ('20210601195852', '告白气球', '周杰伦', '');
INSERT INTO `song` VALUES ('20210601195903', '听妈妈的话', '周杰伦', '');
INSERT INTO `song` VALUES ('20210601195918', '青花瓷', '周杰伦', '');
INSERT INTO `song` VALUES ('20210601195931', '给我一首歌的时间', '周杰伦', '');
INSERT INTO `song` VALUES ('20210601195941', '明明就', '周杰伦', '');
INSERT INTO `song` VALUES ('20210601200013', '搁浅', '周杰伦', '');
INSERT INTO `song` VALUES ('20210601200019', '珊瑚海', '周杰伦、Lara梁心颐', '《十一月的萧郎》');
INSERT INTO `song` VALUES ('20210601200042', '兰亭序', '周杰伦', '');
INSERT INTO `song` VALUES ('20210601200111', '说好的幸福呢', '周杰伦', '');
INSERT INTO `song` VALUES ('20210601200116', '发如雪', '周杰伦', '');
INSERT INTO `song` VALUES ('20210601200212', '烟花易冷', '周杰伦', '');
INSERT INTO `song` VALUES ('20210601200231', '简单爱', '周杰伦', '');
INSERT INTO `song` VALUES ('20210601200243', '美人鱼', '林俊杰', '《第二天堂》');
INSERT INTO `song` VALUES ('20210601200304', '东风破', '周杰伦', '');
INSERT INTO `song` VALUES ('20210601200312', '安静', '周杰伦', '');
INSERT INTO `song` VALUES ('20210601200328', '爱在西元前', '周杰伦', '');
INSERT INTO `song` VALUES ('20210601200342', '龙卷风', '周杰伦', '');
INSERT INTO `song` VALUES ('20210601200353', '甜甜的', '周杰伦', '');
INSERT INTO `song` VALUES ('20210601200407', '千里之外', '周杰伦、费玉清 ', '');
INSERT INTO `song` VALUES ('20210601200429', '菊花台', '周杰伦', '');
INSERT INTO `song` VALUES ('20210601200455', '蜗牛', '周杰伦', '');
INSERT INTO `song` VALUES ('20210601200823', '可惜没如果', '林俊杰', '');
INSERT INTO `song` VALUES ('20210601200842', '修炼爱情', '林俊杰', '');
INSERT INTO `song` VALUES ('20210601200912', 'Always Online', '林俊杰', '');
INSERT INTO `song` VALUES ('20210601201433', '等一分钟', '徐誉滕', '');
INSERT INTO `song` VALUES ('20210601201449', '醉赤壁', '林俊杰', '');
INSERT INTO `song` VALUES ('20210601201613', '背对背拥抱', '林俊杰', '《爱情睡醒了》电视剧插曲');
INSERT INTO `song` VALUES ('20210601201651', '她说', '林俊杰', '');
INSERT INTO `song` VALUES ('20210601201714', '不潮不用花钱', '林俊杰', '');
INSERT INTO `song` VALUES ('20210601201726', '一千年以后', '林俊杰', '');
INSERT INTO `song` VALUES ('20210601201742', '爱不会绝迹', '林俊杰', '');
INSERT INTO `song` VALUES ('20210601201752', '曹操', '林俊杰', '');
INSERT INTO `song` VALUES ('20210601201819', '江南', '林俊杰', '');
INSERT INTO `song` VALUES ('20210601201902', '小酒窝', '蔡卓妍、林俊杰', '');
INSERT INTO `song` VALUES ('20210601201920', '爱要怎么说出口', '林俊杰', '');
INSERT INTO `song` VALUES ('20210601202232', '匆匆那年', '王菲', '');
INSERT INTO `song` VALUES ('20210601202251', '泡沫', '邓紫棋', '');
INSERT INTO `song` VALUES ('20210601202445', '爱丫爱丫', 'By2', '《爱情是从告白开始的》电视剧原声带');
INSERT INTO `song` VALUES ('20210601202557', '玫瑰花的葬礼', '许嵩', '');
INSERT INTO `song` VALUES ('20210601202625', '断桥残雪', '许嵩', '');
INSERT INTO `song` VALUES ('20210601202637', '庐州月', '许嵩', '');
INSERT INTO `song` VALUES ('20210601202653', '清明雨上', '许嵩', '');
INSERT INTO `song` VALUES ('20210601202659', '素颜', '许嵩', '');
INSERT INTO `song` VALUES ('20210601202712', '城府', '许嵩', '');
INSERT INTO `song` VALUES ('20210601202728', '幻听', '许嵩', '');
INSERT INTO `song` VALUES ('20210601202740', '你若成风', '许嵩', '');
INSERT INTO `song` VALUES ('20210601202751', '千百度', '许嵩', '');
INSERT INTO `song` VALUES ('20210601202808', '天龙八部之宿敌', '许嵩', '');
INSERT INTO `song` VALUES ('20210601202846', '燕归巢', '张靓颖、张杰', '');
INSERT INTO `song` VALUES ('20210601202900', '全球变冷', '许嵩', '');
INSERT INTO `song` VALUES ('20210601202912', '山水之间', '许嵩', '');
INSERT INTO `song` VALUES ('20210601203051', '破茧', '张韶涵', '《斗罗大陆》动画第107集ED');
INSERT INTO `song` VALUES ('20210601203136', '不舍', '徐佳莹', '《斗罗大陆》动画插曲');
INSERT INTO `song` VALUES ('20210601203307', '此时此刻与你', '大酥', '《妖怪名单 第二季》主题曲');
INSERT INTO `song` VALUES ('20210601203343', '光与信仰', '血纯茗雅', '《妖怪名单 第一季》动画OP');
INSERT INTO `song` VALUES ('20210601203422', '破茧而出的光芒', '血纯茗雅', '《妖怪名单 第一季》动画ED');
INSERT INTO `song` VALUES ('20210601203443', '爱在身边', 'MOMOKO', '《妖怪名单》');
INSERT INTO `song` VALUES ('20210601203530', '红', '任然', '《妖怪名单之苏九儿》电影主题曲');
INSERT INTO `song` VALUES ('20210601203815', '思无邪', '阿敏', '《妖怪名单之苏九儿》电影土·宣传曲');
INSERT INTO `song` VALUES ('20210601204033', '有你的未来', 'MOMOKO', '《妖怪名单》');
INSERT INTO `song` VALUES ('20210601204118', '沉香', '王贰浪', '《妖怪名单之苏九儿》电影宣传曲');
INSERT INTO `song` VALUES ('20210601204140', '星落', '周思涵', '《妖怪名单之苏九儿》电影宣传曲');
INSERT INTO `song` VALUES ('20210601204217', '酒醉三巡', '尹熙水', '《妖怪名单之苏九儿》电影木·宣传曲');
INSERT INTO `song` VALUES ('20210601204321', '悲别', '王贰浪', '《妖怪名单之苏九儿》电影概念宣传曲');
INSERT INTO `song` VALUES ('20210601204418', '她的故事', '毛若琼', '《妖怪名单之苏九儿》电影合欢人物主题曲');
INSERT INTO `song` VALUES ('20210601204503', '轮回 ·他', '邓鼓', '《妖怪名单之苏九儿》电影封无夜人物主题曲');
INSERT INTO `song` VALUES ('20210601204532', '毒药', 'Mars毒药', '《妖怪名单之苏九儿》电影妖王人物主题曲');
INSERT INTO `song` VALUES ('20210601204817', '等', '毛若琼', '《妖怪名单之苏九儿》电影苏九儿人物主题曲');
INSERT INTO `song` VALUES ('20210601204949', '长恨歌', '王瑞淇', '《妖怪名单之苏九儿》电影召唤曲');
INSERT INTO `song` VALUES ('20210601205025', '河童', '王金金', '《妖怪名单之苏九儿》电影金·宣传曲');
INSERT INTO `song` VALUES ('20210601205214', '幼安', '阿敏', '《妖怪名单之苏九儿》电影概念先行曲');
INSERT INTO `song` VALUES ('20210601205256', '远行', '张迁', '《妖怪名单 第二季》动画ED');
INSERT INTO `song` VALUES ('20210601205521', '不败的英雄', '唐俊迪', '《铠甲勇士刑天》电视剧主题曲');
INSERT INTO `song` VALUES ('20210601205925', '光的战士', '陈致逸', '《铠甲勇士》电视剧第52集插曲');
INSERT INTO `song` VALUES ('20210601205953', '穿越曙光', '唐丹', '《铠甲勇士刑天》电视剧片尾曲');
INSERT INTO `song` VALUES ('20210601210159', '生生世世爱', '吴雨霏', '《仙剑奇侠传3》电视剧片尾曲');
INSERT INTO `song` VALUES ('20210601210221', '忘记时间', '胡歌', '《仙剑奇侠传3》电视剧片尾曲');
INSERT INTO `song` VALUES ('20210601210243', '偏爱', '张芸京', '《仙剑奇侠传3》电视剧插曲');
INSERT INTO `song` VALUES ('20210601210312', '六月的雨', '胡歌', '《仙剑奇侠传》电视剧插曲');
INSERT INTO `song` VALUES ('20210601210351', '一直很安静', '阿桑', '《仙剑奇侠传》电视剧插曲');
INSERT INTO `song` VALUES ('20210601210448', '终于明白', '动力火车', '《仙剑奇侠传》电视剧片尾曲');
INSERT INTO `song` VALUES ('20210601210603', '仙剑问情', '萧人凤', '《仙剑奇侠传3外传·问情篇》游戏主题曲');
INSERT INTO `song` VALUES ('20210601210626', '花与剑', 'JS', '《仙剑奇侠传》电视剧插曲');
INSERT INTO `song` VALUES ('20210601210727', '千年缘', '心然', '《仙剑奇侠传4》游戏非官方同人曲');
INSERT INTO `song` VALUES ('20210601210758', '千年泪', '董贞', '');
INSERT INTO `song` VALUES ('20210601210846', '情醉', '董贞、盛威', '');
INSERT INTO `song` VALUES ('20210601211014', '繁花', '董真', '《三生三世十里桃花》电视剧原声带');
INSERT INTO `song` VALUES ('20210601211100', '流恋', '吴奇隆、严艺丹', '《新白发魔女传》电视剧片尾曲');
INSERT INTO `song` VALUES ('20210601211306', '梦回还', '呦猫UNEKO', '《狐妖小红娘 王权篇》动画OP');
INSERT INTO `song` VALUES ('20210601211409', '若当来世', '冥月、Mario', '《狐妖小红娘 月红篇》动画主题曲');
INSERT INTO `song` VALUES ('20210601211619', '人间白首', '呦猫UNEKO', '《狐妖小红娘 竹业篇》动画插曲');
INSERT INTO `song` VALUES ('20210601211706', '落空', '落萱', '《狐妖小红娘 金晨曦篇》动画OP');
INSERT INTO `song` VALUES ('20210601211802', '此彼绘卷', '林和夜', '《狐妖小红娘王权篇》动画第20、27集插曲');
INSERT INTO `song` VALUES ('20210601211835', '铭记', '呦猫UNEKO', '《狐妖小红娘 千颜篇》动画OP');
INSERT INTO `song` VALUES ('20210601211942', '东流', '绯村柯北、灰老板', '《狐妖小红娘 下沙篇》动画ED');
INSERT INTO `song` VALUES ('20210601212221', '金色', 'Kinoko蘑菇', '《狐妖小红娘 沐天城篇》动画OP');
INSERT INTO `song` VALUES ('20210601212308', '满庭芳', 'Mr.mo', '《狐妖小红娘 竹业篇》动画OP');
INSERT INTO `song` VALUES ('20210601212338', '愿我', '呦猫UNEKO', '《狐妖小红娘 南国篇》动画插曲');
INSERT INTO `song` VALUES ('20210601212429', '我还记得', 'Shymie', '《狐妖小红娘 尾生篇》动画OP');
INSERT INTO `song` VALUES ('20210601212522', '铃舟', '匀子', '《狐妖小红娘 月红篇》动画第16集插曲');
INSERT INTO `song` VALUES ('20210601212551', '寄', 'JMJ', '《狐妖小红娘 竹业篇》动画ED');
INSERT INTO `song` VALUES ('20210601212655', '相聚万年树', '林和夜', '《狐妖小红娘 下沙篇》动画第6集插曲');
INSERT INTO `song` VALUES ('20210601212808', '相思树下', 'YNJ谢悦', '《狐妖小红娘》动画主题曲');
INSERT INTO `song` VALUES ('20210601213110', '万水依山', '叫ぶ獣', '《狐妖小红娘 月红篇》动画主题曲');
INSERT INTO `song` VALUES ('20210601213214', '下沙', '桂子油', '《狐妖小红娘 下沙篇》动画插曲');
INSERT INTO `song` VALUES ('20210601213316', '不易不移', 'Kinoko蘑菇', '《狐妖小红娘 金晨曦篇》动画ED');
INSERT INTO `song` VALUES ('20210601213446', '雪年轮', '苏尚卿', '《狐妖小红娘 千颜篇》动画第62集插曲');
INSERT INTO `song` VALUES ('20210601213520', '君路', '大酥', '《狐妖小红娘 北山妖帝篇》动画ED');
INSERT INTO `song` VALUES ('20210601213602', '岩心', '大帝', '《狐妖小红娘 月红篇》动画第46集插曲');
INSERT INTO `song` VALUES ('20210601213716', '未断', '陈爽朗、王志毅', '《狐妖小红娘 沐天城篇》动画ED');
INSERT INTO `song` VALUES ('20210601213829', '时之风', '方晓东', '《狐妖小红娘 尾生篇》动画概念主题曲');
INSERT INTO `song` VALUES ('20210601213923', '不忘', '张恋歌', '《狐妖小红娘 北山妖帝篇》动画第45集插曲');
INSERT INTO `song` VALUES ('20210601214021', '围城', 'Kinoko蘑菇、Mr.mo', '《狐妖小红娘 南国篇》动画插曲');
INSERT INTO `song` VALUES ('20210601214105', '盘根', '白止', '《狐妖小红娘 千颜篇》动画插曲');
INSERT INTO `song` VALUES ('20210601214150', '竹亭', '南偿', '《狐妖小红娘 竹业篇》动画插曲');
INSERT INTO `song` VALUES ('20210601214317', '瞳染', '蓮莉', '《狐妖小红娘 砂雪篇》动画OP');
INSERT INTO `song` VALUES ('20210601214424', '绝处风雪', '无问、D.rui、池年', '《狐妖小红娘 月红篇》动画插曲');
INSERT INTO `song` VALUES ('20210601214549', '刻印', '朱梓溶', '《狐妖小红娘 千颜篇》动画ED');
INSERT INTO `song` VALUES ('20210601214630', '雁归辞', '依平、无欢', '《狐妖小红娘》动画插曲');
INSERT INTO `song` VALUES ('20210601214724', '不醉', '余七趁', '《狐妖小红娘》动画插曲');
INSERT INTO `song` VALUES ('20210601214949', '思如雪', '董贞', '《画江湖之不良人3》动画第21集插曲');
INSERT INTO `song` VALUES ('20210601215118', '爱你让我像孩子一样', '俞灏明', '《因为爱情有奇迹》电视剧片尾曲');
INSERT INTO `song` VALUES ('20210601215206', '忐忑的距离', '萌学园', '《萌学园4 时空战役》电视剧片尾曲');
INSERT INTO `song` VALUES ('20210601215336', '月光', '胡彦斌', '《秦时明月·百步飞剑》动画主题曲');
INSERT INTO `song` VALUES ('20210601215451', '枫林残忆', '伍华、余文靖', '');
INSERT INTO `song` VALUES ('20210602181846', '远方', '郁可唯', '《古剑奇谭》电视剧片尾曲');
INSERT INTO `song` VALUES ('20210602181910', '剑心', '张杰', '《古剑奇谭》电视剧插曲');
INSERT INTO `song` VALUES ('20210602181950', '剑伤', '李易峰', '《古剑奇谭》电视剧插曲');
INSERT INTO `song` VALUES ('20210602182019', '恋人歌歌', '胡彦斌', '');
INSERT INTO `song` VALUES ('20210602182119', '爱你没错', '张信哲', '');
INSERT INTO `song` VALUES ('20210602182633', '双骄', '金志文', '《绝代双骄 2020版》电视剧主题曲');
INSERT INTO `song` VALUES ('20210602182658', '拆心', '刘惜君', '《绝代双骄 2020版》电视剧片尾曲');
INSERT INTO `song` VALUES ('20210602182822', '红尘不悔', '陆虎', '《绝代双骄 2020版》电视剧插曲');
INSERT INTO `song` VALUES ('20210602183035', '翅膀', '林俊杰', '');
INSERT INTO `song` VALUES ('20210602183228', '独白', '周深', '《天乩之白蛇传说》网络剧插曲');
INSERT INTO `song` VALUES ('20210602183255', '幸福在梦中', '赵艺', '《大话西游之爱你一万年》网络剧紫霞仙子角色曲');
INSERT INTO `song` VALUES ('20210602183412', '凉凉', '杨宗纬、张碧晨', '《三生三世十里桃花》电视剧插曲');
INSERT INTO `song` VALUES ('20210602183449', '爱河', '神马乐园', '');
INSERT INTO `song` VALUES ('20210602183752', '为爱追寻', '朱倩汐JING', '《梦幻西游2》游戏主题曲');
INSERT INTO `song` VALUES ('20210602183831', '恋西游', 'TFBOYS', '《梦幻西游2:化境飞升》动画主题曲');
INSERT INTO `song` VALUES ('20210602183910', '入梦', 'SNH48', '《梦幻西游3:雷怒危机》动画主题曲');
INSERT INTO `song` VALUES ('20210606174210', '留香', '吴奇隆', '《新白发魔女传》电视剧片尾曲');
INSERT INTO `song` VALUES ('20210606174229', '无常', '吴奇隆', '《新白发魔女传》电视剧插曲');
INSERT INTO `song` VALUES ('20210606174317', '无·果', '严艺丹', '《新白发魔女传》电视剧插曲');
INSERT INTO `song` VALUES ('20210606175139', '十年', '陈奕迅', '');
INSERT INTO `song` VALUES ('20210606175219', '十一年', '邱永传', '');

第二步:创建项目

在IntelliJ IDEA中创建一个springboot项目springboot-tkmybatis

第三步:添加依赖

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

项目完整的依赖如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.9</version>
        <relativePath/>
    </parent>

    <groupId>cn.edu.sgu.www</groupId>
    <artifactId>springboot-tkmybatis</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-tkmybatis</name>
    <description>Spring Boot整合tk-mybatis案例项目</description>

    <properties>
        <java.version>1.8</java.version>
        <mysql.version>8.0.28</mysql.version>
        <druid.version>1.1.21</druid.version>
        <lombok.version>1.18.22</lombok.version>
        <mybatis.version>2.2.2</mybatis.version>
        <tkmybatis.version>1.1.5</tkmybatis.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
        </dependency>

        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>

        <!--数据库连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>${druid.version}</version>
        </dependency>

        <!--mybatis-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>${mybatis.version}</version>
        </dependency>

        <!--tk.mybatis-->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
            <version>${tkmybatis.version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

第四步:修改配置

将配置文件application.properties重命名为application.yml,修改配置文件的内容。

spring:
  datasource:
    username: root
    password: root
    url: jdbc:mysql://localhost:3306/tkmybatis
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource

logging:
  level:
    springfox: error
    cn.edu.sgu.www.tkmybatis: debug

第五步:创建数据库实体类

在项目根包下创建entity.Song类

package cn.edu.sgu.www.tkmybatis.entity;

import lombok.Data;

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

/**
 * @author heyunlin
 * @version 1.0
 */
@Data
public class Song implements Serializable {
    private static final long serialVersionUID = 18L;

    @Id
    private String id;

    /**
     * 歌曲名
     */
    private String name;

    /**
     * 歌曲信息
     */
    private String note;

    /**
     * 歌手
     */
    private String singer;
}

第六步:创建持久层的接口

在项目根包下创建mapper.SongMapper接口,并继承tkmybatis的Mapper接口。

package cn.edu.sgu.www.tkmybatis.mapper;

import cn.edu.sgu.www.tkmybatis.entity.Song;
import org.springframework.stereotype.Repository;
import tk.mybatis.mapper.common.Mapper;

/**
 * @author heyunlin
 * @version 1.0
 */
@Repository
public interface SongMapper extends Mapper<Song> {
    
}

 

在这点上,其实和mybatis-plus很像,mybatis-plus里是继承BaseMapper<T>接口,然后使用BaseMapper<T>接口中预定义实现的简单crud方法。

但是,tk-mybatis的各个API在继承关系上又和mybatis-plus完全不同,tk-mybatis中,一个接口中只定义一个方法(把接口隔离原则体现的淋漓尽致ovo)。

package tk.mybatis.mapper.common;

public interface Mapper<T> extends
        BaseMapper<T>,
        ExampleMapper<T>,
        RowBoundsMapper<T>,
        Marker {

}

可以发现,Mapper接口继承了很多个接口BaseMapper、ExampleMapper和RowBoundsMapper,而BaseMapper又继承了基本的增删查改的Mapper接口BaseSelectMapper、BaseInsertMapper、BaseUpdateMapper和BaseDeleteMapper。

这几个接口又继承了相应的插入、删除、更新或查询的接口,每个接口中只定义一个方法

BaseMapper.java

package tk.mybatis.mapper.common;

import tk.mybatis.mapper.common.base.BaseDeleteMapper;
import tk.mybatis.mapper.common.base.BaseInsertMapper;
import tk.mybatis.mapper.common.base.BaseSelectMapper;
import tk.mybatis.mapper.common.base.BaseUpdateMapper;

public interface BaseMapper<T> extends
        BaseSelectMapper<T>,
        BaseInsertMapper<T>,
        BaseUpdateMapper<T>,
        BaseDeleteMapper<T> {

}

BaseSelectMapper.java

package tk.mybatis.mapper.common.base;

import tk.mybatis.mapper.common.base.select.*;

public interface BaseSelectMapper<T> extends
        SelectOneMapper<T>,
        SelectMapper<T>,
        SelectAllMapper<T>,
        SelectCountMapper<T>,
        SelectByPrimaryKeyMapper<T>,
        ExistsWithPrimaryKeyMapper<T> {

}

第七步:使用tk-mybatis的API

tk-mybatis中两个重要的API相关说明:

  • tk.mybatis.mapper.entity.Example
  • tk.mybatis.mapper.entity.Example.Criteria

1、创建Example对象

2、通过Example的静态方法createCriteria()获取Criteria对象

接下来通过测试类测试tkmybatis的API方法

package cn.edu.sgu.www.tkmybatis;

import cn.edu.sgu.www.tkmybatis.entity.Song;
import cn.edu.sgu.www.tkmybatis.mapper.SongMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import tk.mybatis.mapper.entity.Example;

import java.util.List;

/**
 * @author heyunlin
 * @version 1.0
 */
@SpringBootTest
class SpringbootTkmybatisTests {

    @Autowired
    private SongMapper songMapper;

    @Test
    void testInsert() {
        Song song = new Song();

        song.setId("123");
        song.setName("稻香");
        song.setSinger("周杰伦");

        // 添加
        songMapper.insert(song);
        // 选择性添加
        // 拼接sql语句时会在每个字段设置前添加null判断,只有不为null才设置到values子句
        songMapper.insertSelective(song);
    }

    @Test
    void testUpdate() {
        Song song = new Song();

        song.setId("123");
        song.setName("稻香");
        song.setSinger("周杰伦");

        // 通过主键修改
        songMapper.updateByPrimaryKey(song);
        // 通过主键选择性修改,只有不为null才设置到set子句
        songMapper.updateByPrimaryKeySelective(song);
    }

    @Test
    void testUpdateByExample() {
        Song song = new Song();

        song.setId("123");
        song.setName("稻香");
        song.setSinger("周杰伦");

        Example example = new Example(Song.class);
        Example.Criteria criteria = example.createCriteria();

        criteria.andCondition("name = ", song.getName());

        // 通过Example中设置的条件修改
        songMapper.updateByExample(song, example);
        // 通过Example中设置的条件选择性地修改
        songMapper.updateByExampleSelective(song, example);
    }

    @Test
    void testSelect() {
        Song song = new Song();

        song.setName("稻香");
        song.setSinger("周杰伦");

        // 根据song中设置字段作为条件查询条件
        List<Song> select = songMapper.select(song);
        // 根据主键查询(也就是@Id注解标注的字段)
        Song selectByPrimaryKey = songMapper.selectByPrimaryKey("123");
        // 查询全部
        List<Song> selectAll = songMapper.selectAll();
        // 同select()方法,当能够确定查询结果中最多只有一条记录时可以使用此方法
        Song selectOne = songMapper.selectOne(song);
        // 根据song中设置字段作为条件查询条件,返回符合条件的记录数
        int selectCount = songMapper.selectCount(song);
    }

    @Test
    void testSelectByExample() {
        Example example = new Example(Song.class);
        Example.Criteria criteria = example.createCriteria();

        criteria.andCondition("name = ", "稻香");
        criteria.andCondition("singer = ", "周杰伦");

        List<Song> list = songMapper.selectByExample(example);
        int count = songMapper.selectCountByExample(example);
    }

}

第八步、整合PageHelper分页查询

和mybatis-plus不同,tk-mybatis并没有帮我们实现分页功能,需要整合PageHelper来实现分页查询。

1、添加PageHelper依赖

<!-- 分页插件 -->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.1.4</version>
</dependency>

2、设置分页拦截器

package cn.edu.sgu.www.tkmybatis.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.github.pagehelper.PageInterceptor;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;
import java.util.Properties;

/**
 * @author heyunlin
 * @version 1.0
 */
@Configuration
@MapperScan(basePackages = "cn.edu.sgu.www.tkmybatis.mapper")
public class MybatisConfig {

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource dataSource() {
        return DataSourceBuilder.create().type(DruidDataSource.class).build();
    }

    @Bean
    public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource) {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();

        // 设置数据源
        sqlSessionFactoryBean.setDataSource(dataSource);
        Properties properties = new Properties();

        properties.setProperty("reasonable", "true");
        properties.setProperty("pageSizeZero", "true");
        properties.setProperty("supportMethodsArguments", "true");

        // 创建分页拦截器
        PageInterceptor interceptor = new PageInterceptor();

        interceptor.setProperties(properties);

        // 添加分页拦截器
        sqlSessionFactoryBean.setPlugins(interceptor);

        return sqlSessionFactoryBean;
    }

}

3、在所有代码之前开启分页

在所有代码之前添加PageHelper.startPage(int page, int size)方法开启分页。例如:

package cn.edu.sgu.www.tkmybatis;

import cn.edu.sgu.www.tkmybatis.entity.Song;
import cn.edu.sgu.www.tkmybatis.mapper.SongMapper;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import tk.mybatis.mapper.entity.Example;

import java.util.List;

/**
 * @author heyunlin
 * @version 1.0
 */
@SpringBootTest
class SpringbootTkmybatisTests {

    @Autowired
    private SongMapper songMapper;

    @Test
    void testInsert() {
        Song song = new Song();

        song.setId("123");
        song.setName("稻香");
        song.setSinger("周杰伦");

        // 添加
        songMapper.insert(song);
        // 选择性添加
        // 拼接sql语句时会在每个字段设置前添加null判断,只有不为null才设置到values子句
        songMapper.insertSelective(song);
    }

    @Test
    void testUpdate() {
        Song song = new Song();

        song.setId("123");
        song.setName("稻香");
        song.setSinger("周杰伦");

        // 通过主键修改
        songMapper.updateByPrimaryKey(song);
        // 通过主键选择性修改,只有不为null才设置到set子句
        songMapper.updateByPrimaryKeySelective(song);
    }

    @Test
    void testUpdateByExample() {
        Song song = new Song();

        song.setId("123");
        song.setName("稻香");
        song.setSinger("周杰伦");

        Example example = new Example(Song.class);
        Example.Criteria criteria = example.createCriteria();

        criteria.andCondition("name = ", song.getName());

        // 通过Example中设置的条件修改
        songMapper.updateByExample(song, example);
        // 通过Example中设置的条件选择性地修改
        songMapper.updateByExampleSelective(song, example);
    }

    @Test
    void testSelect() {
        Song song = new Song();

        song.setName("稻香");
        song.setSinger("周杰伦");

        // 根据song中设置字段作为条件查询条件
        List<Song> select = songMapper.select(song);
        // 根据主键查询(也就是@Id注解标注的字段)
        Song selectByPrimaryKey = songMapper.selectByPrimaryKey("123");
        // 查询全部
        List<Song> selectAll = songMapper.selectAll();
        // 同select()方法,当能够确定查询结果中最多只有一条记录时可以使用此方法
        Song selectOne = songMapper.selectOne(song);
        // 根据song中设置字段作为条件查询条件,返回符合条件的记录数
        int selectCount = songMapper.selectCount(song);
    }

    @Test
    void testSelectByExample() {
        Example example = new Example(Song.class);
        Example.Criteria criteria = example.createCriteria();

        criteria.andCondition("name = ", "稻香");
        criteria.andCondition("singer = ", "周杰伦");

        List<Song> list = songMapper.selectByExample(example);
        int count = songMapper.selectCountByExample(example);
    }

    @Test
    void selectByPage() {
        PageHelper.startPage(1, 5);

        Page<Song> page = songMapper.selectByPage();

        System.out.println(page);
    }

}


好了,文章就分享到这里了,文章设计代码已经上传到git仓库,按需获取

Spring Boot整合tk-mybatis案例项目icon-default.png?t=O83Ahttps://gitee.com/muyu-chengfeng/springboot-tkmybatis.git

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沐雨橙风ιε

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值