为了账号安全,请及时绑定邮箱和手机立即绑定

Mybatis学习入门教程

标签:
Java SSM 数据库
概述

Mybatis 是一个优秀的持久层框架,支持自定义SQL查询和存储过程,避免了ORM实现的缺点,提供了简洁的API和灵活的配置。本文将详细介绍Mybatis的学习内容,包括环境搭建、核心概念、动态SQL编写、结果集映射以及与Spring的集成,帮助你全面掌握Mybatis。

Mybatis学习入门教程
Mybatis简介

Mybatis的基本概念

Mybatis 是一个优秀的持久层框架,它支持自定义SQL查询、存储过程以及高级映射。Mybatis 避免了典型基于对象/关系映射(ORM)的实现的缺点,如Hibernate,它可以将接口和Java POJO(普通的Java对象)映射到数据库中的记录上。Mybatis 没有对数据库连接进行封装,而是通过配置文件进行数据库连接的管理和操作。

Mybatis的主要特点

  1. 简洁易用:Mybatis 提供了简洁的API,使得SQL的定义和执行变得非常简单。
  2. 灵活配置:Mybatis 可以使用XML配置文件或注解来配置数据库的映射关系。
  3. 支持动态SQL:Mybatis 内置了动态SQL的支持,可以通过标签来编写动态SQL语句。
  4. 优秀的性能:Mybatis 基于JDBC的实现,没有过多的封装,性能优于大多数的ORM框架。

Mybatis的应用场景

  • 需要灵活编写SQL:对于一些复杂业务场景,需要灵活地编写SQL语句。
  • 性能要求高:在一些对性能要求较高的系统中,Mybatis 可以提供更高的性能。
  • 需要兼容多种数据库:Mybatis支持多种数据库,如MySQL、Oracle、SQL Server等。
  • 需要细粒度的控制:Mybatis 允许程序员对SQL进行细粒度的控制,包括返回类型、字段映射等。
Mybatis环境搭建

开发环境准备

为了搭建Mybatis开发环境,首先需要安装JDK环境,并配置好环境变量。然后在IDE中创建一个新的Java项目。

创建项目

使用IDE(如IntelliJ IDEA或Eclipse)新建一个Java项目,命名为mybatis-demo

Maven依赖配置

在项目中添加Mybatis的依赖。可以通过Maven来管理这些依赖。在项目的pom.xml文件中添加以下依赖:

<dependencies>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.6</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.23</version>
    </dependency>
</dependencies>

Mybatis配置文件解析

Mybatis的核心配置文件是mybatis-config.xml。配置文件通常放在项目的resources目录下。以下是一个简单的配置文件示例:

<?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>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
</configuration>
Mybatis核心概念详解

SqlSessionFactory和SqlSession

在Mybatis中,SqlSessionFactory 是一个工厂类,它负责创建SqlSession对象。SqlSession 是一个会话对象,它负责执行SQL语句并返回结果。下面是创建SqlSessionFactorySqlSession 的示例代码:

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.Reader;

public class MybatisDemo {
    public static void main(String[] args) throws IOException {
        String resource = "mybatis-config.xml";
        Reader reader = Resources.getResourceAsReader(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession sqlSession = sqlSessionFactory.openSession();
    }
}

Mapper接口和Mapper XML文件

Mybatis的Mapper接口用来定义SQL语句的映射,而Mapper XML文件用来编写SQL语句,并将SQL语句与Mapper接口的方法进行绑定。以下是一个简单的Mapper接口和对应的XML文件示例:

Mapper接口

public interface UserMapper {
    User getUser(int id);
}

Mapper 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="getUser" resultType="com.example.model.User">
        SELECT * FROM user WHERE id = #{id}
    </select>
</mapper>

Mybatis的第一条查询语句

在上述示例中,我们已经定义了一个简单的Mapper接口和对应的XML文件。下面是如何使用这些定义来执行SQL查询:

import com.example.mapper.UserMapper;
import com.example.model.User;

public class MybatisDemo {
    public static void main(String[] args) throws IOException {
        String resource = "mybatis-config.xml";
        Reader reader = Resources.getResourceAsReader(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = userMapper.getUser(1);
        System.out.println(user);
    }
}

使用SqlSession进行插入、更新和删除操作的示例代码

import com.example.mapper.UserMapper;
import com.example.model.User;

public class MybatisDemo {
    public static void main(String[] args) throws IOException {
        String resource = "mybatis-config.xml";
        Reader reader = Resources.getResourceAsReader(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        // 插入操作
        User newUser = new User(1, "New User");
        userMapper.insertUser(newUser);
        sqlSession.commit();

        // 更新操作
        User updateUser = userMapper.getUser(1);
        updateUser.setName("Updated User");
        userMapper.updateUser(updateUser);
        sqlSession.commit();

        // 删除操作
        userMapper.deleteUser(1);
        sqlSession.commit();
    }
}
Mybatis映射器和映射文件

动态SQL的编写

Mybatis 提供了多种标签来编写动态SQL语句,如 <if>, <choose>, <when>, <otherwise> 等。以下是一个简单的动态SQL示例:

Mapper接口

public interface UserMapper {
    List<User> getUserList(Map<String, Object> params);
}

Mapper XML文件

<mapper namespace="com.example.mapper.UserMapper">
    <select id="getUserList" resultType="com.example.model.User">
        SELECT * FROM user
        <where>
            <if test="id != null">
                AND id = #{id}
            </if>
            <if test="name != null">
                AND name = #{name}
            </if>
        </where>
    </select>
</mapper>

结果集映射

Mybatis 可以通过定义结果映射来处理复杂的结果集,如一对多、多对多等。以下是一个简单的结果映射示例:

User实体类

public class User {
    private int id;
    private String name;
    private List<Order> orders;

    // getters and setters
}

Order实体类

public class Order {
    private int id;
    private String productName;
    private int userId;

    // getters and setters
}

Mapper接口

public interface UserMapper {
    User getUserWithOrders(int id);
}

Mapper XML文件

<mapper namespace="com.example.mapper.UserMapper">
    <resultMap id="userResultMap" type="com.example.model.User">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <collection property="orders" ofType="com.example.model.Order">
            <id property="id" column="order_id"/>
            <result property="productName" column="product_name"/>
            <result property="userId" column="user_id"/>
        </collection>
    </resultMap>

    <select id="getUserWithOrders" resultMap="userResultMap">
        SELECT * FROM user
        LEFT JOIN order ON user.id = order.user_id
        WHERE user.id = #{id}
    </select>
</mapper>

参数及结果类型映射

Mybatis 支持多种参数类型,如基本类型、复杂类型等。以下是一个参数类型映射的示例:

Mapper接口

public interface UserMapper {
    User getUser(Map<String, Object> params);
}

Mapper XML文件

<mapper namespace="com.example.mapper.UserMapper">
    <select id="getUser" parameterType="map" resultType="com.example.model.User">
        SELECT * FROM user WHERE id = #{id}
    </select>
</mapper>
Mybatis与Spring集成

Mybatis与Spring的整合步骤

  1. 依赖配置:在Spring的配置文件中添加Mybatis的依赖。
  2. 创建SqlSessionFactoryBean:使用SqlSessionFactoryBean来创建SqlSessionFactory
  3. 配置数据源:使用DataSource来配置数据库连接。
  4. 创建MapperScannerConfigurer:使用MapperScannerConfigurer来扫描Mapper接口并注册到Spring容器中。

Spring配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx.xsd">

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
    </bean>

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value="classpath:mybatis/mybatis-config.xml"/>
    </bean>

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        <property name="basePackage" value="com.example.mapper"/>
    </bean>

    <tx:annotation-driven transaction-manager="transactionManager"/>

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
</beans>

使用Spring管理SqlSessionFactory

如上所述,通过SqlSessionFactoryBean 可以创建 SqlSessionFactory。然后可以在Spring的配置文件中注入到其他需要的组件中。

示例代码

import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MybatisConfig {
    @Bean
    public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource) throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSource);
        factoryBean.setTypeAliasesPackage("com.example.model");
        return factoryBean;
    }
}

Mybatis注解的使用

Mybatis 提供了注解的方式来定义SQL语句。以下是一个简单的注解示例:

Mapper接口

import org.apache.ibatis.annotations.Select;

public interface UserMapper {
    @Select("SELECT * FROM user WHERE id = #{id}")
    User getUser(int id);
}

注解配置方式

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Component;

@Component
@Mapper
public interface UserMapper {
    @Select("SELECT * FROM user WHERE id = #{id}")
    User getUser(int id);
}
Mybatis常见问题及解决方案

常见错误及解决方法

  1. 找不到SQL语句:确保Mapper XML文件中的SQL语句ID与Mapper接口方法名匹配。

    • 检查Mapper XML文件中的<select>标签的id属性和Mapper接口中的方法名是否一致。
  2. 结果映射错误:检查Mapper XML文件中的结果映射是否正确。

    • 确保<resultMap>中的字段映射与Java实体类的字段一致。
  3. 类型转换错误:确保Mapper XML文件中的resultTyperesultMap与对应的Java实体类匹配。
    • 检查resultTyperesultMap是否正确引用了Java实体类。

性能优化技巧

  1. 使用缓存:Mybatis 提供了一级缓存和二级缓存,可以减少数据库的访问次数。
  2. 批量操作:使用BatchExecutor来执行批量操作,提高性能。
  3. 动态SQL:通过动态SQL减少不必要的SQL语句执行。

Mybatis扩展插件介绍

Mybatis 提供了插件机制,可以对SQL语句进行拦截处理。以下是一个简单的插件示例:

插件实现

import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.plugin.*;

import java.sql.Statement;
import java.util.Properties;

@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})})
public class MyPlugin implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        return invocation.proceed();
    }

    @Override
    public Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }

    @Override
    public void setProperties(Properties properties) {
    }
}

插件配置


<configuration>
    <plugins>
        <plugin interceptor="com.example.plugin.MyPlugin">
            <property name="property1" value="value1"/>
        </plugin>
    </plugins>
</configuration>
``

以上是Mybatis的入门教程,学习和掌握Mybatis不仅可以提高你处理数据库的能力,还能让你在开发中更加灵活和高效。希望本教程对你有所帮助。
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消