绝大多数开源的Java框架都可以通过Spring Boot来整合,并且使用起来非常简单。

而这篇文章介绍的是MyBatis原生的使用方法。

同时,分享一下我在官网学习过程中遇到的问题。

准备工作

数据库版本说明

在开始本篇文章之前,需要提前创建好相关的数据库和表。

文章使用的数据库版本为MySQL-8.0.43,所以mybatis-config.xml中驱动不一样。


mysql 8.0之前的数据库驱动类为

com.mysql.jdbc.Driver

mysql 8.0之后的数据库驱动类为

com.mysql.cj.jdbc.Driver

创建数据库表

创建一个数据库test,并在数据库下创建user表,执行以下SQL脚本即可。

/*
 Navicat Premium Data Transfer

 Source Server         : localhost
 Source Server Type    : MySQL
 Source Server Version : 80043 (8.0.43)
 Source Host           : localhost:3306
 Source Schema         : test

 Target Server Type    : MySQL
 Target Server Version : 80043 (8.0.43)
 File Encoding         : 65001

 Date: 11/01/2026 21:58:52
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` int UNSIGNED NOT NULL AUTO_INCREMENT,
  `age` int NOT NULL DEFAULT 12345 COMMENT '年龄',
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '姓名',
  `gender` tinyint NULL DEFAULT NULL COMMENT '性别(1-男;2-女)',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户表' ROW_FORMAT = DYNAMIC;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, 21, '沐雨橙风ιε', 2);
INSERT INTO `user` VALUES (2, 21, '苏沐橙', 2);

SET FOREIGN_KEY_CHECKS = 1;

快速开始

首先,需要找到mybatis的官网

mybatis – MyBatis 3 | 入门https://mybatis.org/mybatis-3/zh_CN/index.html如图,根据官网的步骤开始使用mybatis

1、创建项目

在IntelliJ IDEA中创建一个maven项目java-mybatis

2、添加依赖

修改pom.xml,添加要使用到的依赖。

<?xml version="1.0" encoding="UTF-8"?>
<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>

    <version>20260101</version>
    <groupId>cn.edu.sgu.www</groupId>
    <artifactId>java-mybatis</artifactId>
    <description>Java中使用MyBatis案例项目</description>

    <developers>
        <developer>
            <name>沐雨橙风ιε</name>
            <roles>
                <role>developer</role>
            </roles>
            <timezone>Asia/Shanghai</timezone>
        </developer>
    </developers>

    <scm>
        <url>https://gitee.com/muyu-chengfeng/java-mybatis.git</url>
    </scm>

    <properties>
        <java.version>1.8</java.version>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.22</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.13</version>
        </dependency>
    </dependencies>
</project>

本篇文章使用的mybatis是最新的版本,更多版本可以通过maven仓库搜索

Maven Central: org.mybatis:mybatishttps://central.sonatype.com/artifact/org.mybatis/mybatis/versions

3、准备工作

创建数据库实体类

在项目src/main/java包下创建多级包cn.edu.sgu.www.entity包,在entity包下创建User.java

package cn.edu.sgu.www.entity;

import lombok.Data;

import java.io.Serializable;

/**
 * @author 沐雨橙风ιε
 * @version 1.0
 */
@Data
public class User implements Serializable {
    private static final long serialVersionUID = 18L;

    private Integer id;

    /**
     * 姓名
     */
    private String name;

    /**
     * 年龄
     */
    private Integer age;

    /**
     * 性别
     */
    private Integer gender;
}

创建持久层接口

在项目src/main/java包下创建多级包cn.edu.sgu.www.mapper包,在entity包下创建接口UserMapper.java

package cn.edu.sgu.www.mapper;

import cn.edu.sgu.www.entity.User;

import java.util.List;

/**
 * @author 沐雨橙风ιε
 * @version 1.0
 */
public interface UserMapper {

    /**
     * 查询全部用户
     */
    List<User> selectAll();
}

创建mapper.xml

紧接着,在src/main/resources目录下也创建多级目录cn.edu.sgu.www.mapper,目录结构和UserMapper.java接口的路径保持一致。

<?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="cn.edu.sgu.www.mapper.UserMapper">

    <select id="selectAll" resultType="cn.edu.sgu.www.entity.User">
        select * from user
    </select>
</mapper>

创建mybatis-config.xml

根据官网在resources目录下创建一个mybatis的配置文件,文件名可以任意命名,在这里就命名为mybatis-config.xml

mybatis-config.xml的内容,用户名、密码以及数据库名根据自己实际情况修改

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "https://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />

            <dataSource type="POOLED">
                <property name="username" value="root" />
                <property name="password" value="root" />
                <property name="driver" value="com.mysql.cj.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/test" />
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper class="cn.edu.sgu.www.mapper.UserMapper" />
    </mappers>
</configuration>

4、构建SqlSessionFactory

在cn.edu.sgu.www包下面创建一个MybatisExample类。

从XML中构建

package cn.edu.sgu.www;

import cn.edu.sgu.www.entity.User;
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;

/**
 * @author 沐雨橙风ιε
 * @version 1.0
 */
public class MybatisExample {

    public static void main(String[] args) throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();

        List<User> list = sqlSession.selectList("cn.edu.sgu.www.mapper.UserMapper.selectAll");
        
        System.out.println(list);
    }

}

不使用XML构建

如下图所示,官网提供的代码中,第一行代码获取数据源的工厂类很显然是自己写的,我们要用其他方式获取数据源对象。

查看Datasource有那些子类,博主看这个PooledDataSource比较顺眼,就用了它。

于是修改MybatisExample的代码

package cn.edu.sgu.www;

import cn.edu.sgu.www.entity.User;
import cn.edu.sgu.www.mapper.UserMapper;
import org.apache.ibatis.datasource.pooled.PooledDataSource;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.transaction.TransactionFactory;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;

import javax.sql.DataSource;
import java.util.List;

/**
 * @author 沐雨橙风ιε
 * @version 1.0
 */
public class MybatisExample {

    public static void main(String[] args) {
        DataSource dataSource = new PooledDataSource(
                "com.mysql.cj.jdbc.Driver",
                "jdbc:mysql://localhost:3306/test",
                "root",
                "root"
        );
        TransactionFactory transactionFactory = new JdbcTransactionFactory();
        Environment environment = new Environment("development", transactionFactory, dataSource);

        Configuration configuration = new Configuration(environment);

        configuration.addMapper(UserMapper.class);

        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
        SqlSession sqlSession = sqlSessionFactory.openSession();

        List<User> list = sqlSession.selectList("cn.edu.sgu.www.mapper.UserMapper.selectAll");

        System.out.println(list);
    }

}

5、调用mapper接口方法

方法一

上面已经提供了一种方法:通过SqlSession的selectXxx()方法

List<User> list = sqlSession.selectList("cn.edu.sgu.www.mapper.UserMapper.selectAll");

System.out.println(list);

方法二

通过SqlSession的getMapper()方法获取UserMapper对象,直接通过对象调用方法。

UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> list = userMapper.selectAll();

System.out.println(list);

6、绑定SQL语句

通过mapper.xml绑定

上面用的方式就是通过mapper.xml绑定。

通过注解绑定

UserMapper.java
package cn.edu.sgu.www.mapper;

import cn.edu.sgu.www.entity.User;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
 * @author 沐雨橙风ιε
 * @version 1.0
 */
public interface UserMapper {

    /**
     * 查询全部用户
     */
    @Select("select * from user")
    List<User> selectAll();
}

UserMapper.xml

使用了注解绑定,就不能再用mapper.xml绑定,要注释掉selectAll方法的statement

<?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="cn.edu.sgu.www.mapper.UserMapper">

<!--    <select id="selectAll" resultType="cn.edu.sgu.www.entity.User">-->
<!--        select * from user-->
<!--    </select>-->
</mapper>

注意,两种方式不能一起使用,否则会报错。

所以用了注解就要注释掉UserMapper.xml里对应的的statement

包名错误问题

最后,要注意UserMapper.xml文件是在多级包下的,不能像java包一样直接输入cn.edu.sgu.www.mapper创建。

直接包名输入cn.edu.sgu.www.mapper创建会创建一级包,包名就是cn.edu.sgu.www.mapper

并且,在idea里是看不出来的!

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐