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…

python中setup函数的用法_python学习之setUp函数和tearDown函数

1,setUp():就是在一个类中最先被调用的函数,每次执行一个函数都要先执行这个函数,有几个函数就被调用几次,与放的位置无关,随便放到哪里都会先执行这个函数 2,tearDown():就是在一个类中最后被调用的函数,每个函数执行之后都会执行一次,与放的位置无关,随便放到哪里…

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…

2-路插入排序c语言算法,浅谈2路插入排序算法及其简单实现

2路插入排序算法是在直接插入排序算法的基础上增加了一个辅助数组&#xff0c;其目的是减少排序过程中的移动次数&#xff0c;需要增加n个记录的辅助空间。难点可能在于对取余的考虑吧&#xff0c;可以把辅助数组看成一个环状空间&#xff0c;这样就能更好的理解辅助空间中最大…

mysql安装被打断_Mysql的安装/性能优化/安全加固

aa安装&#xff1a;增加一个登录用户和群组#groupaddmysql#useradd -r -g mysql mysql解压缩Mysql数据包#tar-zxvf mysql-5.6.13.tar.gz进入Mysql解压缩目录#cd mysql-5.6.13配置安装mysql#cmake.#make &&make install建立配置文件#cp./support-files/my-medium.cnf/et…

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

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

安卓软件错误log_Android编程实现捕获程序异常退出时的错误log信息功能详解

本文实例讲述了Android编程实现捕获程序异常退出时的错误log信息功能。分享给大家供大家参考&#xff0c;具体如下&#xff1a;很多时候我们程序无缘无故的就挂掉了&#xff0c;让我们一头雾水&#xff0c;如果刚好我们在调试&#xff0c;那我们可以通过错误log来查看是什么原因…

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…

c#endread怎么打印出来_NetworkStream.EndRead(IAsyncResult) 方法 (System.Net.Sockets) | Microsoft Docs...

处理异步读取的结束。Handles the end of an asynchronous read.public:override int EndRead(IAsyncResult ^ asyncResult);public override int EndRead (IAsyncResult asyncResult);override this.EndRead : IAsyncResult -> intPublic Overrides Function EndRead (asyn…

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

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

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

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

c 复杂的前置后置面试题_你被哪些C语言面试题坑过?

最近在《深入理解计算机系统》上看到一道题&#xff0c;分享一下&#xff1a;假设我们在对有符号值使用补码运算的32位机器人运行代码。对于有符号值使用的是算术右移&#xff0c;而对于无符号值使用的是逻辑右移。变量的声明和初始化如下&#xff1a;int x foo(); //任意值in…

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;经过这一…

lisp 所在图幅号计算_地图标准分幅与编号计算(二)新图幅号

新图幅号1991年制订了新的《国家基本比例尺地形图分幅和编号》(GB/T 13989-92 )的国家标准&#xff0c;并给出了不同标准比例尺地形图的编给规范及图式。新测和更新的地图&#xff0c;照此标准进行分幅和编号。我国基本比例尺的地形图包括1:5000、1:1万、1:2.5万、1:5万、1:10万…

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

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

python实训名片管理程序_python3学生名片管理v2.0版

python学生名片管理vv2.0是在1.0的基础上增加部分功能&#xff0c;实现将数据存入文件保存&#xff0c;以便于程序停止后还能再次取到数据。具体实现请看如下部分&#xff1a;card_main.pyimport sysfrom One.card_func2 import *def head():print(* * 30)print(学生信息管理系…

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查看了很多资料都说需要将…