Springboo 和ORM整合
Springboot-Mybatis集成
MyBatis 是一个持久层框架,它简化了 Java 应用程序与数据库之间的交互。通过 MyBatis,开发者可以专注于 SQL 语句的编写,而不需要处理繁琐的 JDBC 代码。以下是关于 MyBatis 的一些关键概念和使用技巧:
核心组件
- SQL 映射文件 (Mapper XML):这是 MyBatis 中定义 SQL 语句的地方,可以包含查询、插入、更新和删除等操作。
- 接口(Mapper Interface):映射到 SQL 映射文件的方法,通常每个方法对应一条 SQL 语句。
- SqlSessionFactory:负责创建 SqlSession 对象,它是 MyBatis 的核心类,用于执行命令。
- SqlSession:提供了与数据库交互的方法,比如
selectOne
、selectList
、insert
、update
和delete
。
Springboot配置文件
MyBatis 的配置可以通过 XML 文件或者 Java 配置类完成。主要配置包括数据源、事务管理器、类型别名、插件和其他设置。
<dependencies>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter-test</artifactId>
<version>3.0.3</version>
<scope>test</scope>
</dependency>
</dependencies>
application.yml配置
server:
port: 8000
spring:
application:
name: springboot-mybatis-demo
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: 123456
mybatis:
mapper-locations: classpath:/mapper/*.xml
logging:
level:
com.coderlk.demo.mapper: debug
示例
Employee 实体类
package com.coderlk.interceptor.demo.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Employee {
private Integer empno;
private String ename;
private String job;
private Integer mgr;
private Date hiredate;
private Float sal;
private Float comm;
private Integer deptno;
}
EmployeeMapper
package com.coderlk.interceptor.demo.mapper;
import com.coderlk.interceptor.demo.entity.Employee;
import java.util.List;
public interface EmployeeMapper {
List<Employee> selectAll();
}
EmployeeMapper.xml
/resources/mapper/EmployeeMapper.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.coderlk.interceptor.demo.mapper.EmployeeMapper">
<select id="selectAll" resultType="com.coderlk.interceptor.demo.entity.Employee">
select * from emp
</select>
</mapper>
测试
package com.coderlk.interceptor.demo.mapper;
import com.coderlk.interceptor.demo.InterceptorDemoApplication;
import com.coderlk.interceptor.demo.entity.Employee;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest(classes = InterceptorDemoApplication.class)
@Slf4j
class EmployeeMapperTest {
@Resource
private EmployeeMapper employeeMapper;
@Test
void selectAll() {
List<Employee> employees = employeeMapper.selectAll();
log.info("{}",employees);
}
}
执行结果
2024-12-20T10:54:23.482+08:00 INFO 88800 --- [interceptor-demo] [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2024-12-20T10:54:23.567+08:00 INFO 88800 --- [interceptor-demo] [ main] c.c.i.demo.mapper.EmployeeMapperTest : [Employee(empno=7369, ename=SMITH, job=CLERK, mgr=7902, hiredate=Wed Dec 17 00:00:00 CST 1980, sal=800.0, comm=null, deptno=20), Employee(empno=7499, ename=ALLEN, job=SALESMAN, mgr=7698, hiredate=Fri Feb 20 00:00:00 CST 1981, sal=1600.0, comm=300.0, deptno=30), Employee(empno=7521, ename=WARD, job=SALESMAN, mgr=7698, hiredate=Sun Feb 22 00:00:00 CST 1981, sal=1250.0, comm=500.0, deptno=30), Employee(empno=7566, ename=JONES, job=MANAGER, mgr=7839, hiredate=Thu Apr 02 00:00:00 CST 1981, sal=2975.0, comm=null, deptno=20), Employee(empno=7654, ename=MARTIN, job=SALESMAN, mgr=7698, hiredate=Mon Sep 28 00:00:00 CST 1981, sal=1250.0, comm=1400.0, deptno=30), Employee(empno=7698, ename=BLAKE, job=MANAGER, mgr=7839, hiredate=Fri May 01 00:00:00 CST 1981, sal=2850.0, comm=null, deptno=30), Employee(empno=7782, ename=CLARK, job=MANAGER, mgr=7839, hiredate=Tue Jun 09 00:00:00 CST 1981, sal=2450.0, comm=null, deptno=10), Employee(empno=7788, ename=SCOTT, job=ANALYST, mgr=7566, hiredate=Mon Jul 13 00:00:00 CDT 1987, sal=3000.0, comm=null, deptno=20), Employee(empno=7839, ename=KING, job=PRESIDENT, mgr=null, hiredate=Tue Nov 17 00:00:00 CST 1981, sal=5000.0, comm=null, deptno=10), Employee(empno=7844, ename=TURNER, job=SALESMAN, mgr=7698, hiredate=Tue Sep 08 00:00:00 CST 1981, sal=1500.0, comm=null, deptno=30), Employee(empno=7876, ename=ADAMS, job=CLERK, mgr=7788, hiredate=Mon Jul 13 00:00:00 CDT 1987, sal=1100.0, comm=null, deptno=20), Employee(empno=7900, ename=JAMES, job=CLERK, mgr=7698, hiredate=Thu Dec 03 00:00:00 CST 1981, sal=950.0, comm=null, deptno=30), Employee(empno=7902, ename=FORD, job=ANALYST, mgr=7566, hiredate=Thu Dec 03 00:00:00 CST 1981, sal=3000.0, comm=null, deptno=20), Employee(empno=7934, ename=MILLER, job=CLERK, mgr=7782, hiredate=Sat Jan 23 00:00:00 CST 1982, sal=1300.0, comm=null, deptno=10)]
Springboot-MybatisPlus集成
MyBatis-Plus (简称 MP) 是 MyBatis 的增强工具,旨在简化开发人员在使用 MyBatis 时的一些重复性工作。它提供了许多便捷的功能,如代码生成器、分页插件、条件构造器等,使得数据库操作更加高效和简单。以下是关于 MyBatis-Plus 的一些关键特性和使用方法:
核心特性
- 无侵入:只做增强不做改变,引入它不会对现有 MyBatis 的代码产生影响。
- 性能敏感:内置全局配置可选择是否开启 SQL 性能分析插件,防止全表更新与删除。
- 开箱即用:提供默认的 CRUD 操作,无需编写 XML 文件。
- 支持 ActiveRecord:允许直接在实体类中调用持久层方法。
- 内置分页插件:可以轻松实现分页查询。
- 多租户支持:通过简单的配置即可实现多租户功能。
- 代码生成器:快速生成 Mapper、Service 等基础代码。
添加依赖
对于 Maven 项目,在 pom.xml
中添加 MyBatis-Plus 的依赖xml
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.2</version>
</dependency>
使用 MyBatis-Plus提供的接口
继承 BaseMapper<T>
接口以获得基本的 CRUD 方法,或者使用 IService<T>
和 ServiceImpl<M, T>
来获取更高级的服务方法。
java
package com.coderlk.interceptor.demo.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.coderlk.interceptor.demo.entity.Employee;
import java.util.List;
public interface EmployeeMapper extends BaseMapper<Employee> {
}
java
package com.coderlk.interceptor.demo.service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.coderlk.interceptor.demo.entity.Employee;
import com.coderlk.interceptor.demo.mapper.EmployeeMapper;
import org.springframework.stereotype.Service;
@Service
public class EmployeeService extends ServiceImpl<EmployeeMapper, Employee> {
//可添加外部依赖逻辑
}
分页查询
使用 Page<T>
对象来进行分页查询。
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
IPage<Employee> page = new Page<>(currentPage, pageSize);
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
IPage<Employee> employeePage = userMapper.selectPage(page, queryWrapper);
其他特性
- 自动填充:可以通过注解或配置类来设置字段的自动填充规则。
- 乐观锁:支持基于版本号的乐观锁机制。
- 逻辑删除:可以配置使某些记录被标记为已删除而不是物理删除。
- 条件构造器:提供了一套流畅 API 来构建复杂的查询条件。
测试建表使用的mysql表
DROP TABLE IF EXISTS `emp`;
CREATE TABLE `emp` (
`empno` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`ename` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`job` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`mgr` int(10) UNSIGNED NULL DEFAULT NULL,
`hiredate` date NULL DEFAULT NULL,
`sal` decimal(7, 2) NULL DEFAULT NULL,
`comm` decimal(7, 2) NULL DEFAULT NULL,
`deptno` int(10) UNSIGNED NULL DEFAULT NULL,
PRIMARY KEY (`empno`) USING BTREE,
INDEX `deptno`(`deptno`) USING BTREE
) ENGINE = InnoDB;