Blogger Information
Blog 41
fans 0
comment 0
visits 25311
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
27、【转载】Spring Boot整合MyBatis
自由之上
Original
575 people have browsed it

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
微信群:
一起督促、学习、练习、温习、复习 ~ ~ ~

Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post