前言
在上一章节中,我带大家在Spring Boot中整合了JdbcTemplate,利用JdbcTemplate感觉会比较麻烦,所以我让各位思考有没有更简单易用的实现方式。那么接下来在这一章节中,我会继续带领大家学习在Spring Boot中整合Mybatis框架,利用Mybatis来实现数据库的操作。
一. Mybatis简介
1. MyBatis概述
MyBatis是一款优秀的持久层框架,它本来是Apache的一个开源项目iBatis。在2010年的时候,这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,在2013年11月的时候又迁移到了Github。
iBATIS一词来源于“internet”和“abatis”的组合,后来改名为了Mybatis。
2. Mybatis特点
- 支持定制化 SQL、存储过程以及高级映射。
- MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
- 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
- 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
- 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
- 提供映射标签,支持对象与数据库的orm字段关系映射。
- 提供对象关系映射标签,支持对象关系组建维护。
- 提供xml标签,支持编写动态SQL。
3. Mybatis的发展历程
Mybatis 初期使用比较麻烦,需要各种配置文件、实体类、Dao 层映射关联、还有一大推其它配置。
然后 Mybatis 就发现了这种弊端,为了解决这种弊端,就开发了generator逆向工程,可以根据表结构自动生成实体类、配置文件和 Dao 层代码,可以减轻一部分开发量。
后期也进行了大量的优化,可以使用注解进一步简化开发,自动管理 Dao 层和配置文件等。到了今天Mybatis进一步简化到极致,那就是mybatis-spring-boot-starter 的出现。我们可以利用 Spring Boot 整合 Mybatis,即使完全不用配置文件,也可以简单配置轻松实现数据库操作。
二. Spring Boot中整合Mybatis
接下来我就讲解在SpringBoot中实现Mybatis的整合,我们整合的方式一般有2种:
- 1. 注解方式;
- 2. XML方式。
由于注解方式更为简单易用,所以本案例的讲解会以注解方式实现的案例。
1. 创建Web项目
按照之前的经验,我们先创建一个SpringBoot的Web程序,具体过程略,各位可以参考下图创建自己的项目。
2. 添加依赖包
接下来我们需要添加几个核心依赖包。
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.0.0</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.10</version></dependency>
3. 添加配置文件
然后我们要创建一个applicaiton.yml配置文件,在这里配置数据库的相关信息。大家注意,Spring Boot 会自动加载 spring.datasource.* 相关配置,数据源就会自动注入到 sqlSessionFactory 中,sqlSessionFactory 会自动注入到 Mapper 中。
spring datasource url jdbc mysql //localhost 3306/db4?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true type com.alibaba.druid.pool.DruidDataSource username root password syc driver-class-name com.mysql.jdbc.Driver #驱动mybatis type-aliases-package com.yyg.boot.mapper
配置文件中的核心配置含义:
spring.datasource.url: 数据库连接字符串;
spring.datasource.username: 数据库用户名;
spring.datasource.password: 数据库密码;
spring.datasource.driver-class-name: 驱动类型(注意MySQL 8.0的值是com.mysql.cj.jdbc.Driver和之前不同);
mybatis.type-aliases-package 配置mapper包名。
4. 创建DataSource配置类(可以省略)
这里我使用用Druid提供的DataSource作为数据源,来替换默认的DataSource。
packagecom.yyg.boot.config; importcom.alibaba.druid.pool.DruidDataSource; importlombok.Data; importorg.mybatis.spring.annotation.MapperScan; importorg.springframework.boot.context.properties.ConfigurationProperties; importorg.springframework.context.annotation.Bean; importorg.springframework.context.annotation.ComponentScan; importorg.springframework.context.annotation.Configuration; importjavax.sql.DataSource; /*** @Author 一一哥Sun* @Date Created in 2020/3/30* @Description 第二种配置数据源的方式*/prefix="spring.datasource") ("com.yyg.boot.mapper") (publicclassDbConfig { privateStringurl; privateStringusername; privateStringpassword; publicDataSourcegetDataSource() { DruidDataSourcedataSource=newDruidDataSource(); dataSource.setUrl(url); dataSource.setUsername(username); dataSource.setPassword(password); returndataSource; } }
我们可以在这个类上添加@MapperScan("com.yyg.boot.mapper"),指定Mapper接口所在包位置。
5. 创建实体类
然后封装一个实体类,对应我们的数据库用户表。
packagecom.yyg.boot.domain; importlombok.Data; importlombok.ToString; /*** @Author 一一哥Sun* @Date Created in 2020/3/30* @Description Description*/publicclassUser { privateLongid; privateStringusername; privateStringbirthday; privateStringsex; privateStringaddress; }
6. 创建UserMapper接口
这里我创建一个Mapper接口类,封装几个数据库操作方法,方法上面使用注解来实现数据库增删改查操作。
packagecom.yyg.boot.mapper; importcom.yyg.boot.domain.User; importorg.apache.ibatis.annotations.*; /*** @Author 一一哥Sun* @Date Created in 2020/3/31* @Description 在Mybatis的Mapper接口中,增删改查都有对应的注解.@Insert,@Select,@Delete,@Update*/publicinterfaceUserMapper { "select * from user where id = #{id}") (UserqueryUserById( (value="id") intid); "insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})") (voidinsertUser(Useruser); "UPDATE user SET sex=#{sex} WHERE username=#{username}") (voidupdateUser(Useruser); "DELETE FROM user WHERE id =#{id}") (voiddeleteById( ("id") intid); }
Mapper中常用注解含义:
7. 创建Controller控制器
我们再创建一个Controller,里面定义几个RESTful风格的接口。
packagecom.yyg.boot.web; importcom.yyg.boot.domain.User; importcom.yyg.boot.mapper.UserMapper; importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.web.bind.annotation.*; /*** @Author 一一哥Sun* @Date Created in 2020/3/31* @Description Description*/"/user") (publicclassUserController { privateUserMapperuserMapper; "/{id}") (publicUserfindUserById( ("id") Integerid) { returnuserMapper.queryUserById(id); } "") (publicStringaddUser(Useruser) { userMapper.insertUser(user); return"success"; } "/update") (publicStringupdateUser(Useruser) { userMapper.updateUser(user); return"success"; } "/{id}") (publicStringdelUserById( ("id") Integerid) { userMapper.deleteById(id); return"success"; } }
8. 创建Application入口类
最后创建一个项目入口类,另外我们也可以在入口类上添加@MapperScan("com.yyg.boot.mapper")注解,指定Mapper接口所在包位置。
packagecom.yyg.boot; importorg.mybatis.spring.annotation.MapperScan; importorg.springframework.boot.SpringApplication; importorg.springframework.boot.autoconfigure.SpringBootApplication; /*** @Author 一一哥Sun* @Date Created in 2020/3/31* @Description Description*///@MapperScan("com.yyg.boot.mapper")publicclassMybatisApplication { publicstaticvoidmain(String[] args) { SpringApplication.run(MybatisApplication.class, args); } }
9. 启动项目进行测试
最后就把项目启动起来,然后进行测试即可。
9.1 测试查询功能
9.2 测试添加功能
此时可以看到数据库中多了一个id=28的新的记录。
9.3 测试修改功能
此时可以看到数据库中的sex数据被修改了。
9.4 测试删除功能
此时可以看数据库的表中,已经没有了id为28的数据!
结语
这样我们就在SpringBoot中整合了Mybatis,并实现了数据库的增删改查操作,整体而言,比JdbcTemplate的操作更简单一些。
今日小作业:
请思考一下,有没有更简单的方式实现数据库操作呢?