Java教程

Mybatis教程:从入门到初级实战

本文主要是介绍Mybatis教程:从入门到初级实战,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
概述

本文详细介绍了Mybatis教程,包括环境搭建、核心配置文件解析、基本CRUD操作以及动态SQL的使用。此外,还涵盖了Mybatis与Spring的集成和一些高级特性如分页查询和缓存机制。通过这些内容,读者可以全面了解和掌握Mybatis的使用方法。

Mybatis教程:从入门到初级实战
Mybatis简介与环境搭建

Mybatis的基本概念

Mybatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。Mybatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。Mybatis可以使用简单的 XML 或注解进行配置和原始映射,并将接口和 Java 的 POJO 传递给 SQL 语句。

开发环境的搭建

首先,确保你的开发环境已经安装了 Java 和 Maven。这里推荐使用 IntelliJ IDEA 或 Eclipse 作为开发工具。创建一个新的 Maven 项目,并在项目的 pom.xml 文件中添加 Mybatis 依赖。以下是示例代码:

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>mybatisDemo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.6</version>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.200</version>
        </dependency>
    </dependencies>
</project>
``

上述代码中,添加了 Mybatis 依赖和 H2 数据库依赖,H2 是一个嵌入式数据库,适用于开发和测试环境。

## Mybatis核心配置文件解析

### 配置文件详解

Mybatis 的配置文件通常命名为 `mybatis-config.xml`,主要包含以下几个部分:

- `<configuration>`:配置文件的根元素。
- `<environments>`:定义 Mybatis 环境,如连接的数据库类型、事务管理方式等。
- `<mappers>`:定义映射文件,映射 SQL 语句和 Java 实体类。

数据库连接信息通常在 `<environments>` 标签中进行配置:

```xml
<environments default="development">
    <environment id="development">
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
            <property name="driver" value="org.h2.Driver"/>
            <property name="url" value="jdbc:h2:mem:test"/>
            <property name="username" value="sa"/>
            <property name="password" value=""/>
        </dataSource>
    </environment>
</environments>

映射文件用于定义 SQL 语句与 Java 实体类之间的映射关系。映射文件通常命名为 UserMapper.xml,并放置在 src/main/resources 目录下。

<mappers>
    <mapper resource="com/example/mapper/UserMapper.xml"/>
</mappers>
Mybatis基本CRUD操作

查询操作

使用 Mybatis 进行查询操作,可以通过 SQL 语句和对应的 Java 方法进行映射。

假设有一个 User 类:

public class User {
    private int id;
    private String name;
    private int age;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

对应的 UserMapper.xml 文件:

<mapper namespace="com.example.mapper.UserMapper">
    <select id="selectUserById" resultType="com.example.User">
        SELECT id, name, age FROM user WHERE id = #{id}
    </select>
</mapper>

Java 方法:

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

插入操作

插入操作同样可以使用 SQL 语句和 Java 方法进行映射。

假设有一个 User 类:

public class User {
    private int id;
    private String name;
    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

对应的 UserMapper.xml 文件:

<mapper namespace="com.example.mapper.UserMapper">
    <insert id="insertUser" parameterType="com.example.User">
        INSERT INTO user (name, age) VALUES (#{name}, #{age})
    </insert>
</mapper>

Java 方法:

public interface UserMapper {
    void insertUser(User user);
}

更新操作

更新操作可以使用 SQL 语句和 Java 方法进行映射。

假设有一个 User 类:

public class User {
    private int id;
    private String name;
    private int age;

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

对应的 UserMapper.xml 文件:

<mapper namespace="com.example.mapper.UserMapper">
    <update id="updateUser" parameterType="com.example.User">
        UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}
    </update>
</mapper>

Java 方法:

public interface UserMapper {
    void updateUser(User user);
}

删除操作

删除操作可以使用 SQL 语句和 Java 方法进行映射。

假设有一个 User 类:

public class User {
    private int id;
    private String name;
    private int age;
}

对应的 UserMapper.xml 文件:

<mapper namespace="com.example.mapper.UserMapper">
    <delete id="deleteUser" parameterType="int">
        DELETE FROM user WHERE id = #{id}
    </delete>
</mapper>

Java 方法:

public interface UserMapper {
    void deleteUser(int id);
}
Mybatis动态SQL的使用

Mybatis 支持动态生成 SQL 语句,通过标签如 if, choose, foreach 可以使 SQL 语句更灵活。

if标签

if 标签用来条件判断,如果条件成立,则插入 SQL 语句片段。

假设有一个 User 类:

public class User {
    private int id;
    private String name;
    private int age;
}

对应的 UserMapper.xml 文件:

<mapper namespace="com.example.mapper.UserMapper">
    <select id="selectUserByName" resultType="com.example.User">
        SELECT id, name, age FROM user WHERE 1=1
        <if test="name != null">
            AND name = #{name}
        </if>
        <if test="age != null">
            AND age = #{age}
        </if>
    </select>
</mapper>

Java 方法:

public interface UserMapper {
    List<User> selectUserByName(String name, Integer age);
}

choose标签

choose 标签类似于 Java 中的 switch 语句,用来选择多个条件中的一个执行。

假设有一个 User 类:

public class User {
    private int id;
    private String name;
    private int age;
}

对应的 UserMapper.xml 文件:

<mapper namespace="com.example.mapper.UserMapper">
    <select id="selectUser" resultType="com.example.User">
        SELECT id, name, age FROM user WHERE 
        <choose>
            <when test="name != null">
                name = #{name}
            </when>
            <when test="age != null">
                age = #{age}
            </when>
            <otherwise>
                1=1
            </otherwise>
        </choose>
    </select>
</mapper>

Java 方法:

public interface UserMapper {
    List<User> selectUser(String name, Integer age);
}

foreach标签

foreach 标签用来遍历集合。

假设有一个 User 类:

public class User {
    private int id;
    private String name;
    private int age;
}

对应的 UserMapper.xml 文件:

<mapper namespace="com.example.mapper.UserMapper">
    <select id="selectUsersByIds" resultType="com.example.User">
        SELECT id, name, age FROM user WHERE id IN
        <foreach item="item" index="index" collection="ids" open="(" separator="," close=")">
            #{item}
        </foreach>
    </select>
</mapper>

Java 方法:

public interface UserMapper {
    List<User> selectUsersByIds(List<Integer> ids);
}

other标签

other 标签用于其他场景,可以根据实际需求进行扩展。

Mybatis与Spring集成

Spring与Mybatis集成的必要性

Spring 与 Mybatis 集成可以实现事务管理、依赖注入等功能,使开发更加便捷。

配置Spring整合Mybatis

在 Spring 配置文件中引入 Mybatis 的配置信息。

示例代码

在 Spring 配置文件 applicationContext.xml 中配置 Mybatis:

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

<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
    <constructor-arg>
        <ref bean="sqlSessionFactory"/>
    </constructor-arg>
</bean>

<bean id="userMapper" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.example.mapper"/>
    <property name="sqlSessionTemplateRef" value="sqlSessionTemplate"/>
</bean>

使用注解进行Mybatis的映射

可以使用 @Mapper 注解来代替 XML 文件。

示例代码

假设有一个 UserMapper 接口:

@Mapper
public interface UserMapper {
    List<User> selectUser(String name, Integer age);
}
Mybatis的高级特性

分页查询

分页查询可以通过 Mybatis 的 PageHelper 插件实现。

示例代码

pom.xml 中引入 PageHelper 插件依赖:

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.1.4</version>
</dependency>

配置 pagehelper 插件:

<bean id="pageHelper" class="com.github.pagehelper.PageHelper">
    <property name="properties">
        <value>
            helperDialect=mysql
            reasonable=true
        </value>
    </property>
</bean>

使用 PageHelper 进行分页查询:

PageHelper.startPage(pageNum, pageSize);
List<User> users = userMapper.selectUser(name, age);
Page<User> result = (Page<User>) users;

一级缓存和二级缓存

一级缓存

一级缓存是 SqlSession 级别的缓存,每个 SqlSession 中都有一个缓存。

二级缓存

二级缓存是 Mapper 级别的缓存,多个 SqlSession 共享同一个 Mapper 级别的缓存。

配置 Mybatis 二级缓存:

<cache />

插件开发

Mybatis 允许用户自定义插件来扩展或改造 Mybatis 框架。

示例代码

假设一个插件用于拦截 SQL 语句:

@Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})})
public class MyPlugin implements Interceptor {

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        MappedStatement ms = (MappedStatement) invocation.getArgs()[0];
        Object parameter = invocation.getArgs()[1];
        // 执行 SQL 语句之前的操作
        System.out.println("Before executing SQL: " + ms.getId());

        Object result = invocation.proceed();

        // 执行 SQL 语句之后的操作
        System.out.println("After executing SQL: " + ms.getId());

        return result;
    }
}

在 Spring 配置文件中配置插件:

<bean id="myInterceptor" class="com.example.interceptor.MyPlugin"/>
总结

本文介绍了 Mybatis 框架的基本概念、配置文件的解析、CRUD 操作、动态 SQL 的使用、与 Spring 的集成以及高级特性如分页查询、缓存和插件开发。通过这些建议和示例代码,你可以进一步掌握 Mybatis 的使用。更多详细信息和高级用法可以参考 Mybatis 官方文档。

这篇关于Mybatis教程:从入门到初级实战的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!