SpringBoot第五篇:整合Mybatis

追夢1819發表於2019-05-15

作者:追夢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 中,有兩種方式開發方式:配置檔案開發和註解開發,以下分別介紹兩種模式。

  我們先來做一下準備工作。不管是哪一種開發模式,下面幾步都是相同的:

  1. 都需要對 Mybatis 代理介面進行掃描。在 SpringBoot 專案中,掃描方式有兩種:

1) 在啟動類上加 @MapperScan(value = {"com.sunwin.db.*","com.yanfei1819.mybatisdemo.db"}) 註解;

2) 分別在介面 mapper 上新增 @Mapper 註解;

  上面掃描Mybatis 代理介面的兩種方式的效果一樣,只不過第一種方式是一次性掃描整個包,第二種方式是單獨掃描每個介面。

  1. 初始化資料庫:

    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;
  2. 引入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>
  3. 配置資料庫資訊:

    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

註解開發

  開發之前,先大體瞭解一下專案的結構(這個結構都是自定義的,這裡只是為了演示方便):

SpringBoot第五篇:整合Mybatis

  首先,建立一個實體類:

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測試:

SpringBoot第五篇:整合Mybatis

配置檔案開發

  配置檔案模式開發比註解開發稍稍複雜一點。因為這種模式多了維護 sql 的 mapper.xml 檔案。我將其歸結為下面三步:

  1. 建立代理介面:

  2. 建立介面對映的 xxxMapper.xml 檔案

  3. 在主配置檔案 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);
    }

  測試結果

SpringBoot第五篇:整合Mybatis


總結

  針對上面兩種方式,各有優勢。註解開發基本上只要@Insert@Select@Update@Delete 四個註解就可以搞定。配置檔案開發只需要在 xxxMapper.xml 維護 sql 即可。

  我個人的喜好是,如果是單表操作,或者是工具包,就選擇註解方式,因為比較簡潔,沒有配置檔案;如果是多表操作,則選擇配置檔案的方式,對sql的操作更靈活,擴充套件性更好。



更多精彩,請關注公眾號:【技術與人生】
SpringBoot第五篇:整合Mybatis

相關文章