MyBatis 注解开发详解

MyBatis 注解开发详解

MyBatis 支持使用注解来进行数据库操作。注解方式将 SQL 语句直接写在 Java 接口中,通过注解来完成 CRUD(增删改查)操作,省去了使用 XML 配置的繁琐步骤。这种方式适合简单项目或快速原型开发,因为它更直观,可以直接在代码中查看和修改 SQL 语句。

然而,在实际开发中,更推荐使用 XML 配置的方式进行 MyBatis 开发。这样做的主要好处是,当需要修改 SQL 语句时,不需要更改 Java 代码,避免频繁修改源代码带来的风险。此外,XML 配置文件的形式更有利于 SQL 语句的管理和维护,尤其是在项目复杂度较高、SQL 语句较多的情况下。

以下是使用注解方式进行 MyBatis 开发的详细说明。


一、使用注解完成 CRUD 操作

1. 配置文件 SqlMapConfig.xml

SqlMapConfig.xml 中注册 Mapper 接口有两种常见方式:

  • 第一种方式:直接引入单个 Mapper 接口类。这种方式适用于小型项目或接口数量较少的情况。
  • 第二种方式:引入整个包下的所有接口。这种方式更为灵活,可以自动扫描指定包中的所有接口,适用于较大项目。
<mappers><!-- 第一种方式:class 引入单个接口 --><mapper class="com.qcby.dao.UserAnnoDao"/><!-- 第二种方式:引入整个包下的所有接口 --><package name="com.qcby.dao"/>
</mappers>
2. UserDao 接口及注解

UserDao 接口中,通过注解实现对数据库的增删改查操作。常用注解包括:

  • @Select:用于查询操作。
  • @Insert:用于插入数据。
  • @Update:用于更新数据。
  • @Delete:用于删除数据。
  • @Results@Result:用于映射查询结果到 Java 对象属性。
import com.qcby.entity.User;
import org.apache.ibatis.annotations.*;import java.util.List;public interface UserDao {// 查询所有用户@Select("SELECT * FROM user")@Results(id = "userMap", value = {@Result(property = "id", column = "id"),@Result(property = "username", column = "username"),@Result(property = "birthday", column = "birthday"),@Result(property = "sex", column = "sex"),@Result(property = "address", column = "address")})List<User> findAll();// 根据 ID 查询用户@Select("SELECT * FROM user WHERE id = #{id}")@ResultMap("userMap")User findById(int id);// 插入新用户@Insert("INSERT INTO user(username, birthday, sex, address) VALUES(#{username}, #{birthday}, #{sex}, #{address})")@SelectKey(statement = "SELECT last_insert_id()", keyProperty = "id", before = false, resultType = Integer.class)int insert(User user);// 更新用户@Update("UPDATE user SET username = #{username}, birthday = #{birthday}, sex = #{sex}, address = #{address} WHERE id = #{id}")int update(User user);// 删除用户@Delete("DELETE FROM user WHERE id = #{id}")int delete(int id);// 查询用户数量@Select("SELECT COUNT(*) FROM user")int findCount();// 模糊查询@Select("SELECT * FROM user WHERE username LIKE #{username}")List<User> findByName(String username);
}
3. UserTest 测试方法

为了验证 UserDao 接口的正确性,可以通过单元测试进行测试。在测试类 UserTest 中,主要步骤包括:

  • 初始化 MyBatis 配置,创建 SqlSession
  • 通过 SqlSession 获取 UserDao 接口的代理对象。
  • 使用代理对象调用接口方法,执行数据库操作。
  • 在测试方法执行前后,分别进行资源的初始化和销毁。
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;public class UserTest {private InputStream in;private SqlSession session;private UserDao mapper;@Beforepublic void init() throws IOException {in = Resources.getResourceAsStream("SqlMapConfig.xml");SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);session = factory.openSession();mapper = session.getMapper(UserDao.class);}@Afterpublic void destroy() throws IOException {session.close();in.close();}@Testpublic void findAll() {List<User> users = mapper.findAll();users.forEach(System.out::println);}@Testpublic void findById() {User user = mapper.findById(4);System.out.println(user);}@Testpublic void insert() {User user = new User();user.setUsername("小美");user.setSex("女");user.setBirthday(new Date());user.setAddress("保定");mapper.insert(user);session.commit();}@Testpublic void update() {User user = new User();user.setId(22);user.setUsername("小美");user.setSex("女");user.setBirthday(new Date());user.setAddress("上海");mapper.update(user);session.commit();}@Testpublic void delete() {mapper.delete(22);session.commit();}@Testpublic void findCount() {int count = mapper.findCount();System.out.println(count);}@Testpublic void findByName() {List<User> users = mapper.findByName("%a%");users.forEach(System.out::println);}
}

二、使用注解完成多对一查询

在多对一的关系中,可以通过注解配置查询结果的映射关系,直接将查询结果映射到关联的 Java 对象中。

1. 多对一立即加载

立即加载的方式在查询主表数据时,会同时加载关联表的数据,适合数据量较小的情况。

StudentDao 接口
@Select("SELECT student.*, teacher.Tname FROM student LEFT JOIN teacher ON student.t_id = teacher.id")
@Results(value = {@Result(property = "id", column = "id"),@Result(property = "Sname", column = "Sname"),@Result(property = "sex", column = "sex"),@Result(property = "age", column = "age"),@Result(property = "t_id", column = "t_id"),@Result(property = "teacher.Tname", column = "Tname")
})
List<Student> getStudent();
2. 多对一延迟加载

延迟加载的方式只有在需要访问关联数据时才会查询关联表的数据,适合数据量较大的情况,可以提高查询性能。

StudentDao 接口
@Select("SELECT * FROM student")
@Results(value = {@Result(property = "id", column = "id"),@Result(property = "Sname", column = "Sname"),@Result(property = "sex", column = "sex"),@Result(property = "age", column = "age"),@Result(property = "teacher", column = "t_id", one = @One(select = "com.qcby.dao.TeacherDao.getTeacher", fetchType = FetchType.LAZY))
})
List<Student> getStudent();
TeacherDao 接口
@Select("SELECT * FROM teacher WHERE id = #{t_id}")
Teacher getTeacher(Integer id);

三、使用注解完成一对多查询

在一对多的关系中,可以通过注解配置关联表的数据映射,直接将关联的数据映射到集合属性中。

TeacherDao 接口
@Select("SELECT * FROM Teacher")
@Results(value = {@Result(property = "id", column = "id"),@Result(property = "Tname", column = "Tname"),@Result(property = "students", column = "id", many = @Many(select = "com.qcby.dao.StudentDao.findByUid", fetchType = FetchType.LAZY))
})
List<Teacher> findAllLazy();
StudentDao 接口
@Select("SELECT * FROM student WHERE t_id = #{t_id}")
Student findByUid(int uid);

总结

MyBatis 注解开发的方式通过将 SQL 语句直接嵌入到 Java 代码中,省去了 XML 配置的繁琐步骤,适合快速开发和简单项目。然而,对于复杂项目,建议使用 XML 配置的方式进行 SQL 语句的管理,以提高代码的可维护性和可扩展性。

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

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

相关文章

第二届国赛铁三wp

第二届国赛 缺东西去我blog找&#x1f447; 第二届长城杯/铁三 | DDLS BLOG web Safe_Proxy 源码题目 from flask import Flask, request, render_template_stringimport socketimport threadingimport htmlapp Flask(__name__)app.route(/, methods"GET"])de…

【深度学习】嘿马深度学习笔记第11篇:卷积神经网络,学习目标【附代码文档】

本教程的知识点为&#xff1a;深度学习介绍 1.1 深度学习与机器学习的区别 TensorFlow介绍 2.4 张量 2.4.1 张量(Tensor) 2.4.1.1 张量的类型 TensorFlow介绍 1.2 神经网络基础 1.2.1 Logistic回归 1.2.1.1 Logistic回归 TensorFlow介绍 总结 每日作业 神经网络与tf.keras 1.3 …

STranslate 中文绿色版即时翻译/ OCR 工具 v1.3.1.120

STranslate 是一款功能强大且用户友好的翻译工具&#xff0c;它支持多种语言的即时翻译&#xff0c;提供丰富的翻译功能和便捷的使用体验。STranslate 特别适合需要频繁进行多语言交流的个人用户、商务人士和翻译工作者。 软件功能 1. 即时翻译&#xff1a; 文本翻译&#xff…

缓存之美:万文详解 Caffeine 实现原理(下)

上篇文章&#xff1a;缓存之美&#xff1a;万文详解 Caffeine 实现原理&#xff08;上&#xff09; getIfPresent 现在我们对 put 方法有了基本了解&#xff0c;现在我们继续深入 getIfPresent 方法&#xff1a; public class TestReadSourceCode {Testpublic void doRead() …

GPT 结束语设计 以nanogpt为例

GPT 结束语设计 以nanogpt为例 目录 GPT 结束语设计 以nanogpt为例 1、简述 2、分词设计 3、结束语断点 1、简述 在手搓gpt的时候&#xff0c;可能会遇到一些性能问题&#xff0c;即关于是否需要全部输出或者怎么节约资源。 在输出语句被max_new_tokens 限制&#xff0c…

HackTheBox靶机:Sightless;NodeJS模板注入漏洞,盲XSS跨站脚本攻击漏洞实战

HackTheBox靶机&#xff1a;Sightless 渗透过程1. 信息收集常规探测深入分析 2. 漏洞利用&#xff08;CVE-2022-0944&#xff09;3. 从Docker中提权4. 信息收集&#xff08;michael用户&#xff09;5. 漏洞利用 Froxlor6. 解密Keepass文件 漏洞分析SQLPad CVE-2022-0944 靶机介…

XML外部实体注入--XML基础

一.XML基础 1.XML 基础概念 定义&#xff1a;XML 即可扩展标记语言&#xff08;Extensible Markup Language&#xff09;&#xff0c;用于标记电子文件&#xff0c;使其具有结构性。它是一种允许用户对自己的标记语言进行定义的源语言&#xff0c;可用来标记数据、定义数据类型…

YOLOv8改进,YOLOv8检测头融合DSConv(动态蛇形卷积),并添加小目标检测层(四头检测),适合目标检测、分割等

精确分割拓扑管状结构例如血管和道路,对各个领域至关重要,可确保下游任务的准确性和效率。然而,许多因素使任务变得复杂,包括细小脆弱的局部结构和复杂多变的全局形态。在这项工作中,注意到管状结构的特殊特征,并利用这一知识来引导 DSCNet 在三个阶段同时增强感知:特征…

Flutter:自定义Tab切换,订单列表页tab,tab吸顶

1、自定义tab切换 view <Widget>[// 好评<Widget>[TDImage(assetUrl: assets/img/order4.png,width: 36.w,height: 36.w,),SizedBox(width: 10.w,),TextWidget.body(好评,size: 24.sp,color: controller.tabIndex 0 ? AppTheme.colorfff : AppTheme.color999,),]…

深度学习笔记——循环神经网络RNN

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍面试过程中可能遇到的循环神经网络RNN知识点。 文章目录 文本特征提取的方法1. 基础方法1.1 词袋模型&#xff08;Bag of Words, BOW&#xff09;工作原…

nvm版本安装

安装 使用切换 MySQL5.7新安装 熟人命令 8.0 mysql -P3306 -uroot -p5.7 mysql -P3307 -uroot -p 记得用完关闭

人工智能之深度学习_[4]-神经网络入门

文章目录 神经网络基础1 神经网络1.1 神经网络概念1.1.1 什么是神经网络1.1.2 如何构建神经网络1.1.3 神经网络内部状态值和激活值 1.2 激活函数1.2.1 网络非线性因素理解1.2.2 常见激活函数1.2.2.1 Sigmoid 激活函数1.2.2.2 Tanh 激活函数1.2.2.3 ReLU 激活函数1.2.2.4 SoftMa…

一文大白话讲清楚webpack基本使用——11——chunkIds和runtimeChunk

文章目录 一文大白话讲清楚webpack基本使用——11——chunkIds和runtimeChunk1. 建议按文章顺序从头看&#xff0c;一看到底&#xff0c;豁然开朗2. 啥是chunkIds3.怎么使用chunkIds4. 啥是runtimeChunk5. 怎么使用runtimeChunk 一文大白话讲清楚webpack基本使用——11——chun…

第11篇:vue3 中 props 的使用

第一步&#xff1a;App.vue 中发送数据&#xff1a; <template> <Person :list"persons"/> //注意多个的话 中间是没有 , // <Person a "哈哈中" :list persons /> </template> let persons reactive([ {id:e98219e12,n…

【Tool】沉浸式翻译 DeepLX

效果对比 对比一下四个常用的翻译工具的效果 不难看出只有Deepl算是在讲人话 如何配置 DeepLX 安装沉浸式翻译插件 获取APIKEY 从这获取: https://linux.do/t/topic/111737 配置 参考官方教程: https://linux.do/t/topic/111911

SSM开发(二) MyBatis简介

目录 一、MyBatis是什么 二、mybatis的优点 三、mybatis的缺点 四、mybatis与JDBC、jdbctemplate对比 1、JDBC 2、 MyBatis 3、 JdbcTemplate 五、mybatis工作原理 一、MyBatis是什么 mybatis是一个简化和实现了java数据持久层的开源框架&#xff0c;它抽象了大量的JDB…

LabVIEW 水电站厂内经济运行系统

基于 LabVIEW 的水电站经济运行系统&#xff0c;主要针对农村小水电站运行管理的不足进行改进&#xff0c;通过精确控制发电与用水量&#xff0c;最小化耗水量并优化负荷分配&#xff0c;提升水电站的运营效率和经济效益。 ​ LabVIEW 在系统中的功能特点 强大的图形化编程环…

重学SpringBoot3-WebClient配置与使用详解

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞??收藏评论 重学SpringBoot3-WebClient配置与使用详解 1. 简介2. 环境准备 2.1 依赖配置 3. WebClient配置 3.1 基础配置3.2 高级配置3.3 retrieve()和exchange()区别 4. 使用示例 4.1 基本请求操…

鸿蒙仓颉环境配置(仓颉SDK下载,仓颉VsCode开发环境配置,仓颉DevEco开发环境配置)

目录 ​1&#xff09;仓颉的SDK下载 1--进入仓颉的官网 2--点击图片中的下载按钮 3--在新跳转的页面点击即刻下载 4--下载 5--找到你们自己下载好的地方 6--解压软件 2&#xff09;仓颉编程环境配置 1--找到自己的根目录 2--进入命令行窗口 3--输入 envsetup.bat 4--验证是否安…

【AI编辑器】字节跳动推出AI IDE——Trae,专为中文开发者深度定制

目录 一、背景 二、核心特性 2.1 AI驱动的代码自动生成 2.2 智能问答与代码补全 2.3 多语言支持 2.4 插件与扩展 三、架构 四、下载使用 4.1 下载与安装 4.2 界面与配置 五、应用实践 5.1 快速生成代码 5.2 智能问答与调试 5.3 团队协作与代码审查 六、与Cursor…