Spring Boot中使用MyBatis注解配置详解

之前在Spring Boot中整合MyBatis时,采用了注解的配置方式,相信很多人还是比较喜欢这种优雅的方式的,也收到不少读者朋友的反馈和问题,主要集中于针对各种场景下注解如何使用,下面就对几种常见的情况举例说明用法。

在做下面的示例之前,先准备一个整合好MyBatis的工程,可参见Spring Boot整合MyBatis,也可直接使用整合好的样例:Chapter3-2-7。

传参方式

下面通过几种不同传参方式来实现前文中实现的插入操作。

使用@Param

在之前的整合示例中我们已经使用了这种最简单的传参方式,如下:

@Insert("INSERT INTO USER(NAME, AGE) VALUES(#{name}, #{age})")
int insert(@Param("name") String name, @Param("age") Integer age);

这种方式很好理解,@Param中定义的name对应了SQL中的#{name}age对应了SQL中的#{age}

使用Map

如下代码,通过Map<String, Object>对象来作为传递参数的容器:

@Insert("INSERT INTO USER(NAME, AGE) VALUES(#{name,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER})")
int insertByMap(Map<String, Object> map);

对于Insert语句中需要的参数,我们只需要在map中填入同名的内容即可,具体如下面代码所示:

Map<String, Object> map = new HashMap<>();
map.put("name", "CCC");
map.put("age", 40);
userMapper.insertByMap(map);

使用对象

除了Map对象,我们也可直接使用普通的Java对象来作为查询条件的传参,比如我们可以直接使用User对象:

@Insert("INSERT INTO USER(NAME, AGE) VALUES(#{name}, #{age})")
int insertByUser(User user);

这样语句中的#{name}#{age}就分别对应了User对象中的nameage属性。

增删改查

MyBatis针对不同的数据库操作分别提供了不同的注解来进行配置,在之前的示例中演示了@Insert,下面针对User表做一组最基本的增删改查作为示例:

public interface UserMapper {

@Select("SELECT * FROM user WHERE name = #{name}")
User findByName(@Param("name") String name);

@Insert("INSERT INTO user(name, age) VALUES(#{name}, #{age})")
int insert(@Param("name") String name, @Param("age") Integer age);

@Update("UPDATE user SET age=#{age} WHERE name=#{name}")
void update(User user);

@Delete("DELETE FROM user WHERE id =#{id}")
void delete(Long id);
}

在完成了一套增删改查后,不妨我们试试下面的单元测试来验证上面操作的正确性:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@Transactional
public class ApplicationTests {

@Autowired
private UserMapper userMapper;

@Test
@Rollback
public void testUserMapper() throws Exception {
// insert一条数据,并select出来验证
userMapper.insert("AAA", 20);
User u = userMapper.findByName("AAA");
Assert.assertEquals(20, u.getAge().intValue());
// update一条数据,并select出来验证
u.setAge(30);
userMapper.update(u);
u = userMapper.findByName("AAA");
Assert.assertEquals(30, u.getAge().intValue());
// 删除这条数据,并select验证
userMapper.delete(u.getId());
u = userMapper.findByName("AAA");
Assert.assertEquals(null, u);
}
}

返回结果的绑定

对于增、删、改操作相对变化较小。而对于“查”操作,我们往往需要进行多表关联,汇总计算等操作,那么对于查询的结果往往就不再是简单的实体对象了,往往需要返回一个与数据库实体不同的包装类,那么对于这类情况,就可以通过@Results@Result注解来进行绑定,具体如下:

@Results({
@Result(property = "name", column = "name"),
@Result(property = "age", column = "age")
})
@Select("SELECT name, age FROM user")
List<User> findAll();

在上面代码中,@Result中的property属性对应User对象中的成员名,column对应SELECT出的字段名。在该配置中故意没有查出id属性,只对User对应中的name和age对象做了映射配置,这样可以通过下面的单元测试来验证查出的id为null,而其他属性不为null:

@Test
@Rollback
public void testUserMapper() throws Exception {
List<User> userList = userMapper.findAll();
for(User user : userList) {
Assert.assertEquals(null, user.getId());
Assert.assertNotEquals(null, user.getName());
}
}

后记

本文主要介绍几种最为常用的方式,更多其他注解的使用可参见文档:http://www.mybatis.org/mybatis-3/zh/java-api.html

代码示例

本文的相关例子可以查看下面仓库中的chapter3-2-8目录:

  • Github:https://github.com/dyc87112/SpringBoot-Learning
  • Gitee:https://gitee.com/didispace/SpringBoot-Learning

money.jpg

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

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

相关文章

何恺明团队的“视频版本MAE”,高效视频预训练!Mask Ratio高达90%时效果也很好!...

文 | 小马源 | 我爱计算机视觉本篇文章分享论文『Masked Autoencoders As Spatiotemporal Learners』&#xff0c;由何恺明团队提出视频版本的 MAE&#xff0c;进行高效视频预训练&#xff01;Mask Ratio 高达 90% 时效果很好&#xff01;详细信息如下&#xff1a;论文链接&…

剑指Offer - 面试题45. 把数组排成最小的数(字符串排序)

1. 题目 输入一个正整数数组&#xff0c;把数组里所有数字拼接起来排成一个数&#xff0c;打印能拼接出的所有数字中最小的一个。 示例 1: 输入: [10,2] 输出: "102"示例 2: 输入: [3,30,34,5,9] 输出: "3033459"提示: 0 < nums.length < 100 说明…

Spring Boot整合MyBatis

最近项目原因可能会继续开始使用MyBatis&#xff0c;已经习惯于spring-data的风格&#xff0c;再回头看xml的映射配置总觉得不是特别舒服&#xff0c;接口定义与映射离散在不同文件中&#xff0c;使得阅读起来并不是特别方便。 Spring中整合MyBatis就不多说了&#xff0c;最近…

谷歌放弃Tensorflow,全面拥抱JAX

文 | Matthew Lynley源 | 机器之心编辑部TensorFlow 大概已经成为了谷歌的一枚「弃子」。2015 年&#xff0c;谷歌大脑开放了一个名为「TensorFlow」的研究项目&#xff0c;这款产品迅速流行起来&#xff0c;成为人工智能业界的主流深度学习框架&#xff0c;塑造了现代机器学习…

LeetCode 第 20 场双周赛(294 / 1541,前19.07%,第1次全部通过)

文章目录1. 比赛结果2. 题目LeetCode 5323. 根据数字二进制下 1 的数目排序 easyLeetCode 5324. 每隔 n 个顾客打折 mediumLeetCode 5325. 包含所有三种字符的子字符串数目 mediumLeetCode 5326. 有效的快递序列数目 hard1. 比赛结果 第一次全部做出来了&#xff0c;提前6分钟…

Spring Boot中的缓存支持(二)使用Redis做集中式缓存

上一篇介绍了在Spring Boot中如何引入缓存、缓存注解的使用、以及EhCache的整合。 虽然EhCache已经能够适用很多应用场景&#xff0c;但是由于EhCache是进程内的缓存框架&#xff0c;在集群模式下时&#xff0c;各应用服务器之间的缓存都是独立的&#xff0c;因此在不同服务器…

NLP开源数据集汇总

源 | 极市平台本文汇总了几个NLP相关的开源数据集&#xff0c;均附有下载链接。CASIA手写数据集数据集地址&#xff1a;http://m6z.cn/6pFPtCCASIA-HWDB-T&#xff1a;一个从中文手写数据库CASIA-HWDB收集的触摸字符数据库。所有接触的字符&#xff08;或字符串&#xff09;都用…

LeetCode 1360. 日期之间隔几天(闰年判断)

1. 题目 请你编写一个程序来计算两个日期之间隔了多少天。 日期以字符串形式给出&#xff0c;格式为 YYYY-MM-DD&#xff0c;如示例所示。 示例 1&#xff1a; 输入&#xff1a;date1 "2019-06-29", date2 "2019-06-30" 输出&#xff1a;1示例 2&…

“我要做小小瑶大人的狗!”

小轶&#xff1a;这真的是白鹡鸰写的作为21世纪新时代人格健全&#xff0c;精神独立&#xff0c;心理健康的有志青年&#xff0c;总有那么几个时刻&#xff0c;会让我们情不自禁&#xff0c;眼泪从嘴角流下地呐喊着&#xff1a;“我是XXX的狗&#xff01;”啊&#xff01;这诚恳…

Spring Boot中的缓存支持(一)注解配置与EhCache使用

随着时间的积累&#xff0c;应用的使用用户不断增加&#xff0c;数据规模也越来越大&#xff0c;往往数据库查询操作会成为影响用户使用体验的瓶颈&#xff0c;此时使用缓存往往是解决这一问题非常好的手段之一。Spring 3开始提供了强大的基于注解的缓存支持&#xff0c;可以通…

LeetCode 1361. 验证二叉树(图的出入度)

1. 题目 二叉树上有 n 个节点&#xff0c;按从 0 到 n-1 编号&#xff0c;其中节点 i 的两个子节点分别是 leftChild[i] 和 rightChild[i]。 只有 所有 节点能够形成且 只 形成 一颗 有效的二叉树时&#xff0c;返回 true&#xff1b;否则返回 false。 如果节点 i 没有左子节…

微软:我已把显存优化做到了极致,还有谁?

文 | 王思若大家好&#xff0c;我是王思若。17年6月Google提出了Transformer架构&#xff0c;这篇目前Citation 4.3万的文章开启了大规模预训练模型时代。或者&#xff0c;更精确的从18年OpenAI和Google分别基于其中的Decoder和Encoder发布的大规模预训练模型GPT1和BERT开始&am…

Spring Boot中使用JavaMailSender发送邮件

相信使用过Spring的众多开发者都知道Spring提供了非常好用的JavaMailSender接口实现邮件发送。在Spring Boot的Starter模块中也为此提供了自动化配置。下面通过实例看看如何在Spring Boot中使用JavaMailSender发送邮件。 快速入门 在Spring Boot的工程中的pom.xml中引入sprin…

LeetCode 1362. 最接近的因数

1. 题目 给你一个整数 num&#xff0c;请你找出同时满足下面全部要求的两个整数&#xff1a; 两数乘积等于 num 1 或 num 2以绝对差进行度量&#xff0c;两数大小最接近 你可以按任意顺序返回这两个整数。 示例 1&#xff1a; 输入&#xff1a;num 8 输出&#xff1a;[3…

光子神经网络登上nature,图像识别速度降至1纳秒

文 | Alex&#xff08;凹非寺&#xff09;源 | 量子位比深度神经网络速度还快的是什么&#xff1f;或许光子DNN可以回答这个问题。现在&#xff0c;美国研究者开发的一个光子神经网络(photonic deep neural network&#xff0c;PDNN)&#xff0c;让图像识别仅需1纳秒。1纳秒是什…

LeetCode 1363. 形成三的最大倍数(贪心,难)

1. 题目 给你一个整数数组 digits&#xff0c;你可以通过按任意顺序连接其中某些数字来形成 3 的倍数&#xff0c;请你返回所能得到的最大的 3 的倍数。 由于答案可能不在整数数据类型范围内&#xff0c;请以字符串形式返回答案。 如果无法得到答案&#xff0c;请返回一个空…

Spring Boot中使用Spring Security进行安全控制

我们在编写Web应用时&#xff0c;经常需要对页面做一些安全控制&#xff0c;比如&#xff1a;对于没有访问权限的用户需要转到登录表单页面。要实现访问控制的方法多种多样&#xff0c;可以通过Aop、拦截器实现&#xff0c;也可以通过框架实现&#xff08;如&#xff1a;Apache…

这篇寒门博士论文致谢火了:回首望过去,可怜无数山

源 | 奔流新闻兰州晨报 记者 邢剑扬、安之若素德之至 微信平台、澎湃新闻“可怜无数山”近日&#xff0c;一位甘肃籍博士的论文致谢和回望“火”了&#xff0c;有网友称读后“泪眼婆娑&#xff0c;戳到了灵魂”&#xff0c;也有网友评价“一字一句&#xff0c;熠熠生辉”。“回…

Spring Boot中的事务管理

什么是事务&#xff1f; 我们在开发企业应用时&#xff0c;对于业务人员的一个操作实际是对数据读写的多步操作的结合。由于数据操作在顺序执行的过程中&#xff0c;任何一步操作都有可能发生异常&#xff0c;异常会导致后续操作无法完成&#xff0c;此时由于业务逻辑并未正确…

C++类对象排序operator重载操作

类内默认含有this指针&#xff0c;bool operator(const T& a)类外则需要写两个参数&#xff0c;bool operator(const T& a, const T& b) class People { public:string name;int id;People(string n, int i):name(n),id(i){}bool operator(const People& a){r…