MyBatis-Plus入门

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;
    }
}
相关推荐
木井巳1 小时前
【递归算法】找出所有子集的异或总和再求和
java·算法·leetcode·决策树·深度优先
悟空码字1 小时前
【保姆级】实现APP分享至微信,看完就能落地
java·后端·微信
常利兵1 小时前
Android 开发探秘:View.post()为何能获取View宽高
java·数据库·sql
闭关苦炼内功1 小时前
使用Java语言实现二分查找
java·开发语言
毕设源码-郭学长1 小时前
【开题答辩全过程】以 基于Spring Boot“活力青春”健身房管理系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
m0_475064501 小时前
Spring AI RAG简易demo
java·人工智能·spring
xht08321 小时前
PHP vs C++:编程语言终极对决
java·开发语言
少司府2 小时前
C++基础入门:第一个C++程序
java·c语言·开发语言·c++·ide
液态不合群2 小时前
一文学习 Spring 声明式事务源码全流程总结
java·学习·spring