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 TransferSource Server         : MariaDBSource Server Type    : MariaDBSource Server Version : 100605 (10.6.5-MariaDB)Source Host           : 127.0.0.1:3306Source Schema         : mybatisTarget Server Type    : MariaDBTarget Server Version : 100605 (10.6.5-MariaDB)File Encoding         : 65001Date: 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中构建 SqlSessionFactoryif (method == 1) {String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);return new SqlSessionFactoryBuilder().build(inputStream);} else if (method == 2) { // 不使用XML构建SqlSessionFactoryDataSource 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.rhkb.cn/news/171086.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在VMware Workstation Pro安装win7

1.下载 地址 2.创建虚拟机 3.选择需要安装的系统镜像 4.选择系统版本 通常情况下选择 Windows 7 Ultimate 旗舰版&#xff0c;点击下一步&#xff0c;若提示产品密钥&#xff0c;则忽略 5.虚拟机命名 虚拟机保存位置保持默认即可&#xff0c;如果有需求可以更换位置 6…

机架式服务器介绍

大家都知道服务器分为机架式服务器、刀片式服务器、塔式服务器三类&#xff0c;今天小编就分别讲一讲这三种服务器&#xff0c;第一篇先来讲一讲机架式服务器的介绍。 机架式服务器定义&#xff1a;机架式服务器是安装在标准机柜中的服务器&#xff0c;一般采用19英寸的标准尺寸…

竞赛选题 深度学习人脸表情识别算法 - opencv python 机器视觉

文章目录 0 前言1 技术介绍1.1 技术概括1.2 目前表情识别实现技术 2 实现效果3 深度学习表情识别实现过程3.1 网络架构3.2 数据3.3 实现流程3.4 部分实现代码 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习人脸表情识别系…

Mysql数据库 4.SQL语言 DQL数据查询语言 查询

DQL数据查询语言 从数据表中提取满足特定条件的记录 1.单表查询 2.多表查询 查询基础语法 select 关键字后指定要查询到的记录的哪些列 语法&#xff1a;select 列名&#xff08;字段名&#xff09;/某几列/全部列 from 表名 [具体条件]&#xff1b; select colnumName…

MySQL 语句

创建表的完整语法 create table t1(id int,name varchar(43),age int); create table 库名.表名( 字段名1 数据类型 约束条件 约束条件 约束条件 约束条件, 字段名2 数据类型 约束条件 约束条件 约束条件 约束条件...); 1. 字段名和数据类型必须…

如何绘制【逻辑回归】中threshold参数的学习曲线

threshold参数的意义是通过筛选掉低于threshold的参数&#xff0c;来对逻辑回归的特征进行降维。 首先导入相应的模块&#xff1a; from sklearn.linear_model import LogisticRegression as LR from sklearn.datasets import load_breast_cancer from sklearn.model_selecti…

内网穿透的应用-Linux JumpServer堡垒机:安全远程访问解决方案

文章目录 前言1. 安装Jump server2. 本地访问jump server3. 安装 cpolar内网穿透软件4. 配置Jump server公网访问地址5. 公网远程访问Jump server6. 固定Jump server公网地址 前言 JumpServer 是广受欢迎的开源堡垒机&#xff0c;是符合 4A 规范的专业运维安全审计系统。JumpS…

tftp服务的搭建

TFTP服务的搭建 1 先更新一下apt包 sudo apt-get update2 服务器端(虚拟机上)安装 TFTP相关软件 sudo apt-get install xinetd tftp tftpd -y3 创建TFTP共享目录 mkdir tftp_sharetftp_shaer的路径是/home/cwz/tftp_share 3.1 修改共享目录的权限 sudo chmod -R 777 tftp…

某大型车企:加强汽车应用安全防护,开创智能网联汽车新篇章

​某车企是安徽省最大的整车制造企业&#xff0c;致力于为全球消费者带来高品质汽车产品和服务体验&#xff0c;是国内最早突破百万销量的汽车自主品牌。该车企利用数字技术推动供应链网络的新型互动&#xff0c;加快数字化转型&#xff0c;持续进行场景创新、生态创新&#xf…

ARM,汇编指令

一、汇编指令 1、搬移指令 mov r0 ,#3 mov r1,r0 msr cpsr,r0 mrs r0,cpsr 2、条件执行及标志位 cmp moveq movgt 3、机器码 1&#xff09;、立即数合法性 2&#xff09;、立即数不合法 ldr r0,0x12345678 伪指令解决不合法的问题 前4位表示16个数&#xff0c;一个数移动2次。 …

springsecurity学习笔记-未完

目录 前言 一、概念 1.什么是springsecurity 2.对比shiro 二、开始项目 1.建立一个空项目&#xff0c;建立module&#xff0c;引入相关依赖 2.启动项目&#xff0c;访问项目 3.自定义密码 总结 前言 记录一下学习springsecurity的过程 开发环境&#xff1a;IDEA 一、概念 1.…

设计模式—创建型模式之单例模式

设计模式—创建型模式之单例模式 介绍 单例模式说明&#xff1a;一个单一的类&#xff0c;负责创建自己的对象&#xff0c;同时确保系统中只有单个对象被创建。 单例模式特点&#xff1a; 某个类只能有一个实例&#xff1b;&#xff08;构造器私有&#xff09;它必须自行创…

JVM虚拟机:Java对象的头信息有什么?

本文重点 在前面的课程中,我们学习了对象头,其中对象头包含Mark Word和class pointer,当然数组还会有一个数组长度。本文主要分析Mark Work中包含的信息。 Mark Word 以下两张图是一个意思: 32位 32位 64位 以上就是Mark Word会存储的信息,这个意思是说Java对象在不同…

一键同步,无处不在的书签体验:探索多电脑Chrome书签同步插件

说在前面 平时大家都是怎么管理自己的浏览器书签数据的呢&#xff1f;有没有过公司和家里的电脑浏览器书签不同步的情况&#xff1f;有没有过电脑突然坏了但书签数据没有导出&#xff0c;导致书签数据丢失了&#xff1f;解决这些问题的方法有很多&#xff0c;我选择自己写个chr…

【Java 进阶篇】Java Request 继承体系详解

在Java编程中&#xff0c;Request&#xff08;请求&#xff09;是一个常见的概念&#xff0c;特别是在Web开发中。Request通常用于获取来自客户端的信息&#xff0c;以便服务器能够根据客户端的需求提供相应的响应。在Java中&#xff0c;Request通常涉及到一系列类和接口&#…

简化路径(C++解法)

题目 给你一个字符串 path &#xff0c;表示指向某一文件或目录的 Unix 风格 绝对路径 &#xff08;以 / 开头&#xff09;&#xff0c;请你将其转化为更加简洁的规范路径。 在 Unix 风格的文件系统中&#xff0c;一个点&#xff08;.&#xff09;表示当前目录本身&#xff1…

存储器概述

一、存储系统基本概念

3DMAX金属屋顶墙面铺设插件使用方法

3DMAX金属屋顶墙面铺设插件教程 3DMAX金属屋顶墙面铺设插件&#xff0c;一键生成金属板屋顶、金属外墙面板&#xff0c;是一款非常实用的建筑建模插件。 【适用版本】 3dMax7或更新版本 【使用方法】 1.启动3dMax软件&#xff0c;打开&#xff08;或创建&#xff09;场景文件…

递归神经网络 (RNN)

弗朗西斯科佛朗哥 一、说明 循环神经网络非常有趣&#xff0c;因为与前馈网络不同&#xff0c;在前馈网络中&#xff0c;数据只能在一个方向上传播&#xff0c;每个神经元可以与连续层的一个或多个神经元连接&#xff0c;在这种类型的网络中&#xff0c;神经元还可以环回自身或…

工作小计-GPU硬编以及依赖库 nvcuvidnvidia-encode

工作小计-GPU编码以及依赖库 已经是第三篇关于编解码的记录了。项目中用到GPU编码很久了&#xff0c;因为yuv太大&#xff0c;所以编码显得很重要。这次遇到的问题是环境的搭建问题。需要把开发机上的环境放到docker中&#xff0c;以保证docker中同样可以进行GPU的编码。 1 定…