博客列表 >27、【转载】Spring Boot整合MyBatis

27、【转载】Spring Boot整合MyBatis

自由之上
自由之上原创
2022年11月13日 09:00:42571浏览

MyBatis 是一个半自动化的 ORM 框架,所谓半自动化是指 MyBatis 只支持将数据库查出的数据映射到 POJO 实体类上,而实体到数据库的映射则需要我们自己编写 SQL 语句实现,相较于Hibernate 这种完全自动化的框架,Mybatis 更加灵活,我们可以根据自身的需求编写 sql 语句来实现复杂的数据库操作。

随着 Spring Boot 越来越流行,越来越多的被厂商及开发者所认可,MyBatis 也开发了一套基于 Spring Boot 模式的 starter:mybatis-spring-boot-starter。本节我们就介绍下如何在 Spring Boot 项目中整合 MyBatis。

1、引入依赖

Spring Boot 整合 MyBatis 的第一步,就是在项目的 pom.xml 中引入 mybatis-spring-boot-starter 的依赖,示例代码如下。

  1. <!--引入 mybatis-spring-boot-starter 的依赖-->
  2. <dependency>
  3. <groupId>org.mybatis.spring.boot</groupId>
  4. <artifactId>mybatis-spring-boot-starter</artifactId>
  5. <version>2.2.0</version>
  6. </dependency>

2、配置 MyBatis

在 Spring Boot 的配置文件(application.properties/yml)中对 MyBatis 进行配置,例如指定 mapper.xml 的位置、实体类的位置、是否开启驼峰命名法等等,示例代码如下。

  1. ###################################### MyBatis 配置######################################
  2. mybatis:
  3. # 指定 mapper.xml 的位置
  4. mapper-locations: classpath:mybatis/mapper/*.xml
  5. #扫描实体类的位置,在此处指明扫描实体类的包,在 mapper.xml 中就可以不写实体类的全路径名
  6. type-aliases-package: net.biancheng.www.bean
  7. configuration:
  8. #默认开启驼峰命名法,可以不用设置该属性
  9. map-underscore-to-camel-case: true

注意:使用 MyBatis 时,必须配置数据源信息,例如数据库 URL、数据库用户型、数据库密码和数据库驱动等。

3、创建实体类

在指定的数据库内创建一个 user 表,并插入一些数据,如下表。

id user_id user_name password email
1 001 admin admin 1234567@qq.com
2 002 user 123456 987654@qq.com
3 003 bianchengbang qwertyuiop bianchengbang@sina.com

根据数据库 user 表,创建相应的实体类 User,代码如下。

  1. package net.biancheng.www.bean;
  2. public class User {
  3. private Integer id;
  4. private String userId;
  5. private String userName;
  6. private String password;
  7. private String email;
  8. public Integer getId() {
  9. return id;
  10. }
  11. public void setId(Integer id) {
  12. this.id = id;
  13. }
  14. public String getUserId() {
  15. return userId;
  16. }
  17. public void setUserId(String userId) {
  18. this.userId = userId == null ? null : userId.trim();
  19. }
  20. public String getUserName() {
  21. return userName;
  22. }
  23. public void setUserName(String userName) {
  24. this.userName = userName == null ? null : userName.trim();
  25. }
  26. public String getPassword() {
  27. return password;
  28. }
  29. public void setPassword(String password) {
  30. this.password = password == null ? null : password.trim();
  31. }
  32. public String getEmail() {
  33. return email;
  34. }
  35. public void setEmail(String email) {
  36. this.email = email == null ? null : email.trim();
  37. }
  38. }

4、创建 Mapper 接口

在 net.biancheng.www.mapper 中创建一个 UserMapper 接口,并在该类上使用 @Mapper 注解,代码如下。

  1. package net.biancheng.www.mapper;
  2. import net.biancheng.www.bean.User;
  3. import org.apache.ibatis.annotations.Mapper;
  4. @Mapper
  5. public interface UserMapper {
  6. //通过用户名密码查询用户数据
  7. User getByUserNameAndPassword(User user);
  8. }

当 mapper 接口较多时,我们可以在 Spring Boot 主启动类上使用 @MapperScan 注解扫描指定包下的 mapper 接口,而不再需要在每个 mapper 接口上都标注 @Mapper 注解。

5、创建 Mapper 映射文件

在配置文件 application.properties/yml 通过 mybatis.mapper-locations 指定的位置中创建 UserMapper.xml,代码如下。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="net.biancheng.www.mapper.UserMapper">
  4. <resultMap id="BaseResultMap" type="User">
  5. <id column="id" jdbcType="INTEGER" property="id"/>
  6. <result column="user_id" jdbcType="VARCHAR" property="userId"/>
  7. <result column="user_name" jdbcType="VARCHAR" property="userName"/>
  8. <result column="password" jdbcType="VARCHAR" property="password"/>
  9. <result column="email" jdbcType="VARCHAR" property="email"/>
  10. </resultMap>
  11. <sql id="Base_Column_List">
  12. id, user_id, user_name, password, email
  13. </sql>
  14. <!--根据用户名密码查询用户信息-->
  15. <!--application.yml 中通过 type-aliases-package 指定了实体类的为了,因此-->
  16. <select id="getByUserNameAndPassword" resultType="User">
  17. select *
  18. from user
  19. where user_name = #{userName,jdbcType=VARCHAR}
  20. and password = #{password,jdbcType=VARCHAR}
  21. </select>
  22. </mapper>

使用 Mapper 进行开发时,需要遵循以下规则:

  • mapper 映射文件中 namespace 必须与对应的 mapper 接口的完全限定名一致。
  • mapper 映射文件中 statement 的 id 必须与 mapper 接口中的方法的方法名一致
  • mapper 映射文件中 statement 的 parameterType 指定的类型必须与 mapper 接口中方法的参数类型一致。
  • mapper 映射文件中 statement 的 resultType 指定的类型必须与 mapper 接口中方法的返回值类型一致。
    示例 1
    1、在 spring-boot-adminex 项目中 net.biancheng.www.service 包中创建一个名为 UserService 的接口,代码如下。
  1. package net.biancheng.www.service;
  2. import net.biancheng.www.bean.User;
  3. public interface UserService {
  4. public User getByUserNameAndPassword(User user);
  5. }

2、在 net.biancheng.www.service.impl 包中创建 UserService 接口的实现类,并使用 @Service 注解将其以组件的形式添加到容器中,代码如下。

  1. package net.biancheng.www.service.impl;
  2. import net.biancheng.www.bean.User;
  3. import net.biancheng.www.mapper.UserMapper;
  4. import net.biancheng.www.service.UserService;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.stereotype.Service;
  7. @Service("userService")
  8. public class UserServiceImpl implements UserService {
  9. @Autowired
  10. UserMapper userMapper;
  11. @Override
  12. public User getByUserNameAndPassword(User user) {
  13. User loginUser = userMapper.getByUserNameAndPassword(user);
  14. return loginUser;
  15. }
  16. }

3、修改 LoginController 中的 doLogin() 方法 ,代码如下。

  1. package net.biancheng.www.controller;
  2. import lombok.extern.slf4j.Slf4j;
  3. import net.biancheng.www.bean.User;
  4. import net.biancheng.www.service.UserService;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.stereotype.Controller;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import javax.servlet.http.HttpSession;
  9. import java.util.Map;
  10. @Slf4j
  11. @Controller
  12. public class LoginController {
  13. @Autowired
  14. UserService userService;
  15. @RequestMapping("/user/login")
  16. public String doLogin(User user, Map<String, Object> map, HttpSession session) {
  17. //从数据库中查询用户信息
  18. User loginUser = userService.getByUserNameAndPassword(user);
  19. if (loginUser != null) {
  20. session.setAttribute("loginUser", loginUser);
  21. log.info("登陆成功,用户名:" + loginUser.getUserName());
  22. //防止重复提交使用重定向
  23. return "redirect:/main.html";
  24. } else {
  25. map.put("msg", "用户名或密码错误");
  26. log.error("登陆失败");
  27. return "login";
  28. }
  29. }
  30. }

4、启动 Spring Boot,浏览器地址栏输入“http://localhost:8080/” ,访问 AdminEx 系统的登陆页面,分别输入用户名“user”和密码“123456”,结果下图。

图1:登陆页

5、点击登陆按钮,结果如下图。

图2:登陆成功

6、注解方式
通过上面的学习,我们知道 mapper 映射文件其实就是一个 XML 配置文件,它存在 XML 配置文件的通病,即编写繁琐,容易出错。即使是一个十分简单项目,涉及的 SQL 语句也都十分简单,我们仍然需要花费一定的时间在mapper 映射文件的配置上。

为了解决这个问题,MyBatis 针对实际实际业务中使用最多的“增删改查”操作,分别提供了以下注解来替换 mapper 映射文件,简化配置:

通过以上注解,基本可以满足我们对数据库的增删改查操作,示例代码如下。

  1. package net.biancheng.www.mapper;
  2. import net.biancheng.www.bean.User;
  3. import org.apache.ibatis.annotations.*;
  4. import java.util.List;
  5. @Mapper
  6. public interface UserMapper {
  7. @Select("select * from user where user_name = #{userName,jdbcType=VARCHAR} and password = #{password,jdbcType=VARCHAR}")
  8. List<User> getByUserNameAndPassword(User user);
  9. @Delete("delete from user where id = #{id,jdbcType=INTEGER}")
  10. int deleteByPrimaryKey(Integer id);
  11. @Insert("insert into user ( user_id, user_name, password, email)" +
  12. "values ( #{userId,jdbcType=VARCHAR}, #{userName,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}, #{email,jdbcType=VARCHAR})")
  13. int insert(User record);
  14. @Update(" update user" +
  15. " set user_id = #{userId,jdbcType=VARCHAR},\n" +
  16. " user_name = #{userName,jdbcType=VARCHAR},\n" +
  17. " password = #{password,jdbcType=VARCHAR},\n" +
  18. " email = #{email,jdbcType=VARCHAR}\n" +
  19. " where id = #{id,jdbcType=INTEGER}")
  20. int updateByPrimaryKey(User record);
  21. }

注意事项
mapper 接口中的任何一个方法,都只能使用一种配置方式,即注解和 mapper 映射文件二选一,但不同方法之间,这两种方式则可以混合使用,例如方法 1 使用注解方式,方法 2 使用 mapper 映射文件方式。

我们可以根据 SQL 的复杂程度,选择不同的方式来提高开发效率。
如果没有复杂的连接查询,我们可以使用注解的方式来简化配置;
如果涉及的 sql 较为复杂时,则使用 XML (mapper 映射文件)的方式更好一些。


加入
QQ群:722461036
微信群:
一起督促、学习、练习、温习、复习 ~ ~ ~

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议