随着springboot的出现,绝大多数开源框架和中间件都可以通过springboot来整合,并且使用起来非常简单,但是,今天要介绍的是mybatis原生的使用方法。并且分享一下在结合官网学习过程中遇到的问题。
目录
准备工作
数据库版本说明
创建数据库表
快速开始
引入maven依赖
创建数据库实体类
创建持久层接口
创建mapper.xml
创建mybatis配置文件
构建SqlSessionFactory的方式
从XML中构建SqlSessionFactory
运行报错问题解决
不使用XML构建SqlSessionFactory
调用mapper接口方法的方式
绑定sql语句的方式
通过mapper.xml绑定
通过注解绑定
准备工作
数据库版本说明
在开始本篇文章之前,需要提前创建好相关的数据库和表。文章使用的mysql版本为MariaDB 10.6,对应mysql版本为8.0,所以mybatis-config.xml中驱动不一样。
mysql 8.0之前的数据库驱动类为
com.mysql.jdbc.Drivermysql 8.0之后的数据库驱动类为
com.mysql.cj.jdbc.Driver创建数据库表
创建一个数据库mybatis,并在数据库下创建user表,执行以下SQL脚本即可。
/*
 Navicat Premium Data Transfer
 Source Server         : MariaDB
 Source Server Type    : MariaDB
 Source Server Version : 100605 (10.6.5-MariaDB)
 Source Host           : 127.0.0.1:3306
 Source Schema         : mybatis
 Target Server Type    : MariaDB
 Target Server Version : 100605 (10.6.5-MariaDB)
 File Encoding         : 65001
 Date: 24/10/2023 23:57:18
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户名',
  `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '12345' COMMENT '密码',
  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, 'mumu', '12345');
INSERT INTO `user` VALUES (2, 'system', '12345');
SET FOREIGN_KEY_CHECKS = 1;
快速开始
首先,需要找到mybatis的官网
https://mybatis.org/mybatis-3/zh/getting-started.html https://mybatis.org/mybatis-3/zh/getting-started.html如图,根据官网的步骤开始使用mybatis
https://mybatis.org/mybatis-3/zh/getting-started.html如图,根据官网的步骤开始使用mybatis

引入maven依赖
在IntelliJ IDEA中创建一个maven项目mybatis,在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>
    <groupId>org.example</groupId>
    <artifactId>mybatis</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <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>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>本篇文章使用的mybatis是最新的版本,更多版本可以通过maven仓库搜索
https://central.sonatype.com/artifact/org.mybatis/mybatis/versions https://central.sonatype.com/artifact/org.mybatis/mybatis/versions
https://central.sonatype.com/artifact/org.mybatis/mybatis/versions
创建数据库实体类
在项目src/main/java包下创建多级包org.example.pojo包,在pojo包下创建一个User.java
package org.example.pojo;
import lombok.Data;
/**
 * @author heyunlin
 * @version 1.0
 */
@Data
public class User {
    private String id;
    private String username;
    private String password;
}创建持久层接口
在src/main/java/org/example包下创建mapper包,在mapper包下创建一个UserMapper.java
package org.example.mapper;
import org.example.pojo.User;
import java.util.List;
/**
 * @author heyunlin
 * @version 1.0
 */
public interface UserMapper {
    List<User> selectAll();
}创建mapper.xml
紧接着,在src/main/resources目录下也创建多级目录org.example.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="org.example.mapper.UserMapper">
    <select id="selectAll" resultType="org.example.pojo.User">
        select id, username, password from user
    </select>
</mapper>创建mybatis配置文件
根据官网在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/mybatis" />
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper class="org/example/mapper/UserMapper.xml" />
    </mappers>
</configuration>构建SqlSessionFactory的方式
从XML中构建SqlSessionFactory
在org.example包下面创建一个MybatisExample类来测试一下,然后运行main方法
package org.example;
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 org.example.pojo.User;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
 * @author heyunlin
 * @version 1.0
 */
public class MybatisExample {
    public static void main(String[] args) throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        List<User> list = sqlSession.selectList("org.example.mapper.UserMapper.selectAll");
        System.out.println(list);
    }
}运行报错问题解决
运行出错了,说是找不到类org/example/mapper/UserMapper.xml

很显然这不是类,所以改成org/example/mapper/UserMapper再试试
 然后再次运行main方法,居然又报错了,说是找不到org/example/mapper/UserMapper类,但是其实这个类是有的。
 然后再次运行main方法,居然又报错了,说是找不到org/example/mapper/UserMapper类,但是其实这个类是有的。

如下图,已经编译到相关目录下

这也是官网坑的地方之一,这里的/要改成.
于是再次修改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/mybatis" />
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper class="org.example.mapper.UserMapper" />
    </mappers>
</configuration>这次运行成功查询到了数据库user表的所有数据

不使用XML构建SqlSessionFactory
为了方便动态修改获取SqlSessionFactory的方式,对原来的代码进行重构,抽离获取SqlSessionFactory的方法。
package org.example;
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 org.example.pojo.User;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
 * @author heyunlin
 * @version 1.0
 */
public class MybatisExample {
    private static SqlSessionFactory getSqlSessionFactory() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        return new SqlSessionFactoryBuilder().build(inputStream);
    }
    public static void main(String[] args) throws IOException {
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        SqlSession sqlSession = sqlSessionFactory.openSession();
        List<User> list = sqlSession.selectList("org.example.mapper.UserMapper.selectAll");
        System.out.println(list);
    }
}如下图所示,官网提供的代码中,第一行代码获取数据源的工厂类很显然是自己写的,我们要用其他方式获取数据源对象。

修改getSqlSessionFactory()方法的代码,查看Datasource有那些子类,博主看这个PooledDataSource比较顺眼,就用了它。

于是再次修改MybatisExample的代码
package org.example;
import com.mysql.cj.jdbc.MysqlDataSource;
import org.apache.ibatis.datasource.pooled.PooledDataSource;
import org.apache.ibatis.io.Resources;
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 org.example.mapper.UserMapper;
import org.example.pojo.User;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
 * @author heyunlin
 * @version 1.0
 */
public class MybatisExample {
    private static SqlSessionFactory getSqlSessionFactory(int method) throws IOException {
        // 从XML中构建 SqlSessionFactory
        if (method == 1) {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            return new SqlSessionFactoryBuilder().build(inputStream);
        } else if (method == 2) { // 不使用XML构建SqlSessionFactory
            DataSource dataSource = new PooledDataSource("com.mysql.cj.jdbc.Driver",
                    "jdbc:mysql://localhost:3306/mybatis", "root", "root");
            TransactionFactory transactionFactory = new JdbcTransactionFactory();
            Environment environment = new Environment("development", transactionFactory, dataSource);
            Configuration configuration = new Configuration(environment);
            configuration.addMapper(UserMapper.class);
            return new SqlSessionFactoryBuilder().build(configuration);
        }
        return null;
    }
    public static void main(String[] args) throws IOException {
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(2);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        List<User> list = sqlSession.selectList("org.example.mapper.UserMapper.selectAll");
        System.out.println(list);
    }
}调用mapper接口方法的方式
上面已经提供了一种方法:通过SqlSession的selectXxx()方法
    public static void main(String[] args) throws IOException {
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(2);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        List<User> list = sqlSession.selectList("org.example.mapper.UserMapper.selectAll");
        System.out.println(list);
    }接下来再介绍一种
    public static void main(String[] args) throws IOException {
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(2);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        List<User> users = userMapper.selectAll();
        System.out.println(users);
    }绑定sql语句的方式
注意,两种方式不能一起使用,否则会报错。

所以用了注解就要注释掉UserMapper.xml里对应的的statement
通过mapper.xml绑定
上面用的方式就是通过mapper.xml绑定。
通过注解绑定
package org.example.mapper;
import org.apache.ibatis.annotations.Select;
import org.example.pojo.User;
import java.util.List;
/**
 * @author heyunlin
 * @version 1.0
 */
public interface UserMapper {
    @Select("select id, username, password from user")
    List<User> selectAll();
}<?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="org.example.mapper.UserMapper">
<!--    <select id="selectAll" resultType="org.example.pojo.User">-->
<!--        select id, username, password from user-->
<!--    </select>-->
</mapper>好了,文章就分享到这里了,代码已开源,可按需获取~
https://gitee.com/he-yunlin/mybatis.git https://gitee.com/he-yunlin/mybatis.git
https://gitee.com/he-yunlin/mybatis.git



















