mybatis学习笔记,使用mybatis的几种方式

随着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.Driver

mysql 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.htmlicon-default.png?t=N7T8https://mybatis.org/mybatis-3/zh/getting-started.html如图,根据官网的步骤开始使用mybatis

mybatis学习笔记,使用mybatis的几种方式_第1张图片

引入maven依赖

在IntelliJ IDEA中创建一个maven项目mybatis,在pom.xml中添加一些基本的依赖。



    4.0.0

    org.example
    mybatis
    1.0-SNAPSHOT

    
        8
        8
    

    
        
            org.projectlombok
            lombok
            1.18.22
        

        
            mysql
            mysql-connector-java
            8.0.28
        

        
            org.mybatis
            mybatis
            3.5.13
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    

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

https://central.sonatype.com/artifact/org.mybatis/mybatis/versionsicon-default.png?t=N7T8https://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 selectAll();
}

创建mapper.xml

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






    


创建mybatis配置文件

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

mybatis学习笔记,使用mybatis的几种方式_第2张图片

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





    
        
            

            
                
                
                
                
            
        
    

    
        
    

构建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 list = sqlSession.selectList("org.example.mapper.UserMapper.selectAll");
        System.out.println(list);
    }

}

运行报错问题解决

运行出错了,说是找不到类org/example/mapper/UserMapper.xml

mybatis学习笔记,使用mybatis的几种方式_第3张图片

很显然这不是类,所以改成org/example/mapper/UserMapper再试试

mybatis学习笔记,使用mybatis的几种方式_第4张图片 然后再次运行main方法,居然又报错了,说是找不到org/example/mapper/UserMapper类,但是其实这个类是有的。

mybatis学习笔记,使用mybatis的几种方式_第5张图片

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

mybatis学习笔记,使用mybatis的几种方式_第6张图片

这也是官网坑的地方之一,这里的/要改成.

于是再次修改mybatis-config.xml





    
        
            

            
                
                
                
                
            
        
    

    
        
    

这次运行成功查询到了数据库user表的所有数据

mybatis学习笔记,使用mybatis的几种方式_第7张图片

不使用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 list = sqlSession.selectList("org.example.mapper.UserMapper.selectAll");
        System.out.println(list);
    }

}

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

mybatis学习笔记,使用mybatis的几种方式_第8张图片

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

mybatis学习笔记,使用mybatis的几种方式_第9张图片

于是再次修改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 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 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 users = userMapper.selectAll();

        System.out.println(users);
    }

绑定sql语句的方式

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

mybatis学习笔记,使用mybatis的几种方式_第10张图片

所以用了注解就要注释掉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 selectAll();
}










好了,文章就分享到这里了,代码已开源,可按需获取~

https://gitee.com/he-yunlin/mybatis.giticon-default.png?t=N7T8https://gitee.com/he-yunlin/mybatis.git

你可能感兴趣的:(mybatis,学习,笔记)