【Spring Boot】使用MyBatis注解实现数据库操作

使用MyBatis注解实现数据库操作

MyBatis还提供了注解的方式,相比XML的方式,注解的方式更加简单方便,无须创建XML配置文件。接下来好好研究注解的使用方式。

1.XML和注解的异同

1)注解模式使用简单,开发效率高,但是维护麻烦,修改SQL需要重新编译打包。

2)XML模式便于维护,SQL和代码分开,代码清晰易懂,而使用注解模式需要在方法前加各种注解和SQL语句,使得代码的可读性不强。

3)XML模式虽然提供了完善的标签来实现复杂的SQL语句,但是没有在Java代码中直接判断拼接那样简单方便。

4)XML模式因为SQL是配置在XML文件中的,某些特殊字符需要转义,所以使用起来比较麻烦,容易出错。

2.使用MyBatis注解实现数据查询

MyBatis注解模式的最大特点是取消了Mapper的XML配置,通过@Insert、、@Update、@Select、@Delete等注解将SQL语句定义在Mapper接口方法中或SQLProvider的方法中,从而省去了XML配置文件。这些注解和参数的使用与mapper.xml配置文件基本一致。下面就来演示使用MyBatis注解实现数据查询。

2.1 修改配置文件

首先创建Spring Boot项目,集成MyBatis的过程与XML配置方式一样。

使用注解方式只需要在application.properties中指明实体类的包路径,其他保持不变,配置示例如下:

#mapper.xml mapper接口的包路径
MyBatis.type-aliases-package=com.example.ysxq#数据库连接
spring.datasource.url=jdbc:mysql://Localhost:3306/ceshi?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

在上面的示例中,配置了mapper接口的包路径和数据源,无须配置mapper.xml文件的路径。

2.2 添加mapper接口

使用MyBatis提供的SQL语句注解无须再创建mapper.xml映射文件,创建mapper接口类,然后添加相关的方法即可:

public interface StudentMapper {@Select("select * from student")List<Student> selectAll();
}

在上面的示例中,使用@Select注解定义SQL查询语句即可实现查询所有学生列表的功能,无须再定义mapper.xml映射文件。

2.3 验证测试

增加单元测试方法,验证是否生效。示例代码如下:

@Testpublic void testSelectAll() {// 查询List<Student> students = studentMapper.selectAll();for (Student stu : students) {System.out.println("name:"+stu.getName()+", age:"+stu.getAge());}}

单击Run Test或在方法上右击,选择Run ‘testSelectAll’,查看单元测试结果,运行结果如图所示。

在这里插入图片描述
结果表明单元测试方法testSelectAll运行成功,并输出了相应的查询结果。这说明使用注解成功实现了查询全部学生信息的功能。

3.参数传递

相信很多人会有疑问:MyBatis是如何将参数传递到SQL中的,有哪几种传参方式?下面就来一一介绍MyBatis注解的传参方式。

3.1 直接传参

对于简单的参数,可以直接使用#{id}的方式接收同名的变量参数。示例代码如下:

@Select("SELECT * FROM student where id=#{id,jdbcType=VARCHAR}")
Student selectOne(Long id);

在上面的示例中,使用#{id}传入变量参数,支持传入多个参数。只是需要注意,使用#{}方式定义的参数名必须和方法中的参数名保持一致。

3.2 使用@Param注解

@Param注解的作用是给参数命名,参数命名后就能根据名字匹配到参数值,正确地将参数传入SQL语句中。比如,注解是@Param(“person”),那么参数就会被命名为#{person}。示例代码如下:

@Select("select * from student where name=#{name} and sex=#{sex}")
Student selectByNameAndSex(@Param("name") String name, @Param("sex") Integer sex);

如果方法有多个参数,也可以不自定义param,MyBatis在方法的参数上就能为它们取自定义的名字,参数先以"param"作为前缀,再加上它们的参数位置作为参数别名,比如#{param1}、#{param2}。

// 默认使用param +参数序号或者0、1,值就是参数的值
@Select("select * from student where name=#{param1} and sex=#{param2}")
Student selectByNameAndSex(String name, Integer sex);

如果不想给每个参数命名,可以使用param参数,默认格式为param+参数序号或者0、1,值就是参数的值。

3.3 映射传值

需要传送多个参数时,也可以考虑使用映射(Map)的形式。

@Select("select * from student where name=#{name} and sex=#{sex}")
Student selectByNameAndSex(Map<String, Object> map);

在上面的示例中,将SQL语句需要的参数通过map类型传入,key为参数名,value为参数值。MyBatis会自动匹配对应的映射中的参数值。

调用时将参数依次加入映射中即可:

@Map param= new HashMap();
param.put("name", "ysxq");
param.put("sex", 1);
Student student = studentMapper.selectByNameAndSex(param);

3.4 使用pojo对象

使用pojo对象传参是比较常用的传参方式,像前面介绍的insert、update等方法,都是直接传入user对象。

@Update({"update student","set name = #{name,jdbcType=VARCHAR},","age = #{age,jdbcType=INTEGER},","sex = #{sex,jdbcType=INTEGER}","where id =#{id,jdbcType=VARCHAR}"
})
void update(Student record);

对于insert、update等参数较多的方法,可以使用pojo对象传参。需要注意的是,参数的名字和类型必须和pojo对象的属性保持一致。

上面讲述了MyBatis传参的4种方式,使用时根据方法的参数来选择合适的传值方式即可。

4.结果映射

MyBatis会自动将查询结果集转换为需要返回的数据类型,但是有些特殊的场景需要处理,比如查询的返回结果与期望的数据格式不一致时,应该怎么处理呢?

这就需要使用@Results和@Result注解。这两个注解可以将数据库中查询到的数值转化为具体的属性或类型,修饰返回的结果集,比如查询的对象返回值属性名和字段名不一致,或者对象的属性中使用了枚举等。

    @Select({"select","id, name as student_name,age, sex as student_sex","from student","where id = #{id,jdbcType=VARCHAR}"})@Results({@Result(column="id",property="id",jdbcType= JdbcType.VARCHAR,id=true),@Result(column="student_name",property="name",jdbcType=JdbcType.VARCHAR),@Result(column="student_sex",property="sex",jdbcType=JdbcType.TIMESTAMP)})Student selectById(Long id);

在上面的例子中,查询结果集的student_name字段和实体类Student定义的name属性的名称不一致,所以需要Result进行转换;而age名称是一致的,所以不需要Result进行转换。

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

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

相关文章

【SpringSecurity】十一、SpringSecurity集成JWT实现token的方法与校验

文章目录 1、依赖与配置2、JWT工具类3、认证成功处理器4、创建JWT过滤器5、安全配置类 1、依赖与配置 添加JWT的maven依赖&#xff1a; <!-- 添加jwt的依赖 --> <dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId…

NC后端扩展开发

前言 在日常的工作中&#xff0c;会遇到各种各样的需要进行扩展开发的需求&#xff0c;可以使用系统预留的扩展开发机制来实现&#xff0c;避免修改源码。因NC产品已迭代至BIP版本&#xff0c;所以前端扩展方式就再进行不赘述了&#xff0c;本文主要介绍后端扩展开发方式&…

sentinel blockHandler不生效

sentinel blockHandler不生效: package org.bc.sentinel.controller;import com.alibaba.csp.sentinel.annotation.SentinelResource; import com.alibaba.csp.sentinel.slots.block.BlockException; import org.apache.commons.lang3.RandomUtils; import org.springfram…

LeetCode 47题:全排列2

题目 给定一个可包含重复数字的序列 nums &#xff0c;按任意顺序 返回所有不重复的全排列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,2] 输出&#xff1a; [[1,1,2],[1,2,1],[2,1,1]]示例 2&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[…

机器学习---预剪枝、后剪枝(REP、CCP、PEP、)

1. 为什么要进行剪枝 横轴表示在决策树创建过程中树的结点总数&#xff0c;纵轴表示决策树的预测精度。 实线显示的是决策树 在训练集上的精度&#xff0c;虚线显示的则是在⼀个独⽴的测试集上测量出来的精度。 随着树的增⻓&#xff0c;在 训练样集上的精度是单调上升的&…

Docker安装部署ElasticSearch(ES)

文章目录 安装前准备创建挂载目录授权相关权限创建elasticsearch.yml文件 拉取镜像运行容器查看运行情况测试 安装前准备 创建挂载目录 用于在宿主机挂载日志&#xff0c;数据等内容 创建/opt/es/data目录 创建/opt/es/logs目录 创建/opt/es/plugins目录 创建/opt/es/conf目录…

MYSQL调优之思路----sql语句和索引调优

MySQL数据库性能优化包括综合多方面因素&#xff0c;应根据实际的业务情况制定科学、合理的调优方案进行测试调优 文章目录 MySQL性能优化1 优化介绍1.2 优化要考虑的问题2.1 优化可能带来的问题2.2 优化的需求2.3 优化由谁参与2.4 优化的方向2.5 优化的维度 1.2数据库使用优化…

【力扣周赛】第 361 场周赛(⭐前缀和+哈希表 树上倍增、LCA⭐)

文章目录 竞赛链接Q1&#xff1a;7020. 统计对称整数的数目竞赛时代码——枚举预处理 Q2&#xff1a;8040. 生成特殊数字的最少操作&#xff08;倒序遍历、贪心&#xff09;竞赛时代码——检查0、00、25、50、75 Q3&#xff1a;2845. 统计趣味子数组的数目竞赛时代码——前缀和…

【业务功能篇96】微服务-springcloud-springboot-认证服务-登录注册功能-Auth2.0-分布式session

5.登录功能 通过最基础的登录操作来完成登录处理 登录页面处理 认证服务的处理 /*** 注册的方法* return*/PostMapping("/login")public String login(LoginVo loginVo , RedirectAttributes redirectAttributes){R r memberFeginService.login(loginVo);if(r.getC…

thinkphp6 入门(5)-- 模型是什么 怎么用

一、模型 MVC架构 之前开发一个功能&#xff0c;后端为在控制器&#xff08;C&#xff09;中写 php SQL&#xff0c;前端为在页面&#xff08;V&#xff09;中写html css js&#xff0c;这就形成了 VC 架构。 但是发现&#xff0c;相同的数据逻辑&#xff08;SQL&#xf…

IntelliJ IDEA的远程开发(Remote Development)

DEA的远程开发功能&#xff0c;可以将本地的编译、构建、调试、运行等工作都放在远程服务器上执行&#xff0c;而本地仅运行客户端软件进行常规的开发操作即可&#xff0c;官方给出的逻辑图如下&#xff0c;可见通过本地的IDE和服务器上的IDE backend将本地电脑和服务器打通&am…

达梦8 在CentOS 系统下静默安装

确认系统参数 [rootlocalhost ~]# ulimit -a core file size (blocks, -c) unlimited data seg size (kbytes, -d) unlimited【1048576(即 1GB)以上或 unlimited】 scheduling priority (-e) 0 file size (blocks, -f) unlimite…

webpack5 (三)

webpack 高级配置 其实就是对 webpack 进行优化&#xff0c;让代码在编译/运行时性能更好 1. 提升开发体验 2. 提升打包构建速度 3. 减少代码体积 4. 优化代码运行性能 一、提升开发体验 sourcemap 在编译打包后所有的 css 和 js 都合并为了一个文件&#xff0c;并多了很多…

APS系统设计经验分享(时间推导II - 2023.09)

在前一篇关于APS系统设计分享文章(《APS系统设计经验分享(时间推导 - 2023.03)》)中&#xff0c;我们提到将会分享使用OptaPlanner作为规划引擎开发APS系统过程中&#xff0c;遇到的一些时间相关的设计建议与异常情况分析。后来一直忙于项目工作&#xff0c;直到现在才想起仍欠…

CC-TAIX01 HONEYWELL 霍尼韦尔连接工厂热智商远程监测系统

CC-TAIX01 HONEYWELL 霍尼韦尔连接工厂热智商远程监测系统 -霍尼韦尔宣布霍尼韦尔连接工厂热智商,一种基于云的远程监测系统,旨在监测和管理关键的热过程数据。这是霍尼韦尔资产绩效管理(APM)投资组合的一部分。 热智商是工业和商业热应用的远程监测解决方案。它将燃烧设备连…

Flink基础实操-计算单词出现次数

&#x1f947;&#x1f947;【大数据学习记录篇】-持续更新中~&#x1f947;&#x1f947; 个人主页&#xff1a;beixi 本文章收录于专栏&#xff08;点击传送&#xff09;&#xff1a;【大数据学习】 &#x1f493;&#x1f493;持续更新中&#xff0c;感谢各位前辈朋友们支持…

【云原生】容器编排工具Kubernetes

目录 一、 K8S介绍 官网地址&#xff1a; 1.1docker编排与k8s编排相比 1.2特性 1.3功能 二、K8S重要组件 2.1核心组件 &#xff08;1&#xff09;Kube-apiserver &#xff08;2&#xff09;Kube-controller-manager &#xff08;3&#xff09;Kube-scheduler &#x…

DevOps管理软件生命周期

整体的软件开发流程 PLAN&#xff1a;开发团队根据客户的目标制定开发计划 CODE&#xff1a;根据PLAN开始编码过程&#xff0c;需要将不同版本的代码存储在一个库中。GIT,SVN BUILD&#xff1a;编码完成后&#xff0c;需要将代码构建并且运行。MAVEN TEST&#xff1a;成功构建…

【性能优化】聊聊性能优化那些事

针对于互联网应用来说&#xff0c;性能优化其实就是一直需要做的事情&#xff0c;因为系统响应慢&#xff0c;是非常影响用户的体验&#xff0c;可能回造成用户流失。所以对于性能非常重要。最近正好接到一个性能优化的需求&#xff0c;需要对所负责的系统进行性能提升。目前接…

Windows环境下RabbitMQ下载安装

一、准备安装文件 1、下载Erlang 登录网站Downloads - Erlang/OTP&#xff0c;选择“Download Windows installer”&#xff0c;如下图所示&#xff1a; 弹出框中&#xff0c;选在下载保存地址&#xff0c;保存文件&#xff0c;如下图所示&#xff1a; 2、下载RabbitMQ 登录…