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

news2024/11/19 4:43:48

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

引入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/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<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类,但是其实这个类是有的。

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

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

于是再次修改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.giticon-default.png?t=N7T8https://gitee.com/he-yunlin/mybatis.git

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1141901.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录二刷 Day46

10背包&#xff1a; 二维内侧与外侧都是正序遍历&#xff0c;二维的内侧与外侧是背包还是物品无所谓&#xff1b; 10背包&#xff1a; 一维外侧是正序&#xff0c;内侧是倒序&#xff1b; 目的是为了一个物品只选取一次&#xff1b;一维内侧一定要是背包&#xff1b;原因我想了…

GoLong的学习之路(十五)语法之接口(重要)

文章目录 接口接口的定义实现接口的条件面向接口编程接口类型的变量值接收者和指针接收者接口值接收指针接收总结 类型和接口的关系&#xff08;多对多的关系&#xff09;一个类型实现多个接口多种类型实现同一接口 接口组合注意 空接口空接口的应用 接口值类型断言注意总结 接…

Cross-modal Variational Alignment of Latent Spaces

方法 潜空间LS 辅助信息 作者未公布代码

matlab simulink 直线一级倒立摆控制(自起摆和稳态控制)

1、内容简介 略 6-可以交流、咨询、答疑 2、内容说明 控制器设计 自起摆建模 规定正方向&#xff1a;顺时针为角度&#xff08;力矩&#xff09;正方向&#xff0c;向右为位移正方向。 在规定的正方向条件下&#xff0c;图 1 所示摆杆的角度φ为正值&#xff0c; 下车向右加…

会议高清直播录播系统

怎么两个会场同步直播&#xff1f;部署一套会议高清直播录播系统。 鉴于线上线下同步培训&#xff0c;培训课件内容及互动情况都需要实时同步给终端学员&#xff0c;并且两个会场同步直播这些实时的培训画面。在局域网中&#xff0c;直播录播系统可以通过以下方式实现&#xf…

基于 51 的点阵屏显示 8*8 点阵仿真实验

点亮第一个 8*8 点阵 1. 首先在 Proteus 下选择我们需要的元件 AT89C52、74LS138、MATRIX-8*8-GREEN(在这里使用绿色的点阵)。在Proteus 6.9 中8*8 的点阵总共有四种颜色&#xff0c;分别为MATRIX-88-GREEN ,MATRIX-8*8-BLUE ,MATRIX-8*8-ORANGE,MATRIX-88-RED在这里请大家牢…

数组的最长递减子序列

求一个数组的最长递减子序列 如{9&#xff0c;4&#xff0c;3&#xff0c;2&#xff0c;5&#xff0c;4&#xff0c;3&#xff0c;2}的最长递减子序列为{9&#xff0c;5&#xff0c;4&#xff0c;3&#xff0c;2} 思路&#xff1a;动态规划 构建与原数组同等容量的辅助数组dp,记…

vue3学习(十四)--- vue3中css新特性

文章目录 样式穿透:deep()scoped的原理 插槽选择器:slotted()全局选择器:global()动态绑定CSScss module 样式穿透:deep() 主要是用于修改很多vue常用的组件库&#xff08;element, vant, AntDesigin&#xff09;&#xff0c;虽然配好了样式但是还是需要更改其他的样式就需要用…

《合成孔径雷达成像算法与实现》Figure5.12

clc clear close all%% 距离向参数 R_eta_c 850e3; % 景中心斜距%% 方位向参数 V_r 7100; % 等效速度 T_a 0.64; …

测试开发面经:面了6家公司,最终收割3个Offer

上个月花了一周时间面了6家公司&#xff0c;最终收割3个Offer。通过这6次面试&#xff0c;得到的最宝贵的经验是&#xff1a;快刀斩乱麻。展开说就是&#xff1a;给自己一点点压力&#xff0c;在短时间内迅速面试、迅速反馈、迅速提高&#xff0c;然后迅速进入下一场面试。 以下…

STM32H750之FreeRTOS学习--------(一)初识RTOS

FreeRTOS 一、初识RTOS 裸机&#xff1a;裸机又称为前后台系统&#xff0c;前台系统指的中断服务函数&#xff0c;后台系统指的大循环&#xff0c;即应用程序 实时性差,程序轮流执行delayCPU空等待&#xff0c;效率低程序混乱&#xff0c;臃肿&#xff0c;功能都放在while循环…

1python模块和库

终于到模块和库了&#xff0c;有一点感觉小激动&#xff0c;但是&#xff01;还是想继续努力&#xff0c;最近很多事情不是很顺&#xff0c;我加油学吧&#xff01; 要调用模块&#xff0c;首先你要写一个封装成功的东西 1、先写一个库 class Tool:staticmethoddef t1():pri…

PHP递归实现无限级分类

什么是无限级分类&#xff1f; 无限级分类是一种对商品或信息进行分类的方式&#xff0c;在这种分类方式中&#xff0c;每个分类都可以再次细分出更多的子分类&#xff0c;形成无限的级别 应用场景&#xff1a; 一个电商网站的分类可以是&#xff1a;服装、鞋类、家居用品等…

使用Gateway解决跨域问题时配置文件不生效的情况之一

首先html文件只有一个发送ajax请求 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content&q…

二维码智慧门牌管理系统升级解决方案:要素类型

文章目录 前言一、点要素二、线要素三、面要素四、结语 前言 在二维码智慧门牌管理系统的升级中&#xff0c;我们着重解决了要素类型的问题。要素根据实体特征的不同&#xff0c;我们将其分为点、线、面三种要素类型。这样的分类方式使得管理更加科学、有序&#xff0c;大大提…

拜托,一定要让社区工作者刷到啊

社区工作者的福音来了&#xff0c;真的要试试啊 我愿称之为写作天花板&#xff01;只要输入你要写的内容&#xff0c;几秒钟就出来一篇&#xff0c;关键都不带重复的。 亲测好用&#xff0c;不用再绞尽脑汁的写方案&#xff0c;写总结啦&#xff0c;快试试啊

通过电商API接口分析电商平台客户消费行为

分析目的 通过电商API接口获取的数据分析销售数据来了解在线销售业务的消费情况&#xff0c;分析用户消费数据来分析用户的消费行为&#xff0c;为用户推荐相匹配的商品。 分析问题 店铺销售情况 每月成交额 每月销售金额 每月消费人数 每月订单数量 每月客单价 不同省…

鸡尾酒学习——环游世界

1、材料&#xff1a;白朗姆、龙舌兰、威士忌、金酒、伏特加、蓝橙力娇酒、柠檬汁、红石榴糖浆、橙汁、冰块&#xff1b; 2、口感&#xff1a;酸苦涩口味&#xff0c;下层感觉是在喝橙汁&#xff0c;上层在喝酒&#xff0c;适合喜欢喝橙汁以及酒的人&#xff0c;恰巧我不喜欢这两…

第五天:前端页面展示不出来

0.问题展示 但是我这个 展示不来 1.前端页面 渲染 不出来问题 首先想到的是&#xff0c;前端传值的问题然后排查到前端 传值是正确的传值的话&#xff0c;开始debugger 页面没有&#xff0c;然后找他的父页面&#xff0c;父页面是有值的然后找父 方法内部debugger发现第三步…

【疑问解决】在自动装箱中Integer赋予一个常量1,为什么会出现==判断true和flase的情况(JDK源码、内部缓冲)

问题来源自讲课时的Integer练习中 当时第一反应是false true true 因为第一段的输出为flase毋庸置疑了&#xff0c;因为已经new了两个新的堆空间&#xff0c;当然指向不同的空间了 但是第二段第三段就没有头绪了&#xff0c;自动装箱了难道不是执行同一个空间吗…