SpringBoot第五篇:整合Mybatis
作者:追梦1819
原文:https://www.cnblogs.com/yanfei1819/p/10869315.html
版权声明:本文为博主原创文章,转载请附上博文链接!
## 引言
ORM框架有很多,比如Mybatis、hibernate、JPA、JDBCTemplate等,各自有各自的优点。Mybatis作为一个半自动的框架,灵活易上手等特点,收到了很多人的青睐。
本文介绍springboot 集成 Mybatis框架。
Mybatis介绍
基本概念
什么是 Mybatis?
官方给的解释是:MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
优缺点
Mybatis 可能是用的最广泛的一个 ORM 框架了,下面简单列举其优缺点。
优点:
- 易上手;
- sql 灵活,与代码解耦;
- 支持对象与数据库映射;
- 半自动框架,灵活性较高;
缺点:
-
需要维护 sql ;
-
绑定了sql,移植性差;
-
二级缓存机制不佳;
开发模式
准备工作
在Mybatis 中,有两种方式开发方式:配置文件开发和注解开发,以下分别介绍两种模式。
我们先来做一下准备工作。不管是哪一种开发模式,下面几步都是相同的:
- 都需要对 Mybatis 代理接口进行扫描。在 SpringBoot 项目中,扫描方式有两种:
1) 在启动类上加 @MapperScan(value = {"com.sunwin.db.*","com.yanfei1819.mybatisdemo.db"})
注解;
2) 分别在接口 mapper 上添加 @Mapper
注解;
上面扫描Mybatis 代理接口的两种方式的效果一样,只不过第一种方式是一次性扫描整个包,第二种方式是单独扫描每个接口。
-
初始化数据库:
SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for user -- ---------------------------- DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, `age` int(3) NOT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 50 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of user -- ---------------------------- INSERT INTO `user` VALUES (14, 'admin', 21); INSERT INTO `user` VALUES (48, 'teacher', 20); INSERT INTO `user` VALUES (49, 'student', 22); SET FOREIGN_KEY_CHECKS = 1; -
引入maven 依赖:
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.0.1</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> -
配置数据库信息:
spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://192.168.1.88:3306/win_health?serverTimezone=GMT%2B8 spring.datasource.username=root spring.datasource.password=pass123
注解开发
开发之前,先大体了解一下项目的结构(这个结构都是自定义的,这里只是为了演示方便):
首先,创建一个实体类:
package com.yanfei1819.mybatisdemo.db.dto; /** * Created by 追梦1819 on 2019-05-05. */ public class UserDto { private Long id; private String name; private int age; // set/get 省略 }
创建以下实体类是为了试返回的值展示更加友好。
package com.yanfei1819.mybatisdemo.entity; import com.yanfei1819.mybatisdemo.db.dto.UserDto; import java.util.List; /** * Created by 追梦1819 on 2019-05-05. */ public class UserListResponse { private int code; private String msg; private List<UserDto> users; // set/get 省略 }
其次,创建代理接口:
package com.yanfei1819.mybatisdemo.db.dao; import com.yanfei1819.mybatisdemo.db.dto.UserDto; import org.apache.ibatis.annotations.Select; import java.util.List; /** * Created by 追梦1819 on 2019-05-05. */ public interface UserDao { @Select("select * from user ") List<UserDto> queryList(); }
再者,创建service层:
package com.yanfei1819.mybatisdemo.service; import com.yanfei1819.mybatisdemo.entity.UserListResponse; /** * Created by 追梦1819 on 2019-05-05. */ public interface UserService { UserListResponse queryUsers(); }
package com.yanfei1819.mybatisdemo.service.impl; import com.yanfei1819.mybatisdemo.db.dao.UserDao; import com.yanfei1819.mybatisdemo.db.dto.UserDto; import com.yanfei1819.mybatisdemo.entity.UserListResponse; import com.yanfei1819.mybatisdemo.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; /** * Created by 追梦1819 on 2019-05-05. */ @Service public class UserServiceImpl implements UserService { @Autowired private UserDao userDao; @Override public UserListResponse queryUsers() { List<UserDto> userDtos = userDao.queryList(); UserListResponse response = new UserListResponse(); response.setUsers(userDtos); response.setCode(0); response.setMsg("success"); return response; } }
然后,创建controller层:
package com.yanfei1819.mybatisdemo.controller; import com.yanfei1819.mybatisdemo.entity.UserListResponse; import com.yanfei1819.mybatisdemo.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseBody; /** * Created by 追梦1819 on 2019-05-05. */ @Controller public class UserController { @Autowired private UserService userService; @ResponseBody @GetMapping("/queryUsers") public UserListResponse queryUsers(){ return userService.queryUsers(); } }
最后,启动main 方法:
package com.yanfei1819.mybatisdemo; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @MapperScan("com.yanfei1819.mybatisdemo.db") // 注意这个注解 public class MybatisDemoApplication { public static void main(String[] args) { SpringApplication.run(MybatisDemoApplication.class, args); } }
用postman测试:
配置文件开发
配置文件模式开发比注解开发稍稍复杂一点。因为这种模式多了维护 sql 的 mapper.xml 文件。我将其归结为下面三步:
-
创建代理接口:
-
创建接口映射的 xxxMapper.xml 文件
-
在主配置文件 application.properties 中指定 xxxMapper.xml 的位置:
mybatis.mapper-locations=classpath:mapper/*.xml
;
在以上项目的基础上,添加以下代码。
首先,新建实体类:
package com.yanfei1819.mybatisdemo.entity; import com.yanfei1819.mybatisdemo.db.dto.UserDto; /** * Created by 追梦1819 on 2019-05-05. */ public class UserResponse { private int code; private String msg; private UserDto user; }
其次,创建mapper接口:
package com.yanfei1819.mybatisdemo.db.mapper; import com.yanfei1819.mybatisdemo.db.dto.UserDto; import org.apache.ibatis.annotations.Param; /** * Created by 追梦1819 on 2019-05-05. */ public interface UserMapper { UserDto queryUserByName(@Param("name") String name); }
然后,创建UserMapper文件:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.yanfei1819.mybatisdemo.db.mapper.UserMapper"> <select id="queryUserByName" resultType="com.yanfei1819.mybatisdemo.db.dto.UserDto" parameterType="java.lang.String"> select * from user where `name` = #{name} </select> </mapper>
下面,UserService 接口添加方法:
UserResponse queryUserByName(String name);
UserServiceImpl 类实现:
@Override public UserResponse queryUserByName(String name){ UserDto userDto = userMapper.queryUserByName(name); UserResponse response = new UserResponse(); response.setUser(userDto); response.setCode(0); response.setMsg("success"); return response; }
最后,在 controller 层添加方法:
@ResponseBody @GetMapping("/queryUserByName") public UserResponse queryUserByName(String name){ return userService.queryUserByName(name); }
测试结果
总结
针对上面两种方式,各有优势。注解开发基本上只要@Insert
、@Select
、@Update
、 @Delete
四个注解就可以搞定。配置文件开发只需要在 xxxMapper.xml 维护 sql 即可。
我个人的喜好是,如果是单表操作,或者是工具包,就选择注解方式,因为比较简洁,没有配置文件;如果是多表操作,则选择配置文件的方式,对sql的操作更灵活,扩展性更好。
源码:我的GitHub
<全文完>
更多精彩,请关注公众号:【技术与人生】
本文来自博客园,作者:追梦1819,转载请注明原文链接:https://www.cnblogs.com/yanfei1819/p/10869315.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· [翻译] 为什么 Tracebit 用 C# 开发
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· DeepSeek崛起:程序员“饭碗”被抢,还是职业进化新起点?
· 2分钟学会 DeepSeek API,竟然比官方更好用!
· .NET 使用 DeepSeek R1 开发智能 AI 客户端