整合 MyBatis 到 Spring 或 Spring Boot 項目中,可以極大地簡化開發流程,尤其是當使用 Spring Boot 時,它提供了自動配置功能,使得集成更加簡便。
在 Spring Boot 中整合 MyBatis
1. 添加依賴
首先,在 pom.xml
文件中添加必要的依賴項。對于 Spring Boot 項目,你可以使用 spring-boot-starter-mybatis
:
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.0</version> <!-- 請根據需要調整版本 -->
</dependency><!-- 數據庫驅動 -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope>
</dependency>
2. 配置數據源
在 application.yml
或 application.properties
文件中配置數據庫連接信息:
spring:datasource:url: jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTCusername: rootpassword: passworddriver-class-name: com.mysql.cj.jdbc.Drivermybatis:mapper-locations: classpath:mapper/*.xml # XML 映射文件的位置type-aliases-package: com.example.demo.model # 實體類所在的包
3. 創建實體類和 Mapper 接口
假設我們有一個用戶表 users
,我們需要創建對應的實體類和 Mapper 接口。
User.java
package com.example.demo.model;public class User {private Long id;private String name;private Integer age;// Getters and Setters...
}
UserMapper.java
package com.example.demo.mapper;import com.example.demo.model.User;
import org.apache.ibatis.annotations.*;@Mapper // 標記這是一個 MyBatis 的 Mapper 接口
public interface UserMapper {@Select("SELECT * FROM users WHERE id = #{id}")User findById(@Param("id") Long id);@Insert("INSERT INTO users(name, age) VALUES(#{name}, #{age})")void insert(User user);
}
4. 使用 Mapper
在服務層或控制器中注入并使用 UserMapper
:
UserService.java
package com.example.demo.service;import com.example.demo.mapper.UserMapper;
import com.example.demo.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public User getUserById(Long id) {return userMapper.findById(id);}public void createUser(User user) {userMapper.insert(user);}
}
5. 運行應用程序
確保你的數據庫已經準備好,并且與配置中的數據庫名稱、用戶名和密碼相匹配。然后運行 Spring Boot 應用程序,嘗試調用服務方法來驗證是否能夠正常工作。
在傳統 Spring 項目中整合 MyBatis
如果你正在使用傳統的 Spring 項目而非 Spring Boot,則需要手動進行更多的配置。
1. 添加依賴
在 pom.xml
文件中添加 MyBatis 和 Spring 的相關依賴:
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.7</version>
</dependency>
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>2.0.6</version>
</dependency>
2. 配置 SqlSessionFactoryBean
在 Spring 配置文件中配置 SqlSessionFactoryBean
:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"/><property name="mapperLocations" value="classpath:mapper/*.xml"/>
</bean><bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"><property name="mapperInterface" value="com.example.mapper.UserMapper"/><property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
3. 編寫 Mapper XML 文件
在 src/main/resources/mapper/
目錄下創建 UserMapper.xml
文件:
<?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.example.mapper.UserMapper"><select id="findById" parameterType="long" resultType="com.example.model.User">SELECT * FROM users WHERE id = #{id}</select><insert id="insert" parameterType="com.example.model.User">INSERT INTO users(name, age) VALUES(#{name}, #{age})</insert>
</mapper>
4. 注入并使用 Mapper
在服務層或其他地方通過 Spring 注解或 XML 配置注入并使用 Mapper。
無論是 Spring Boot 還是傳統的 Spring 項目,MyBatis 提供了靈活的接口和配置選項來滿足不同的需求。Spring Boot 由于其自動配置特性,通常會使集成過程更為簡潔快速。希望這些示例能幫助你更好地理解和實施 MyBatis 與 Spring/Spring Boot 的整合。
MyBatis-Plus 簡介
MyBatis-Plus 是 MyBatis 的增強工具,旨在簡化開發、提高效率的同時不損失靈活性。它在 MyBatis 的基礎上只做增強而不做改變,為簡化開發工作、提高效率而生。下面將詳細介紹 MyBatis-Plus 的核心功能、使用方法以及與 Spring Boot 的整合。
核心特性
- 無侵入:引入 MyBatis-Plus 不會對現有的 MyBatis 結構造成任何影響。
- 低損耗:啟動即會自動注入基本 CURD,性能幾乎無損耗,直接面向對象操作。
- 通用 CRUD:內置通用 Mapper、通用 Service,僅需簡單配置即可實現單表大部分 CRUD 操作,更有強大的條件構造器,滿足各類使用需求。
- 多種主鍵策略:支持多達 7 種主鍵策略(內含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解決主鍵問題。
- 支持 Lambda 形式調用:通過 Lambda 表達式,方便地編寫查詢條件,無需擔心字段名寫錯。
- 內置分頁插件:基于 MyBatis 物理分頁,開發者無需關心具體操作。
- 代碼生成器:支持根據數據庫表結構自動生成實體類、Mapper、Service、Controller 等相關代碼,減少重復勞動。
- 自定義全局通用操作:支持通用接口注入,可以在不修改原有代碼的情況下擴展功能。
快速入門
1. 添加依賴
在 pom.xml
文件中添加 MyBatis-Plus 的依賴:
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.2</version> <!-- 請根據需要調整版本 -->
</dependency>
2. 配置數據源
在 application.yml
中配置數據源信息:
spring:datasource:url: jdbc:mysql://localhost:3306/your_database?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghaiusername: rootpassword: your_passworddriver-class-name: com.mysql.cj.jdbc.Drivermybatis-plus:mapper-locations: classpath:/mapper/*.xmltype-aliases-package: com.your.package.model
3. 創建實體類和 Mapper 接口
假設有一個用戶表 users
,我們可以創建對應的實體類和繼承了 BaseMapper
的 Mapper 接口。
User.java
package com.example.model;import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;@TableName("users")
public class User {@TableIdprivate Long id;private String name;private Integer age;// Getters and Setters...
}
UserMapper.java
package com.example.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.model.User;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface UserMapper extends BaseMapper<User> {// 繼承 BaseMapper 后已經包含了基本的 CRUD 方法,無需額外定義
}
4. 使用 Mapper
在服務層或控制器中注入并使用 UserMapper
:
UserService.java
package com.example.service;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.mapper.UserMapper;
import com.example.model.User;
import org.springframework.stereotype.Service;@Service
public class UserService extends ServiceImpl<UserMapper, User> {// 直接繼承 ServiceImpl 即可獲得基礎的 CRUD 能力
}
5. 測試
可以通過編寫測試用例來驗證是否能夠正常進行數據庫操作:
@Autowired
private UserService userService;@Test
void testCRUD() {// 新增User user = new User();user.setName("John");user.setAge(25);userService.save(user);// 查詢User retrievedUser = userService.getById(user.getId());System.out.println(retrievedUser.getName());// 更新retrievedUser.setAge(26);userService.updateById(retrievedUser);// 刪除userService.removeById(user.getId());
}
高級功能
條件構造器(Wrapper)
MyBatis-Plus 提供了強大的條件構造器 QueryWrapper
和 UpdateWrapper
,可以用來構建復雜的查詢和更新條件。
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "John").gt("age", 20);
List<User> userList = userService.list(queryWrapper);
分頁插件
MyBatis-Plus 內置了分頁插件,使用起來非常方便。
Page<User> page = new Page<>(currentPage, pageSize);
IPage<User> userPage = userService.page(page, queryWrapper);
System.out.println("總記錄數:" + userPage.getTotal());
System.out.println("當前頁數據:" + userPage.getRecords());
自動填充功能
對于創建時間、更新時間等字段,可以使用自動填充功能來避免手動設置。
首先,在實體類中使用注解指定填充策略:
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
然后,創建一個處理器類實現 MetaObjectHandler
接口,并重寫相應的方法:
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());}@Overridepublic void updateFill(MetaObject metaObject) {this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());}
}