1、简述
在现代 Java 开发中,ORM (对象关系映射) 框架是连接数据库与应用程序逻辑的重要工具。MyBatis 是一个流行的 ORM 框架,而 FastMyBatis 是基于 MyBatis 的增强版,它简化了许多常见的开发任务。本文将介绍如何在 Spring Boot 项目中集成 FastMyBatis。
FastMyBatis 是一个mybatis开发框架,其宗旨为:简单、快速、有效:
- 无需编写xml文件即可完成CRUD操作
- 支持mysql,sqlserver,oracle,postgresql,sqlite
- 支持自定义sql,sql语句可写在注解中或xml中
- 支持与spring-boot集成,依赖starter即可
- 轻量级,无侵入性,是官方mybatis的一种扩展
文档介绍地址:https://durcframework.gitee.io/fastmybatis/#/?t=1670849880047
GitHub地址:https://gitee.com/durcframework/fastmybatis
2、添加 FastMyBatis 依赖
如果你更喜欢手动创建项目,可以创建一个新的 Maven 项目,在 pom.xml 文件中添加 FastMyBatis 依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>net.oschina.durcframework</groupId>
<artifactId>fastmybatis-spring-boot-starter</artifactId>
<version>最新版本(见changelog.md)</version>
</dependency>
在 src/main/resources 目录下创建 application.yml 文件,并配置数据库连接信息:
spring:
datasource:
url: jdbc:mysql://localhost:3306/yourdatabase?useSSL=false&serverTimezone=UTC
username: yourusername
password: yourpassword
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
mapper-locations: classpath:mapper/*.xml
3、Mapper 详解
FastMyBatis 中的Mapper提供了一系列增删改查的方法,满足日常所需,完整方法说明如下表所示:
方法 | 说明 |
---|---|
E getByColumn(String column, Object value) | 根据字段查询一条记录 |
E getById(I id) | 根据主键查询 |
E getByQuery(Query query) | 根据条件查找单条记录 |
E getBySpecifiedColumns(List |
查询单条数据并返回指定字段 |
查询单条数据返回指定字段并转换到指定类中 | |
查询某一行某个字段值 | |
long getCount(Query query) | 查询总记录数 |
List |
查询结果集 |
List |
根据多个字段值查询结果集 |
List |
根据字段多个值查询结果集 |
List |
根据字段查询结果集 |
List |
根据多个主键查询 |
List |
查询返回指定的列,返回实体类集合 |
查询返回指定的列,返指定类集合 | |
查询指定列,返指定列集合 | |
PageInfo |
分页查询 |
查询结果集,并转换结果集中的记录,转换处理每一行 | |
查询结果集,并转换结果集中的记录,并对记录进行额外处理 | |
查询结果集,并转换结果集中的记录 | |
查询结果集,并转换结果集中的记录,转换处理list | |
查询返回指定的列,返回分页数据 | |
PageEasyui |
查询返回easyui结果集 |
查询返回easyui结果集,并转换结果集中的记录 | |
E forceById(I id) | 根据主键查询强制查询,忽略逻辑删除字段 |
int save(E entity) | 保存,保存所有字段 |
int saveBatch(Collection |
批量保存 |
int saveIgnoreNull(E entity) | 保存,忽略null字段 |
int saveMultiSet(Collection |
批量保存,兼容更多的数据库版本,忽略重复行,此方式采用union的方式批量insert |
int saveOrUpdate(E entity) | 保存或修改,当数据库存在记录执行UPDATE,否则执行INSERT |
int saveOrUpdateIgnoreNull(E entity) | 保存或修改,忽略null字段,当数据库存在记录执行UPDATE,否则执行INSERT |
int saveUnique(Collection |
批量保存,去除重复行,通过对象是否相对判断重复数据,实体类需要实现equals方法 |
int saveUnique(Collection |
批量保存,去除重复行,指定比较器判断 |
int updateByQuery(E entity, Query query) | 根据条件更新 |
int updateIgnoreNull(E entity) | 更新,忽略null字段 |
int updateByMap(Map<String, Object> map, Query query) | 根据条件更新,map中的数据转化成update语句set部分,key为数据库字段名 |
int delete(E entity) | 删除,在有逻辑删除字段的情况下,做UPDATE操作 |
int deleteByColumn(String column, Object value) | 根据指定字段值删除,在有逻辑删除字段的情况下,做UPDATE操作 |
int deleteById(I id) | 根据id删除,在有逻辑删除字段的情况下,做UPDATE操作 |
int deleteByIds(Collection ids) | 根据多个主键id删除,在有逻辑删除字段的情况下,做UPDATE操作 |
int deleteByQuery(Query query) | 根据条件删除,在有逻辑删除字段的情况下,做UPDATE操作 |
int forceDelete(E entity) | 强制删除(底层根据id删除),忽略逻辑删除字段,执行DELETE语句 |
int forceDeleteById(I id) | 根据id强制删除,忽略逻辑删除字段,执行DELETE语句 |
int forceDeleteByQuery(Query query) | 根据条件强制删除,忽略逻辑删除字段,执行DELETE语句 |
查询结果并转换成Map对象 | |
<T extends TreeNode<T, I>> List |
查询列表并将结果转换成树结构 |
4、创建 Mapper
- 创建实体类
在 src/main/java/com/example/demo/entity 目录下创建一个实体类:
package com.example.demo.entity;
@Table(name="t_user", pk = @Pk(name = "id", strategy = PkStrategy.INCREMENT))
public class User {
private Long id;
private String name;
private Integer age;
// getters and setters
}
- 创建 Mapper 接口
在 src/main/java/com/example/demo/mapper 目录下创建一个 Mapper 接口:
package com.example.demo.mapper;
import com.example.demo.entity.User;
import com.gitee.fastmybatis.core.mapper.CrudMapper;
public interface UserMapper extends CrudMapper<User, Long> {
}
- 创建 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.demo.mapper.UserMapper">
<resultMap id="BaseResultMap" type="com.example.demo.entity.User">
<id column="id" property="id" />
<result column="name" property="name" />
<result column="age" property="age" />
</resultMap>
<sql id="Base_Column_List">
id, name, age
</sql>
<select id="selectById" resultMap="BaseResultMap">
SELECT <include refid="Base_Column_List" />
FROM user
WHERE id = #{id}
</select>
</mapper>
5、创建服务层和控制器
5.1 创建服务层
在 src/main/java/com/example/demo/service 目录下创建一个服务接口和实现类:
- 服务接口
package com.example.demo.service;
import com.example.demo.entity.User;
import java.util.List;
public interface UserService {
User getUserById(Long id);
List<User> getAllUsers();
void saveUser(User user);
void deleteUser(Long id);
}
- 服务实现类
package com.example.demo.service.impl;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public User getUserById(Long id) {
return userMapper.getById(id);
}
@Override
public List<User> getAllUsers() {
return userMapper.list();
}
@Override
public void saveUser(User user) {
userMapper.save(user);
}
@Override
public void deleteUser(Long id) {
userMapper.deleteById(id);
}
}
5.2 创建控制器
在 src/main/java/com/example/demo/controller 目录下创建一个控制器:
package com.example.demo.controller;
import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public User getUserById(@PathVariable Long id) {
return userService.getUserById(id);
}
@GetMapping
public List<User> getAllUsers() {
return userService.getAllUsers();
}
@PostMapping
public void saveUser(@RequestBody User user) {
userService.saveUser(user);
}
@DeleteMapping("/{id}")
public void deleteUser(@PathVariable Long id) {
userService.deleteUser(id);
}
}
6、主键设置
6.1 主键自增
适用于:mysql自增主键、sqlserver自增主键、oracle(触发器)
数据库主键设置自增后,这样设置:
// strategy = PkStrategy.INCREMENT 自增策略
@Table(name = "t_user", pk = @Pk(name = "id", strategy = PkStrategy.INCREMENT))
public class TUser {
}
这样在做insert后,id会自动填充自增后的值。
6.2 主键使用sequence(oracle)
适用于oracle表序列
-- 创建表sequence,名字为t_user_seq
create sequence t_user_seq start with 1 increment by 1;
使用如下注解:
@Table(name = "t_user", pk = @Pk(name = "id", sequenceName = "t_user_seq"))
public class TUser {
}
6.3 主键使用uuid
数据库主键是varchar类型,insert后自动填充uuid,并返回。
@Table(name = "log", pk = @Pk(name = "log_id", strategy = PkStrategy.UUID/*配置主键UUID*/))
public class Log {
private String logId;
}
这样在做insert后,id字段会自动填充uuid。
注:uuid的生成方式是调用数据库底层实现,如MySql的实现方式为: SELECT UUID()
7、总结
本文介绍了如何在 Spring Boot 项目中集成 FastMyBatis。通过这个集成,开发者可以利用 FastMyBatis 简化数据访问层的开发,提高开发效率。如果你有更多问题或想了解更多 FastMyBatis 的高级功能,请参考官方文档或其他相关资源。
评论区