Mybatis-Plus极大简化了我们的开发,作为mybatis的增强版,Mybatis-Plus确实帮我们减少了很多SQL语句的编写,通过其提供的API,可以方便地完成增删查改操作。但是,其实除了Mybatis-Plus以外,还有一个技术tk-mybatis可以达到同样的效果,只不过随着MP的兴起,tk-mybatis已经渐渐被淡忘,就像曾经的JSP+Servlet。
为了证明tk-mybatis曾经存在过,这篇文章就详细介绍一下tk-mybatis的使用方法。
目录
第一步:准备数据
创建数据库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案例项目https://gitee.com/muyu-chengfeng/springboot-tkmybatis.git