【Spring】初识MyBatis (一)

news2024/11/19 7:40:38

MyBatis概述

MyBatis是一个支持普通SQL查询、存储过程以及高级映射的持久层框架,它消除了几乎所有的JDBC代码和参数的手动设置以及对结果集的检索,并使用简单的XML或注解进行配置和原始映射,用以将接口和Java的POJO(Plain Old Java Object,普通Java对象)映射成数据库中的记录,使得Java开发人员可以使用面向对象的编程思想来操作数据库。

1.什么是MyBatis

MyBatis框架也被称为ORM(Object/ Relational Mapping,对象关系映射)框架。所谓ORM,就是一种为了解决面向对象与关系型数据库中数据类型不匹配的技术,通过描述Java对象与数据库表之间的映射关系自动将Java应用程序中的对象持久化到关系型数据库的表中。

使用ORM框架后,应用程序不再直接访问底层数据库,而是以面向对象的方式来操作持久化对象(Persisent Object,PO),而ORM框架则会通过映射关系将这些面向对象的操作转换成底层的SQL操作。

MyBatis:一个半自动映射的框架。这里所谓的“半自动”是相对于Hibernate全表映射而言的,MyBatis需要手动匹配提供POJO、SQL和映射关系,而Hibernate只需提供POJO和映射关系即可。与Hibernate相比,虽然使用MyBatis手动编写SQL要比使用Hibernate的工作量大,但MyBatis可以配置动态SQL并优化SQL,可以通过配置决定SQL的映射规则,它还支持存储过程等。对于一些复杂的和需要优化性能的项目来说,显然使用MyBatis更加合适。

2. MyBatis的安装

  • 要使用 MyBatis, 只需将 mybatis-x.x.x.jar 文件置于类路径(classpath)中即可。
  • 如果使用 Maven 来构建项目,则需将下面的依赖代码置于 pom.xml 文件中:
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>x.x.x</version>
</dependency>

MyBatis入门程序

(用户信息管理为例)

1.查询用户

在实际开发中,查询操作通常都会涉及单条数据的精确查询以及多条数据的模糊查询。那么使用MyBatis框架是如何进行这两种查询的呢?

如何使用MyBatis框架根据用户编号查询客户信息,以及根据用户名模糊查询用户信息。

1.1 根据用户编号(id)查询用户信息

【示例6-1】根据用户编号查询用户信息主要是通过查询用户表中的主键(这里表示唯一的用户编号)来实现的,其具体实现步骤如下。

步骤01 在MSQL数据库中创建一个名为db_mybatis的数据库,在此数据库中创建一个t_user表,同时预先添加几条数据,对应的SQL语句如下所示。

# 创建数据库db_mybatis
CREATE DATABASE db_mybatis;
# 使用db_mybatis
USE db_mybatis;
#创建表t_user
CREATE TABLE t_user (
		id int(32) PRIMARY KEY AUTO_INCREMENT,
		username varchar(50),
		job varchar(50),
		phone varchar(16)
);
# 向数据表t_user插入数据
INSERT INTO t_user VALUES(1,'zhangsan','teacher','13959798568');
INSERT INTO t_user VALUES(2,'lisi','worker','13959798569');
INSERT INTO t_user VALUES(3,'wangwu','doctor','13959798570');

在这里插入图片描述

步骤04 在src目录下创建一个com.ssm.po包,在该包下创建持久化类User,并在类中声明id、username、jobs和phone属性,及其对应的getter/setter法。

package com.ssm.po;

/**
 * 功能描述
 *
 * @author: 衍生星球
 * @date: 2023年05月08日 15:05
 */

public class User {
    private Integer id; //用户id
    private String username; //用户姓名
    private String jobs;  //用户职业
    private String phone; //用户电话号码

    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }

    public String getJobs() {
        return jobs;
    }
    public void setJobs(String jobs) {
        this.jobs = jobs;
    }

    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    public String toString() {
        return "User [id= " + id + ", username= " + username + ", jobs= " + jobs + ", phone= " + phone + "]";
    }
}

从上述代码可以看出,持久化类User与普通的JavaBean并没有什么区别,只是其属性字段与数据库中的表字段相对应。实际上,User就是一个POJO(普通Java对象)。MyBatis就是采用POJO作为持久化类来完成对数据库操作的。

步骤05 在src目录下创建一个com.ssm.mapper包,并在包中创建映射文件UserMapper.xml。

<?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="com.ssm.mapper.UserMapper">
    <!--  根据用户编号获取用户信息  -->
    <select id="findUserById" parameterType="Integer" resultType="com.ssm.po.User">
        select * from t_user where id=# {id}
    </select>
</mapper>

第02、03行是MyBatis的约束配置,第04~09行是需要程序员编写的映射信息。其中,<mapper>元素是配置文件的根元素,包含一个namespace属性,该属性为<mapper>元素指定了唯一的命名空间,通常会设置成“包名+SQL映射文件名”的形式。子元素<select>中的信息是用于执行查询操作的配置,其id属性是<select>元素在映射文件中的唯一标识;parameterType属性用于指定传入参数的类型,这里表示传递给执行SQL的是一个Integer类型的参数;resultType属性用于指定返回结果的类型,这里表示返回的数据是Customer类型。在定义的查询SQL语句中,“#{}”用于表示一个占位符,相当于“?”;而“#{id}”表示该占位符待接收参数的名称为id。

步骤06 在src目录下创建MyBatis的核心配置文件mybatis-config.xml。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--    1.配置环境,默认的环境 id 为 mysql-->
    <environments default="mysql">
<!--        1.2 配置id为mysql 的数据库环境-->
        <environment id="mysql">
<!--            使用JDBC的事务管理-->
            <transactionManager type="JDBC" />
<!--            数据库连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost;3306/db_mybatis" />
                <property name="username" value="root" />
                <property name="password" value="root" />
            </dataSource>
        </environment>
    </environments>
<!--2.配置 Mapper的位置-->
    <mappers>
        <mapper resource="com.ssm.mapper.UserMapper.xml"/>
    </mappers>
</configuration>

第02、03行是MyBatis的配置文件的约束信息。下面<configuration>元素中的内容是开发人员需要编写的配置信息。这里按照<configuration>子元素的功能将配置分为了两个步骤:

  • 第1步,配置环境;
  • 第2步,配置mapper的位置。

步骤07 在src目录下创建一个com.ssm.test包,在该包下创建测试类MybatisTest,并在类中编写测试方法findUserByIdTest()。

package com.ssm.test;
import java.io.InputStream;
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.junit.Test;
import com.ssm.po.User;


/**
 * 入门程序测试类
 *
 * @author: 衍生星球
 * @date: 2023年05月08日 16:54
 */

public class MybatisTest {
    /**
     * 根据用户id查询用户信息
     */
    @Test
    public void findUserByIdTest() throws Exception {
        //1.读取配置文件
        String resourse = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resourse);
        //2.根据配置文件构建SqlSessionFactory实例
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //3.通过SqlSessionFactory创建SqlSession实例
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //4.SqlSession执行映射文件中定义的SQL,并返回映射结果
        User user = sqlSession.selectOne("com.ssm.mapper.UserMapper.findUserById",2);
        //5.打印输出结果
        System.out.println(user.toString());
        //6.关闭SqlSession
        sqlSession.close();
    }
}

findUserByIdTest()方法中,首先通过输入流读取了配置文件,然后根据配置文件构建了SqlSessionFactory对象。接下来通过SqlSessionFactory对象又创建了SqlSession对象,并通过SqlSession对象的selectOne()方法执行查询操作。selectOne()方法的第1个参数表示映射SQL的标识字符串,由UserMapper.xml<mapper>元素的namespace属性值+<select>元素的id属性值组成;第2个参数表示查询所需要的参数,这里查询的是用户表中id为1的用户。为了查看查询结果,这里使用了输出语句输出查询结果信息。最后,程序执行完毕时,关闭了SqlSession

在这里插入图片描述

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

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

相关文章

Qt libqrencode二维码——QtWidgets

前言 之前写过二维码的程序&#xff0c;但是在U盘上&#xff0c;没带&#xff0c;又重新找的网上资料写的。 网上二维码的生成&#xff0c;大多用到是第三方库libqrencode,这也一样&#xff1a; 效果图 本来是个动图的&#xff0c;都被和谐了&#xff0c;所以换成截图&…

2023年必学的一款测试工具,10 分钟上手

近两年有一款 UI 测试工具非常火爆&#xff0c;名字叫 cypress, 官方号称超越 selenium, 是面向下一代的测试工具。 那 cypress 到底要不要学呢&#xff1f;学起来容易吗&#xff1f;我们一起来看一下。 资料传送门&#xff1a;《软件测试全套基础/进阶/转行资料》 安装 cy…

【计算机视觉】最强 Zero-Shot 视觉应用:Grounding DINO + Segment Anything + Stable Diffusion

文章目录 一、前言二、功能介绍2.1 功能一2.2 功能二2.3 其他有趣的功能 三、总结 一、前言 用 Midjourney 花一个小时做的项目 logo 图&#xff1a; 解释一下 logo 的含义&#xff1a;一只坐在地上的马赛克风格的熊。 坐在地面上是因为 ground 有地面的含义&#xff0c;然后分…

数据流传输适配器系列产品设计资料保存:220-基于光纤的数据流传输适配器系列产品

220-基于光纤的数据流传输适配器系列产品 一、产品概述 光纤传输适配器为公司主力产品&#xff0c;主要包括10Gbps传输&#xff0c;40Gbps传输和100Gbps光纤传输&#xff0c;适配CameraLink&#xff08;双base或者1路Full&#xff09;、HDMI、HD-SDI&#xff1b;多路AD&#x…

TikTok数据报告要怎么看?

TikTok数据报告是一种分析和汇总TikTok平台上数据的报告&#xff0c;包含TikTok平台上的用户数据、视频数据、广告数据等。TK卖家每年可以通过分析TK数据报告来更好地了解受众和市场趋势&#xff0c;从而制定更加精准的营销策略和提升销售业绩。TikTok数据报告也可以帮助商家更…

分布式锁Redission对于(不可重入、不可重试、超时释放、主从一致性)四个问题的应对

文章目录 1 Redission介绍2 Redission快速入门3 Redission可重入锁原理4 Redission锁重试和WatchDog机制5 Redission锁的MutiLock原理 基于setnx实现的分布式锁存在下面的问题&#xff1a; 重入问题&#xff1a;重入问题是指 获得锁的线程可以再次进入到相同的锁的代码块中&…

JavaScript 特性 this与“bind“和“call“,“apply“的理解

本文的目的是帮助JavaScript初学者更好地理解"bind"方法&#xff0c;并帮助那些对"this"的理解不太清楚的人更好地理解"bind"方法和"this"之间的关系。特别是对于那些对"this"的理解不太清楚的人是有所帮助的。在深入学习&q…

通信端点(应用端点)与套接字的关系

为了实现以太网通信的分层与解耦,应用程序通常并不直接驱动TCP/IP协议栈发送以太网数据包。它们通过所在系统提供的一个叫做套接字的东西,调用套接字的接口函数创建套接字处理程序。用套接字处理程序发送自己的应用数据。 返回的套接字处理程序,就代表了这个应用程序。这就…

一篇文章搞定《RecyclerView缓存复用机制》

------《RecyclerView缓存复用机制》 前言零、为什么要缓存一、RecyclerView如何构建我们的列表视图二、缓存过程三、缓存结构1、mChangedScrap/mAttachedScrap2、mCachedViews3、mViewCacheExtension4、mRecyclerPool 四、总结 前言 本篇文章&#xff0c;暂时不加入预加载进行…

沃尔玛入驻教程:中国卖家如何免费、快速入驻沃尔玛walmart.com?

作为一家全球知名的零售巨头&#xff0c;沃尔玛&#xff08;Walmart&#xff09;的在线商城walmart.com拥有庞大的消费者基础和巨大的商机。对于中国的卖家来说&#xff0c;入驻沃尔玛的平台是一个很好的机会&#xff0c;但是有没有什么方法可以免费、快速入驻呢&#xff1f;有…

CTF-PHP反序列化漏洞4-实例理解POP链(经典赛题)

作者&#xff1a;Eason_LYC 悲观者预言失败&#xff0c;十言九中。 乐观者创造奇迹&#xff0c;一次即可。 一个人的价值&#xff0c;在于他所拥有的。可以不学无术&#xff0c;但不能一无所有&#xff01; 技术领域&#xff1a;WEB安全、网络攻防 关注WEB安全、网络攻防。我的…

软件测试 - 缺陷管理

1. 缺陷的定义 产品不满足用户的需求或者测试执行时实际结果和预期结果不一致都属于缺陷。 2. 缺陷的判定标准及产生原因 软件不满足下述任何一种都算作是软件的缺陷&#xff0c;缺陷的概念是包括bug概念的。 未达到需求说明书指明的功能出现了需求说明书指明不应该出现的错…

cordova-10 打apk

Android升级到api 31后&#xff0c;ionic打出来的release包默认是一个aab文件&#xff0c;要想走以前的手动签名和zipalign的流程我需要打一个没有签名的apk的包&#xff0c;参考以下文章&#xff1a; Android Platform Guide - Apache Cordova Ionic Cordova Build for Andro…

Ubuntu: 搭建 NFS 服务器

文章目录 1. 前言2. 测试环境3. NFS 服务器搭建3.1 安装 NFS 服务3.2 导出 NFS 共享目录3.3 重启 NFS 服务 4. 客户端连接 NFS 服务端5. VMware Ubuntu6. Linux 内核 NFS 支持 1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读者带来的损失&…

Seurat -- 数据集的整合

文章目录 briefPerforming integration on datasets normalized with LogNormalizePerforming integration on datasets normalized with SCTransform brief 这里主要根据seurat的教程走的&#xff0c;描述了多个单细胞数据集的整合&#xff0c;其中数据集的integration并不是…

java的对象模型

背过面试题的朋友都知道&#xff0c;Java对象是保存在堆内存中&#xff0c;在内存中&#xff0c;一个Java对象包含三部分&#xff1a;对象头&#xff0c;实例数据&#xff0c;对其填充。其中对象头是一个很关键的部分&#xff0c;因为对象头中包含锁状态标志&#xff0c;线程持…

使用MindSDK的at-server组件开发从机模组

使用MindSDK的at-server组件开发从机模组 文章目录 使用MindSDK的at-server组件开发从机模组引言AT命令应用场景AT命令技术简介MindSDK中的at-server组件及样例工程at_port.cat_cmd_led.cmain.c 基于AT命令的人机交互应用使用串口调试助手软件发送AT命令使用Python脚本发送AT命…

Java高阶数据结构 并查集 最小生成树

并查集与最小生成树 文章目录 Java高阶数据结构 & 并查集 & 最小生成树1. 并查集1.1 并查集的原理1.1.1 例子&#xff1a;1.1.2 这样存储有什么好处呢&#xff1f; 1.2 并查集的代码实现1.2.1 类的定义与属性1.2.2 构造方法1.2.3 获取下标的方法1.2.4 获得根节点1.2.5 …

1.SpringCloud技术实用02

SpringCloud技术实用02 0.学习目标 1.Nacos配置管理 Nacos除了可以做注册中心&#xff0c;同样可以做配置管理来使用。 1.1.统一配置管理 当微服务部署的实例越来越多&#xff0c;达到数十、数百时&#xff0c;逐个修改微服务配置就会让人抓狂&#xff0c;而且很容易出错。…

ES+Redis+MySQL 高可用架构设计

一、背景 二、ES高可用方案 三、会员Redis缓存方案 四、高可用会员主库方案 五、异常会员关系治理 六、展望&#xff1a;更精细化的流控和降级策略 一、背景 会员系统是一种基础系统&#xff0c;跟公司所有业务线的下单主流程密切相关。如果会员系统出故障&#xff0c;会…