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

MyBatis资料:初级用户入门教程

标签:
Java SSM 数据库
概述

MyBatis是一款优秀的持久层框架,支持自定义SQL查询和高级映射,避免了手动设置参数和获取结果集的繁琐操作。本文详细介绍了MyBatis的特点、环境搭建、核心概念以及与Spring的集成,旨在为读者提供全面的MyBatis资料。

MyBatis简介

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL 查询,存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的繁琐操作。MyBatis可以使用简单的 XML 或注解进行配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。

MyBatis的特点和优势

MyBatis 的优势主要包括:

  • 简单易用: MyBatis 通过 XML 或注解进行配置和原始映射,使开发者能够轻松地执行 CRUD 操作。
  • 灵活性: MyBatis 允许使用自定义的 SQL 语句和存储过程,这为开发者提供了极大的灵活性。
  • 高性能: 由于 MyBatis 直接调用 JDBC API,性能上比 Hibernate 和 iBatis 更好。
  • 支持高级映射: MyBatis 支持多对一、一对多、多对多的关联映射,支持嵌套查询和嵌套更新。
  • 易于维护: MyBatis 的 XML 映射文件与代码分离,易于维护。
  • 易于扩展: MyBatis 可以通过插件进行扩展,满足项目中的需要。
MyBatis环境搭建

在开始使用 MyBatis 之前,需要搭建开发环境,并下载和配置 MyBatis。

开发环境要求
  • Java 开发环境: 需要安装 JDK,建议使用 JDK 1.8 及以上版本。
  • 开发工具: 可以使用 IntelliJ IDEA、Eclipse 或其他 Java 开发工具。
  • 数据库: MyBatis 支持多种数据库,例如 MySQL、Oracle、SQL Server 等。确保数据库服务已经启动并可访问。
  • Maven 或 Gradle: 用于管理项目的依赖关系。
下载和配置MyBatis
  1. 创建一个新的 Maven 项目:

    • 打开你的开发工具,例如 IntelliJ IDEA 或 Eclipse。
    • 创建一个新的 Maven 项目。确保项目中包含 pom.xml 文件。
  2. 添加依赖:

    • pom.xml 文件中添加 MyBatis 依赖。以下是一个示例:
    <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.26</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
  3. 配置数据库连接:

    • 在项目的 resources 目录中创建 mybatis-config.xml 文件,并配置数据库连接信息。
    <?xml version="1.0" encoding="UTF-8"?>
    <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/mydb"/>
                    <property name="username" value="root"/>
                    <property name="password" value="password"/>
                </dataSource>
            </environment>
        </environments>
    </configuration>

    上述配置文件中定义了数据库连接信息,包括驱动、URL、用户名和密码。

  4. 编写测试代码:

    • 创建一个简单的 Java 类来测试数据库连接。
    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.InputStream;
    
    public class MyBatisDemo {
        public static void main(String[] args) {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    
            try (SqlSession session = sqlSessionFactory.openSession()) {
                // 执行查询操作
                String sql = "SELECT * FROM user";
                session.selectList(sql);
            }
        }
    }

    上述代码中,我们使用 MyBatis 提供的 SqlSessionFactorySqlSession 对象来执行 SQL 查询。

MyBatis核心概念

MyBatis 的核心概念包括 SqlSessionSqlSessionFactory,以及 Mapper 接口和 XML 配置。

SqlSession和SqlSessionFactory
  • SqlSessionFactory: SqlSessionFactory 是 MyBatis 的核心接口之一,它是一个工厂类,用于创建 SqlSession 对象。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 创建。例如:

    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
  • SqlSession: SqlSession 提供了执行数据库操作的方法,包括增删改查等。SqlSession 可以通过 SqlSessionFactoryopenSession 方法获取。例如:

    SqlSession session = factory.openSession();
  • Session 的生命周期: SqlSession 的生命周期可以分为两种模式:自动提交和手动提交。手动提交模式需要显式调用 commitrollback 方法。自动提交模式会在执行操作后自动提交事务。

    session.commit(); // 提交事务
    session.rollback(); // 回滚事务
  • Session 的资源管理: SqlSession 是重量级对象,开启或关闭它都需要耗费数据库连接和内存资源。因此,在使用时,建议在方法中定义变量,以确保在方法结束时关闭 SqlSession

    try (SqlSession session = factory.openSession()) {
        // 执行数据库操作
    }
Mapper接口和XML配置
  • Mapper 接口: MyBatis 提供了一种通过 Mapper 接口来调用数据库的方法。Mapper 接口的方法名和返回值类型可以与 XML 映射文件中的 SQL 语句对应。

    public interface UserMapper {
        List<User> selectAllUsers();
    }
  • XML 配置: XML 配置文件用于定义 SQL 映射。每个 Mapper 接口中的方法都需要一个对应的 XML 配置。以下是一个简单的 XML 配置示例:

    <mapper namespace="com.example.mapper.UserMapper">
        <select id="selectAllUsers" resultType="com.example.model.User">
            SELECT * FROM user
        </select>
    </mapper>

    上述 XML 配置中,namespace 是 MyBatis 通过 Mapper 接口调用 SQL 语句的唯一标识符。id 是 Mapper 接口方法的名称。resultType 是映射结果的 Java 类型。

  • Mapper 接口的实现: MyBatis 可以通过 XML 配置文件动态地实现 Mapper 接口中的方法。例如,创建 UserMapper 接口的实现类,并通过 SqlSession 调用接口中的方法。

    UserMapper mapper = session.getMapper(UserMapper.class);
    List<User> users = mapper.selectAllUsers();
MyBatis常用标签

MyBatis 中常用的标签包括 selectinsertupdatedelete 标签,这些标签用于定义 SQL 语句。

使用Select标签

<select> 标签用于定义 SELECT 语句。以下是一个简单的 <select> 标签示例:

<select id="selectAllUsers" resultType="com.example.model.User">
    SELECT * FROM user
</select>
  • id: <select> 标签的 id 属性用于指定 Mapper 接口中的方法名称。
  • resultType: <select> 标签的 resultType 属性用于指定返回的 Java 类型。
  • parameterType: 可选参数,指定参数类型。
<select id="selectUserById" parameterType="int" resultType="com.example.model.User">
    SELECT * FROM user WHERE id = #{id}
</select>
  • #{id}: 使用 #{} 符号可以传递参数,例如 #{id}#{} 符号可以防止 SQL 注入。
使用Insert、Update和Delete标签
  • Insert 标签:

    <insert id="insertUser" parameterType="com.example.model.User">
        INSERT INTO user (id, name, age) VALUES (#{id}, #{name}, #{age})
    </insert>
  • Update 标签:

    <update id="updateUser" parameterType="com.example.model.User">
        UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}
    </update>
  • Delete 标签:

    <delete id="deleteUserById" parameterType="int">
        DELETE FROM user WHERE id = #{id}
    </delete>
动态SQL的使用

MyBatis 支持动态 SQL,可以在运行时根据条件生成 SQL 语句。常用的动态 SQL 标签包括 ifchoosewhenotherwise,以及 foreach 标签。

if、choose、when和otherwise标签
  • if 标签: 用于条件判断。

    <select id="selectUserByCondition" parameterType="com.example.model.UserCondition" resultType="com.example.model.User">
        SELECT * FROM user
        <where>
            <if test="name != null">
                AND name = #{name}
            </if>
            <if test="age != null">
                AND age = #{age}
            </if>
        </where>
    </select>

    上述代码中,nameage 参数只有在非空时才会被添加到 SQL 语句中。

  • choose 标签: 类似于 Java 中的 switch 语句,用于条件选择。

    <select id="selectUserByCondition" parameterType="com.example.model.UserCondition" resultType="com.example.model.User">
        SELECT * FROM user
        <where>
            <choose>
                <when test="name != null">
                    AND name = #{name}
                </when>
                <when test="age != null">
                    AND age = #{age}
                </when>
                <otherwise>
                    AND id = 1
                </otherwise>
            </choose>
        </where>
    </select>

    上述代码中,choose 标签会根据 nameage 的条件选择一个分支执行。

  • when 标签: 用于 choose 标签内的条件分支。

  • otherwise 标签: 用于 choose 标签内的默认分支。
foreach标签的应用

<foreach> 标签用于遍历集合参数。以下是一个示例:

<select id="selectUsersByIds" parameterType="java.util.List" resultType="com.example.model.User">
    SELECT * FROM user
    WHERE id IN
    <foreach item="item" index="index" collection="list" open="(" separator="," close=")">
        #{item}
    </foreach>
</select>
  • item: 遍历集合中的每个元素。
  • index: 遍历集合中的索引,可选。
  • collection: 遍历的集合。
  • open: 开始符号。
  • separator: 分隔符。
  • close: 结束符号。
MyBatis与Spring集成

MyBatis 可以与 Spring 框架集成,利用 Spring 的依赖注入和事务管理功能。以下是如何配置和使用 MyBatis 的步骤。

Spring配置MyBatis环境
  1. 添加依赖:

    • pom.xml 文件中添加 MyBatis 和 Spring 的依赖。
    <dependencies>
        <dependency>
            <groupId>org.mybatis.spring</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.6</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.10</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.3.10</version>
        </dependency>
    </dependencies>
  2. 配置数据源:

    • 在 Spring 的配置文件中配置数据源和会话工厂。
    <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/mydb"/>
        <property name="username" value="root"/>
        <property name="password" value="password"/>
    </bean>
    
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
    </bean>
  3. 配置 Mapper 接口:

    • 配置 Mapper 接口的扫描或显式配置。
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.example.mapper"/>
    </bean>

    或者:

    <bean class="org.mybatis.spring.mapper.MapperFactoryBean">
        <property name="mapperInterface" value="com.example.mapper.UserMapper"/>
        <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
    </bean>
使用Mapper接口

在 Spring 中使用 Mapper 接口的方法如下:

  1. 注入 Mapper 接口:

    • 在 Spring 配置文件中定义 Mapper 接口的 Bean。
    <bean id="userMapper" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.example.mapper"/>
    </bean>
  2. 在服务类中注入 Mapper 接口:

    • 在服务类中定义 Mapper 接口的注入。
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    
    import java.util.List;
    
    @Service
    public class UserService {
        @Autowired
        private UserMapper userMapper;
    
        public List<User> getAllUsers() {
            return userMapper.selectAllUsers();
        }
    
        @Transactional
        public void addUser(User user) {
            userMapper.insertUser(user);
        }
    }

    上述代码中,UserService 类通过 @Autowired 注解注入了 UserMapper 接口的实现类,并调用了 selectAllUsers 方法。

  3. 事务管理:

    • 可以在服务类中使用 @Transactional 注解进行事务管理。
    @Service
    public class UserService {
        @Autowired
        private UserMapper userMapper;
    
        @Transactional
        public void addUser(User user) {
            userMapper.insertUser(user);
        }
    }

    上述代码中,addUser 方法被 @Transactional 注解修饰,会在方法执行时启动事务,并在方法正常执行完毕后提交事务。

通过以上步骤,MyBatis 可以与 Spring 无缝集成,充分利用 Spring 的依赖注入和事务管理功能。

点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

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

举报

0/150
提交
取消