mybatis依赖_Spring Boot2 系列教程(二十一)整合 MyBatis

3dd1697427d3babfef09599c7df1b89c.png

前面两篇文章和读者聊了 Spring Boot 中最简单的数据持久化方案 JdbcTemplate,JdbcTemplate 虽然简单,但是用的并不多,因为它没有 MyBatis 方便,在 Spring+SpringMVC 中整合 MyBatis 步骤还是有点复杂的,要配置多个 Bean,Spring Boot 中对此做了进一步的简化,使 MyBatis 基本上可以做到开箱即用,本文就来看看在 Spring Boot 中 MyBatis 要如何使用。

工程创建

首先创建一个基本的 Spring Boot 工程,添加 Web 依赖,MyBatis 依赖以及 MySQL 驱动依赖,如下:

41db1a299def1b656bd039e661e9f074.png

创建成功后,添加Druid依赖,并且锁定MySQL驱动版本,完整的依赖如下:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.0.0</version>
</dependency>
<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.10</version>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.28</version><scope>runtime</scope>
</dependency>

如此,工程就算是创建成功了。小伙伴们注意,MyBatis 和 Druid 依赖的命名和其他库的命名不太一样,是属于 xxx-spring-boot-stater 模式的,这表示该 starter 是由第三方提供的。

基本用法

MyBatis 的使用和 JdbcTemplate 基本一致,首先也是在 application.properties 中配置数据库的基本信息:

spring.datasource.url=jdbc:mysql:///test01?useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

配置完成后,MyBatis 就可以创建 Mapper 来使用了,例如我这里直接创建一个 UserMapper2,如下:

public interface UserMapper2 {@Select("select * from user")List<User> getAllUsers();@Results({@Result(property = "id", column = "id"),@Result(property = "username", column = "u"),@Result(property = "address", column = "a")})@Select("select username as u,address as a,id as id from user where id=#{id}")User getUserById(Long id);@Select("select * from user where username like concat('%',#{name},'%')")List<User> getUsersByName(String name);@Insert({"insert into user(username,address) values(#{username},#{address})"})@SelectKey(statement = "select last_insert_id()", keyProperty = "id", before = false, resultType = Integer.class)Integer addUser(User user);@Update("update user set username=#{username},address=#{address} where id=#{id}")Integer updateUserById(User user);@Delete("delete from user where id=#{id}")Integer deleteUserById(Integer id);
}

这里是通过全注解的方式来写 SQL,不写 XML 文件。

@Select、@Insert、@Update 以及 @Delete 四个注解分别对应 XML 中的 select、insert、update 以及 delete 标签,@Results 注解类似于 XML 中的 ResultMap 映射文件(getUserById 方法给查询结果的字段取别名主要是向小伙伴们演示下 @Results 注解的用法)。

另外使用 @SelectKey 注解可以实现主键回填的功能,即当数据插入成功后,插入成功的数据 id 会赋值到 user 对象的id 属性上。

UserMapper2 创建好之后,还要配置 mapper 扫描,有两种方式,一种是直接在 UserMapper2 上面添加 @Mapper 注解,这种方式有一个弊端就是所有的 Mapper 都要手动添加,要是落下一个就会报错,还有一个一劳永逸的办法就是直接在启动类上添加 Mapper 扫描,如下:

@SpringBootApplication
@MapperScan(basePackages = "org.javaboy.mybatis.mapper")
public class MybatisApplication {public static void main(String[] args) {SpringApplication.run(MybatisApplication.class, args);}
}

好了,做完这些工作就可以去测试 Mapper 的使用了。

mapper 映射

当然,开发者也可以在 XML 中写 SQL,例如创建一个 UserMapper,如下:

public interface UserMapper {List<User> getAllUser();Integer addUser(User user);Integer updateUserById(User user);Integer deleteUserById(Integer id);
}

然后创建 UserMapper.xml 文件,如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-21-mapper.dtd">
<mapper namespace="org.javaboy.mybatis.mapper.UserMapper"><select id="getAllUser" resultType="org.javaboy.mybatis.model.User">select * from t_user;</select><insert id="addUser" parameterType="org.javaboy.mybatis.model.User">insert into user (username,address) values (#{username},#{address});</insert><update id="updateUserById" parameterType="org.javaboy.mybatis.model.User">update user set username=#{username},address=#{address} where id=#{id}</update><delete id="deleteUserById">delete from user where id=#{id}</delete>
</mapper>

将接口中方法对应的 SQL 直接写在 XML 文件中。

那么这个 UserMapper.xml 到底放在哪里呢?有两个位置可以放,第一个是直接放在 UserMapper 所在的包下面:

b2cd4ae19bc598d973283c2ea9232105.png

放在这里的 UserMapper.xml 会被自动扫描到,但是有另外一个 Maven 带来的问题,就是 java 目录下的 xml 资源在项目打包时会被忽略掉,所以,如果 UserMapper.xml 放在包下,需要在 pom.xml 文件中再添加如下配置,避免打包时 java 目录下的 XML 文件被自动忽略掉:

<build><resources><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes></resource><resource><directory>src/main/resources</directory></resource></resources>
</build>

当然,UserMapper.xml 也可以直接放在 resources 目录下,这样就不用担心打包时被忽略了,但是放在 resources 目录下,必须创建和 Mapper 接口包目录相同的目录层级,这样才能确保打包后 XML 和 Mapper 接口又处于在一起,否则 XML 文件将不能被自动扫描,这个时候就需要添加额外配置。例如我在 resources 目录下创建 mapper 目录用来放 mapper 文件,如下:

ff28c628d0b42c32aecdfbfc7462d061.png

此时在 application.properties 中告诉 mybatis 去哪里扫描 mapper:

mybatis.mapper-locations=classpath:mapper/*.xml

如此配置之后,mapper 就可以正常使用了。注意这种方式不需要在 pom.xml 文件中配置文件过滤。

原理分析

在 SSM 整合中,开发者需要自己提供两个 Bean,一个SqlSessionFactoryBean ,还有一个是 MapperScannerConfigurer,在 Spring Boot 中,这两个东西虽然不用开发者自己提供了,但是并不意味着这两个 Bean 不需要了,在 org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration 类中,我们可以看到 Spring Boot 提供了这两个 Bean,部分源码如下:

@org.springframework.context.annotation.Configuration
@ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class })
@ConditionalOnSingleCandidate(DataSource.class)
@EnableConfigurationProperties(MybatisProperties.class)
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
public class MybatisAutoConfiguration implements InitializingBean {@Bean@ConditionalOnMissingBeanpublic SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {SqlSessionFactoryBean factory = new SqlSessionFactoryBean();factory.setDataSource(dataSource);return factory.getObject();}@Bean@ConditionalOnMissingBeanpublic SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {ExecutorType executorType = this.properties.getExecutorType();if (executorType != null) {return new SqlSessionTemplate(sqlSessionFactory, executorType);} else {return new SqlSessionTemplate(sqlSessionFactory);}}@org.springframework.context.annotation.Configuration@Import({ AutoConfiguredMapperScannerRegistrar.class })@ConditionalOnMissingBean(MapperFactoryBean.class)public static class MapperScannerRegistrarNotFoundConfiguration implements InitializingBean {@Overridepublic void afterPropertiesSet() {logger.debug("No {} found.", MapperFactoryBean.class.getName());}}
}

从类上的注解可以看出,当当前类路径下存在 SqlSessionFactory、 SqlSessionFactoryBean 以及 DataSource 时,这里的配置才会生效,SqlSessionFactory 和 SqlTemplate 都被提供了。为什么要看这段代码呢?下篇文章,松哥和大伙分享 Spring Boot 中 MyBatis 多数据源的配置时,这里将是一个重要的参考。

好了,本文就先说到这里,本文相关案例,大家可以在 GitHub 上下载:https://github.com/lenve/javaboy-code-samples

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

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

相关文章

android获取图片格式,Android得到图片的真实格式——从本地文件或者网络文件流...

ImageFormatFeatures支持从InputStream或者File解析四种格式&#xff1a;jpg 、 png 、 webp 、 gif从文件本身解析格式&#xff0c;而不是从扩展名获取FormatHelper.getFormat(InputStream inputStream)FormatHelper.getFormat(File file)UsageStep 1Step 2解析格式String For…

pagehelper的使用_SpringBoot项目中,如何更规范的使用PageHelper分页?

SpringBoot项目中&#xff0c;如何更规范的使用PageHelper分页&#xff0c;拉勾IT课小编为大家分解一. 开发准备1. 开发工具• IntelliJ IDEA 2020.2.32. 开发环境• Red Hat Open JDK 8u256• Apache Maven 3.6.33. 开发依赖SpringBoot<dependency><groupId>org.s…

python自动输入账号密码_Python如何基于selenium实现自动登录博客园

这篇文章主要介绍了Python如何基于selenium实现自动登录博客园,文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 需要做的准备&#xff1a; 本文章是使用Chrome&#xff0c;所以需要Chormedriver.exe&#xff0c;…

android 模拟长按菜单键_如何采用PLC梯形图实现单键启动程序

“PLC是一种专门为在工业环境下应用而设计的数字运算操作的电子装置。它采用可以编制程序的存储器&#xff0c;用来在其内部存储执行逻辑运算、顺序运算、计时、计数和算术运算等操作的指令&#xff0c;并能通过数字式或模拟式的输入和输出&#xff0c;控制各种类型的机械或生产…

android 日期对话框,Android日期选择器对话框DatePickerDialog使用详解

调用Android原生日期选择器对话框就是DatePickerDialog&#xff0c;具体内容如下在Android4.4系统上效果如图&#xff1a;在Android5.0以上效果如图&#xff1a;1、Activity的onCreate方法中获取当时的年&#xff0c;月&#xff0c;日Calendar ca Calendar.getInstance();mYea…

wp自定义帖子没标签_ofollow标签的作用有重大变化

nofollow标签的历史经典的nofollow标签作用和使用方法以前的帖子写过&#xff0c;详情读者可以参考以前帖子。nofollow标签&#xff08;准确说是属性&#xff0c;不过约定俗成&#xff0c;还是叫标签吧&#xff09;是Google和Yahoo等搜索引擎2005年推出的&#xff0c;目的是告诉…

android电视视频播放器,智能电视如何播放本地视频?当贝市场分享几款播放器...

原标题&#xff1a;智能电视如何播放本地视频&#xff1f;当贝市场分享几款播放器对视频清晰度要求更高的用户普遍会自己下载视频&#xff0c;然后通过本地播放的方式观影&#xff0c;那么&#xff0c;下面就给大家介绍几款智能电视的本地视频播放软件&#xff0c;包你好用。当…

python 三引号_Python 简明教程 --- 4,Python 变量与基本数据类型

微信公众号&#xff1a;码农充电站pro 个人主页&#xff1a;https://codeshellme.github.io任何一个人都会写出能够让机器理解的代码&#xff0c;只有好的程序员才能写出人类可以理解的代码。 —— Martin Fowler 1&#xff0c;什么是变量计算机的本质是处理数据&#xff0c;数…

鸿蒙系统手机9月11日,鸿蒙系统9月11日,将有望正式成为国际第三大手机操作生态系统...

原标题&#xff1a;鸿蒙系统9月11日&#xff0c;将有望正式成为国际第三大手机操作生态系统众所周知&#xff0c;当时华为鸿蒙系统还处于1.0版本的时候&#xff0c;这项技术就已经被运用到了荣耀智能屏上&#xff0c;目前该系统也已经过渡到了华为的手表上&#xff0c;经过这一…

高德地图画带箭头的线_现代汽车把艺术展览搬到线上,邀您逛全景获奖展

Hyundai Blue Prize 2019获奖展“游戏社会&#xff1a;狼、猞猁和蚁群”(Play societies&#xff1a;wolves, lynx and ants)线上展览正式上线。《游戏社会: 狼、猞猁和蚁群》&#xff0c;以 “信息高速公路上的荒原狼”、“猞猁安全岛”和“蚁群游戏厅” 三段隐喻文本展开展览…

ssm 项目cannot resolve package_前端工程化之创建项目

前言在我们团队&#xff0c;刚开始创建项目&#xff0c;是直接使用框架的 cli 进行创建项目&#xff0c;并修改相关配置。随着项目的增多&#xff0c;沉淀了两套模板&#xff0c;平台端及移动端。后来&#xff0c;我们自己写了一个简单的 cli&#xff0c;并提供了 create 及 li…

android_secure写权限,android.permission.WRITE_SECURE_SETTINGS权限报错

在做Android的GPS这一块时&#xff0c;根据原生代码写的Widget&#xff0c;运行时总是会报错说需要android.permission.WRITE_SECURE_SETTINGS权限&#xff0c;于是便在Manifest.xml中添加该权限&#xff0c;但是保存时会报错提示该权限仅用于系统的app查看了很多资料都说需要将…

百度seo排名规则_百度关键词seo优化排名如何上首页

无涯孤客百度关键词seo优化排名快速上首页&#xff0c;是通过使用多种百度算法优化&#xff0c;让网站在搜索引擎上排名更好&#xff0c;我们做百度关键词排名的话&#xff0c;要比市面上绝大公司做的要稳定&#xff0c;也希望各位可以相信我们&#xff0c;我们可以将百度关键词…

数学难题html5小游戏答案,小学数学难题讲解及答案

第一讲速算与巧算例1 计算9&#xff0b;99&#xff0b;999&#xff0b;9999&#xff0b;99999解&#xff1a;在涉及所有数字都是9的计算中&#xff0c;常使用凑整法.例如将999化成1000—1去计算.这是小学数学中常用的一种技巧.9&#xff0b;99&#xff0b;999&#xff0b;9999&…

distinct过滤掉重复记录并且显示所有字段_MySQL的所有姿势,我都帮你准备好了...

mysql登录远程登录方式本地登陆方式mysql&#xff1a;mysql -h 主机名 -P 端口号 -u 用户名 -p密码 mysql&#xff1a;mysql -uroot -p密码数据库操作命令创建数据库、删除数据库、展示所有数据库名。查看当前数据库名、查看所有表、查看其他数据库的表。查看数据库的版本、表结…

HTML5海报生成器源码,原生js小项目 - canvas海报生成器

1.背景之前做过一个营销类移动端h5项目-海报生成器&#xff0c;上传用户本地图片合成海报并支持下载&#xff0c;这次有时间了整理整理。2.几个重点上传本地图片并支持预览处理ios照片翻转使用canvas对图片等比拉伸缩放并居中裁剪使用canvas绘制图片以及文本输出base64并支持下…

matlab length_MATLAB入门

一、操作界面1.功能区 2.当前文件夹 3.命令窗口4.工作区 5.程序编辑窗口 6.脚本文件&#xff08;1&#xff09;当前文件夹是MATLAB读取和存储文件的默认文件夹。 &#xff08;2&#xff09;当前文件夹可以修改或新建命令行窗口&#xff1a;用于输入命令&#xff08;或语句&…

docker 端口映射 udp_Docker 制作一键安装的本地无污染 DNS 域名服务

国庆休假回来&#xff0c;感觉和整个世界失联了&#xff0c;各种不通&#xff0c;不得不就自己本地的应用环境进一步的升级&#xff1a;搭建一个本地版本的无污染 DNS 域名服务。各种网络文章扫了一遍&#xff0c;推荐以下这篇文章&#xff1a;CoreDNS搭建无污染DNS指导思想基本…

快能通小学生计算机的游戏,亲子小游戏,帮助孩子更快学会交通安全知识

随着我国机动化进程加快和小汽车进入千家万户&#xff0c;如何安全乘坐机动车&#xff0c;如何在上放学途中保障儿童青少年的交通安全&#xff0c;成为儿童青少年交通安全保护的重要内容。下面小编介绍几个亲子小游戏&#xff0c;帮助孩子更快学会交通安全知识。认识交通标志游…

latex 三线表_LaTeX学习记录(3):使用图表

学习记录(3)&#xff1a;使用图表每次跟朋友安利 的时候我都会讲这么一个故事&#xff1a;❝当时设计天琴一号加速度计的控制器参数&#xff0c;出于数字控制参数切换的便利性&#xff0c;疯狂设计了十几套参数。然而写报告的时候傻了&#xff1a;老板要求每套参数六个自由度的…