1、ORM框架理解
ORM (Object-Relational Mapping)对象关系映射:将Java程序中的对象与数据库表之间的关系进行映射。
ORM 框架的主要目的是让开发者能够以面向对象的方式来操作数据库,从而减少了直接使用 SQL 语句所带来的复杂性和潜在错误。
2、MyBatis-Plus
MyBatis-Plus = MyBatis + 增强工具包
- 只做增强,不做改变
- 与MyBatis完全兼容
- 简化开发,提升效率
- 内置通用CRUD操作
- 支持多种数据库
- 提供丰富的扩展功能
2.1 MyBatis-Plus特性
- 无侵入性:不会影响现有MyBatis项目,替换依赖,原有MyBatis代码完全兼容
- 自动CRUD
- 条件构造器:以面向对象的方式构建查询条件
java
QueryWrapper:用于查询操作的条件构造器
UpdateWrapper:用于更新操作的条件构造器
LambdaQueryWrapper:基于Lambda表达式的查询条件构造器
核心方法:
eq(): 等于
ne(): 不等于
gt(): 大于
ge(): 大于等于
lt(): 小于
le(): 小于等于
like(): 模糊匹配
in(): IN查询
orderByAsc() / orderByDesc(): 排序
- 代码生成器:自动生成Entity、Mapper、Service、Controller代码
- 自动填充:自动填充创建时间、更新时间等字段
- 乐观锁:防止并发更新的数据冲突
3、Maven项目中搭建MyBatis-Plus环境
3.1 更新pom.xml依赖
xml
<!-- MyBatis-Plus核心 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>3.5.3</version>
</dependency>
3.2 创建配置文件mybatis-config.xml
xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="jdbc.properties"/>
<!-- 全局设置-->
<settings>
<!-- 开启驼峰命名转换 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- 打印SQL语句 -->
<setting name="logImpl" value="STDOUT_LOGGING"/>
<!-- 开启二级缓存 -->
<setting name="cacheEnabled" value="true"/>
<!-- 延迟加载 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 延迟加载触发方法 -->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
<!-- 定义类型别名,简化 Mapper 中的类名引用-->
<!-- <typeAliases>-->
<!-- 扫描指定包下的所有类并创建别名,方便在 Mapper XML 文件中使用这些类。-->
<!-- <package name="com.hospital.entity"/>-->
<!-- </typeAliases>-->
<!-- 插件-->
<!-- <plugins>-->
<!-- 这是 MyBatis Plus 的总拦截器,用于承载所有内部拦截器 -->
<!-- <plugin interceptor="com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor">-->
<!-- </plugin>-->
<!-- </plugins>-->
<!-- 指定数据库厂商标识,以便 MyBatis 可以根据不同的数据库生成相应的 SQL。-->
<databaseIdProvider type="DB_VENDOR">
<property name="MySQL" value="mysql"/>
</databaseIdProvider>
<!-- 映射器 注册 Mapper 接口,通过包名注册-->
<mappers>
<package name="com.hospital.mapper"/>
</mappers>
</configuration>
3.3 创建工具类MyBatisPlusUtil
java
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import com.zaxxer.hikari.HikariDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class MyBatisPlusUtil1 {
//配置数据源(HikariCP)
public static DataSource dataSource(){
HikariDataSource dataSource = new HikariDataSource();
//从jdbc.properties中读取配置
Properties props = loadJdbcProperties();
dataSource.setJdbcUrl(props.getProperty("jdbc.url"));
dataSource.setUsername(props.getProperty("jdbc.username"));
dataSource.setPassword(props.getProperty("jdbc.password"));
dataSource.setDriverClassName(props.getProperty("jdbc.driver"));
// 完整的连接池配置
dataSource.setMaximumPoolSize(20);
dataSource.setMinimumIdle(5);
dataSource.setConnectionTimeout(30000);
dataSource.setIdleTimeout(600000);
dataSource.setMaxLifetime(1800000);
dataSource.setPoolName("HospitalHikariCP");
return dataSource;
}
private static Properties loadJdbcProperties(){
Properties props = new Properties();
try {
InputStream is = MyBatisPlusUtil1.class.getClassLoader().getResourceAsStream("jdbc.properties");
if (is != null) {
props.load(is);
} else {
//使用默认值
props.setProperty("jdbc.url", "jdbc:mysql://localhost:3306/hospital_db?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8&allowPublicKeyRetrieval=true");
props.setProperty("jdbc.username", "root");
props.setProperty("jdbc.password", "123456");
props.setProperty("jdbc.driver", "com.mysql.cj.jdbc.Driver");
}
}catch (IOException e){
throw new RuntimeException("加载jdbc.properties失败", e);
}
return props;
}
//配置SqlSessionFactory(普通maven项目中,需要手动创建)
public static SqlSessionFactory sqlSessionFactory() throws Exception{
//使用 MybatisSqlSessionFactoryBean(这是 MyBatis-Plus 推荐的)
MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean();
//设置数据源
factoryBean.setDataSource(dataSource());
//创建MybatisConfiguration,由于这里使用配置文件mybatis-config.xml,省略
// MybatisConfiguration configuration = new MybatisConfiguration();
// 设置mybatis-plus.xml文件位置
factoryBean.setConfigLocation(new PathMatchingResourcePatternResolver().getResource("mybatis-config.xml"));
//配置拦截器
factoryBean.setPlugins(mybatisPlusInterceptor());
// 设置mapper.xml文件位置(如果有),也可在配置文件中设置
// factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));
//手动注册mapper,使用配置文件,在配置文件中设置
// configuration.addMapper(UserMapper.class);
// factoryBean.setConfiguration(configuration);
return factoryBean.getObject();
}
//配置MyBatis-Plus插件(分页,乐观锁等)
public static MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//分页插件
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
//乐观锁插件
// interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor;
}
}
3.4 完全使用MyBatis-Plus的配置方式
使用MyBatis配置文件时,要注意和MyBatis-Plus工具类避免配置冲突
java
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.core.toolkit.GlobalConfigUtils;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import com.hospital.mapper.UserMapper;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.apache.ibatis.logging.stdout.StdOutImpl;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.type.JdbcType;
import javax.sql.DataSource;
import java.io.InputStream;
import java.util.Properties;
//完全使用MyBatis-Plus的配置方式
public class MyBatisPlusUtil {
/**
* 获取 SqlSessionFactory
*/
public static SqlSessionFactory getSqlSessionFactory() throws Exception {
System.out.println("=== 创建 SqlSessionFactory ===");
// 1. 创建数据源
DataSource dataSource = createDataSource();
// 2. ✅ 使用 MybatisSqlSessionFactoryBean(这是 MyBatis-Plus 推荐的)
MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
// 3. 创建 MybatisConfiguration
MybatisConfiguration configuration = new MybatisConfiguration();
configuration.setMapUnderscoreToCamelCase(true);
configuration.setCacheEnabled(false);
configuration.setJdbcTypeForNull(JdbcType.NULL);
configuration.setLogImpl(StdOutImpl.class);
// 4. ✅ 关键:设置配置
factoryBean.setConfiguration(configuration);
// 5. ✅ 关键:创建并配置 MyBatis Plus 拦截器
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
factoryBean.setPlugins(interceptor);
// 6. ✅ 关键:设置全局配置
GlobalConfig globalConfig = GlobalConfigUtils.defaults();
factoryBean.setGlobalConfig(globalConfig);
// 7. ✅ 关键:设置实体类包
factoryBean.setTypeAliasesPackage("com.hospital.entity");
// 8. ✅ 关键:手动注册 Mapper
configuration.addMapper(UserMapper.class);
// 9. 构建 SqlSessionFactory
return factoryBean.getObject();
}
/**
* 创建数据源
*/
private static DataSource createDataSource() {
Properties props = loadProperties();
HikariConfig config = new HikariConfig();
config.setJdbcUrl(props.getProperty("jdbc.url"));
config.setUsername(props.getProperty("jdbc.username"));
config.setPassword(props.getProperty("jdbc.password"));
config.setDriverClassName(props.getProperty("jdbc.driver"));
// 连接池配置
config.setMaximumPoolSize(20);
config.setMinimumIdle(5);
config.setConnectionTimeout(30000);
config.setIdleTimeout(600000);
config.setMaxLifetime(1800000);
config.setPoolName("HospitalHikariCP");
return new HikariDataSource(config);
}
/**
* 加载配置文件
*/
private static Properties loadProperties() {
Properties props = new Properties();
try (InputStream is = MyBatisPlusUtil.class.getClassLoader()
.getResourceAsStream("jdbc.properties")) {
if (is != null) {
props.load(is);
System.out.println("加载配置文件成功");
} else {
// 使用默认值
props.setProperty("jdbc.url",
"jdbc:mysql://localhost:3306/hospital_db?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8&allowPublicKeyRetrieval=true");
props.setProperty("jdbc.username", "root");
props.setProperty("jdbc.password", "123456");
props.setProperty("jdbc.driver", "com.mysql.cj.jdbc.Driver");
System.out.println("使用默认数据库配置");
}
} catch (Exception e) {
throw new RuntimeException("加载jdbc.properties失败", e);
}
return props;
}
}