作者:追夢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
<全文完>
更多精彩,請關注公眾號:【技術與人生】