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

MyBatis学习:新手入门到上手实战指南

标签:
Java MySQL Oracle

本文详细介绍了MyBatis学习的全过程,涵盖从环境搭建到核心配置,再到映射文件的编写和动态SQL的使用。文章深入探讨了MyBatis的高级特性,如缓存机制和插件机制,帮助读者全面掌握MyBatis。MyBatis学习不仅涉及基础操作,还包括了注解开发和实战案例,旨在帮助新手快速上手并应用于实际项目。

MyBatis学习:新手入门到上手实战指南
MyBatis简介与环境搭建

MyBatis的基本概念

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

开发环境搭建

安装JDK和Maven

  1. 下载并安装JDK。
  2. 安装Maven,并确保Maven已经添加到系统的PATH环境变量中。可以通过命令mvn -v来验证Maven是否安装成功。

创建Maven项目

使用IntelliJ IDEA或Eclipse创建一个新的Maven项目。

  • 在项目中创建src/main/javasrc/main/resources两个目录。
  • 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.23</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.2</version>
        <scope>test</scope>
    </dependency>
</dependencies>
``

#### 配置数据库

- 创建一个MySQL数据库,例如`mybatis_db`。
- 创建一个用户表`users`。

```sql
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(255) NOT NULL,
    password VARCHAR(255) NOT NULL
);
  • users表中插入一些数据。
INSERT INTO users (id, username, password) VALUES (1, 'admin', '123456');
INSERT INTO users (id, username, password) VALUES (2, 'user', 'password');

第一个MyBatis程序

编写第一个MyBatis程序,包括创建User类和UserMapper接口。

  1. 创建User类。
public class User {
    private int id;
    private String username;
    private String password;

    // Getter and Setter methods
    public int getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}
  1. 创建UserMapper接口。
public interface UserMapper {
    User selectUser(int id);
}
  1. 创建MyBatisConfig.xml配置文件。
<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_db"/>
                <property name="username" value="root"/>
                <property name="password" value="password"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="UserMapper.xml"/>
    </mappers>
</configuration>
  1. 创建UserMapper.xml映射文件。
<mapper namespace="com.example.mapper.UserMapper">
    <select id="selectUser" resultType="com.example.model.User">
        SELECT id, username, password FROM users WHERE id = #{id}
    </select>
</mapper>
  1. 编写测试类MyBatisTest
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.InputStream;

public class MyBatisTest {
    public static void main(String[] args) throws IOException {
        String resource = "MyBatisConfig.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        try (SqlSession session = sqlSessionFactory.openSession()) {
            UserMapper mapper = session.getMapper(UserMapper.class);
            User user = mapper.selectUser(1);
            System.out.println(user.getUsername());
        }
    }
}
MyBatis核心配置

配置文件详解

MyBatis的配置文件MyBatisConfig.xml是整个MyBatis配置的核心。它主要包含以下配置信息:

  • 数据库连接信息
  • MyBatis的运行配置
  • 映射器的映射文件

数据库连接配置

配置数据源和数据库连接信息。

<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_db"/>
            <property name="username" value="root"/>
            <property name="password" value="password"/>
        </dataSource>
    </environment>
</environments>

SqlSessionFactory配置

配置SqlSessionFactory的创建。

<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_db"/>
                <property name="username" value="root"/>
                <property name="password" value="password"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="UserMapper.xml"/>
    </mappers>
</configuration>
MyBatis映射文件详解

映射文件的基本结构

MyBatis映射文件定义了SQL语句和映射规则,常见的标签有<select><insert><update><delete>

示例代码

<mapper namespace="com.example.mapper.UserMapper">
    <select id="selectUser" resultType="com.example.model.User">
        SELECT id, username, password FROM users WHERE id = #{id}
    </select>
    <insert id="insertUser">
        INSERT INTO users (id, username, password) VALUES (#{id}, #{username}, #{password})
    </insert>
    <update id="updateUser">
        UPDATE users SET username = #{username}, password = #{password} WHERE id = #{id}
    </update>
    <delete id="deleteUser">
        DELETE FROM users WHERE id = #{id}
    </delete>
</mapper>

SQL语句的编写

MyBatis映射文件中定义的SQL语句可以直接使用数据库支持的SQL语法。

示例代码

<insert id="insertUser">
    INSERT INTO users (id, username, password) VALUES (#{id}, #{username}, #{password})
</insert>

结果集的映射

结果集的映射通过<select>标签的resultType属性来实现。

示例代码

<select id="selectUser" resultType="com.example.model.User">
    SELECT id, username, password FROM users WHERE id = #{id}
</select>
动态SQL的使用

条件查询

动态SQL可以根据条件自动生成SQL语句。

示例代码

<if test="username != null">
    AND username = #{username}
</if>

分支语句

使用<choose><when><otherwise>标签来实现分支条件。

示例代码

<choose>
    <when test="id != null">
        AND id = #{id}
    </when>
    <when test="username != null">
        AND username = #{username}
    </when>
    <otherwise>
        AND password = #{password}
    </otherwise>
</choose>

循环语句

使用<foreach>标签来实现循环。

示例代码

<select id="selectUsers" resultType="com.example.model.User">
    SELECT id, username, password FROM users WHERE id IN
    <foreach item="item" index="index" collection="ids" open="(" separator="," close=")">
        #{item}
    </foreach>
</select>
MyBatis与注解开发

注解的基本使用

MyBatis提供了一系列注解,可以在Mapper接口中使用。

示例代码

import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Update;
import org.apache.ibatis.annotations.Delete;

public interface UserMapper {
    @Select("SELECT id, username, password FROM users WHERE id = #{id}")
    User selectUser(int id);

    @Insert("INSERT INTO users (id, username, password) VALUES (#{id}, #{username}, #{password})")
    void insertUser(User user);

    @Update("UPDATE users SET username = #{username}, password = #{password} WHERE id = #{id}")
    void updateUser(User user);

    @Delete("DELETE FROM users WHERE id = #{id}")
    void deleteUser(int id);
}

注解与XML配置的对比

  • 注解开发的代码更简洁。
  • XML配置更加灵活,适用于复杂的场景。

实战案例

创建测试类

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.InputStream;
import java.util.List;

public class MyBatisAnnotatedTest {
    public static void main(String[] args) throws IOException {
        String resource = "MyBatisConfig.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        try (SqlSession session = sqlSessionFactory.openSession()) {
            UserMapper mapper = session.getMapper(UserMapper.class);
            User user = mapper.selectUser(1);
            System.out.println(user.getUsername());

            User newUser = new User();
            newUser.setId(3);
            newUser.setUsername("newUser");
            newUser.setPassword("newPassword");
            mapper.insertUser(newUser);
            session.commit();
            List<User> users = mapper.selectUsers();
            for (User u : users) {
                System.out.println(u.getUsername());
            }
        }
    }
}
MyBatis高级特性

缓存机制

MyBatis提供了一级缓存和二级缓存。

示例代码

<cache />

使用缓存

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

import java.io.InputStream;

public class CacheTest {
    public static void main(String[] args) throws IOException {
        String resource = "MyBatisConfig.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        try (SqlSession session1 = sqlSessionFactory.openSession(); SqlSession session2 = sqlSessionFactory.openSession()) {
            UserMapper mapper1 = session1.getMapper(UserMapper.class);
            UserMapper mapper2 = session2.getMapper(UserMapper.class);

            User user1 = mapper1.selectUser(1);
            User user2 = mapper2.selectUser(1);

            System.out.println(user1 == user2); // 输出 true,因为它们来自同一 SqlSession 的缓存
        }
    }
}

分页处理

使用MyBatis的RowBounds类来实现分页。

示例代码

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

import java.io.InputStream;
import java.util.List;

public class PaginationTest {
    public static void main(String[] args) throws IOException {
        String resource = "MyBatisConfig.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        try (SqlSession session = sqlSessionFactory.openSession()) {
            UserMapper mapper = session.getMapper(UserMapper.class);
            List<User> users = mapper.selectUsers(new RowBounds(0, 10));
            for (User u : users) {
                System.out.println(u.getUsername());
            }
        }
    }
}

插件机制

MyBatis插件允许对MyBatis的执行过程进行拦截,可以用于实现日志记录、性能统计等。

示例代码

import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;

import java.util.Properties;

public class MyPlugin implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        Object[] args = invocation.getArgs();
        MappedStatement mappedStatement = (MappedStatement) args[0];
        Object parameter = args[1];
        BoundSql boundSql = mappedStatement.getBoundSql(parameter);
        String sql = boundSql.getSql();
        System.out.println("Executing SQL: " + sql);
        return invocation.proceed();
    }

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

    @Override
    public void setProperties(Properties properties) {
        // 设置插件属性
    }
}

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

通过以上内容,你可以系统地学习和掌握MyBatis的基本概念和高级特性,为实际项目开发打下坚实的基础。
点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

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

举报

0/150
提交
取消