当前位置: 首页 > news >正文

MyBatis的配置及简单使用

1.配置myBatis

1.myBatis的作用

MyBatis 是一个开源的持久层框架,它的主要作用是简化数据库操作,使得开发者能够更方便地与数据库进行交互。 MyBatis 允许开发者使用简单的 XML 或注解配置 SQL 映射,从而实现数据库操作,而不需要手动编写繁琐的 JDBC 代码。

我们之前学习过,xml是一种用来存储映射关系的语言。而当我们和数据库做连接的时候,其实用java语言实现了很多映射关系。比如当我们用jdbc连接数据库的时候,如果把这个连接看作一个抽象的对象,这个连接对象有许多属性,比如url,用户名,密码等等。这时如果我们使用xml和myBatis来配置这些关系,就不需要专门编写一个类来连接数据库了。

再举例来说,如果我们从数据库中读取了一个用户的两个属性——用户名和密码。此时我们希望把这两个属性放入一个java的用户对象中。我们可以选择new一个user对象,向构造器传入我们刚刚读取的两个属性。但一旦从数据库中读取的内容变多,我们就需要new很多新的对象。这时我们就可以通过xml和myBatis来配置一种映射关系,当我从数据库中读取时,自动完成java对象的创建。

总体而言,MyBatis 提供了一种简单而灵活的方式来处理数据库交互,同时保持了足够的可定制性。它被广泛用于 Java 项目中,尤其在与关系型数据库的交互中表现出色。

2.下载

Releases · mybatis/mybatis-3 (github.com)

下载assets的第一个。(已经编译过的,而不是源码)找到里面的jar包,复制到工程文件的lib文件夹下(如果没有lib文件夹,就直接复制到工程的大文件夹下),然后右键,选择添加为库,就配置完成了。 

 3.配置

我们在工程文件的大目录下(最外层)创建一个xml文件,用来连接数据库。xml文件中的内容如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- XML 配置文件的根元素,包含了 MyBatis 的全局配置信息 --><!-- 定义了数据库环境配置 --><environments default="development"><!-- 默认使用的数据库环境 --><!-- 定义一个数据库环境 --><environment id="development"><!-- 事务管理器的配置 --><transactionManager type="JDBC"/><!-- 数据源的配置 --><dataSource type="POOLED"><!-- 数据库驱动 --><property name="driver" value="com.mysql.cj.jdbc.Driver"/><!-- 数据库连接 URL --><property name="url" value="jdbc:mysql://localhost:3306"/><!-- 数据库用户名 --><property name="username" value="root"/><!-- 数据库密码 --><property name="password" value="020809"/></dataSource></environment></environments>
</configuration>

重点在于

 <!-- 数据库驱动 -->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>

                <!-- 数据库连接 URL -->
                <property name="url" value="jdbc:mysql://localhost:3306"/>

                <!-- 数据库用户名 -->
                <property name="username" value="root"/>

                <!-- 数据库密码 -->
                <property name="password" value="020809"/>

这里的内容需要根据自己的实际情况而变化。这里使用的是mysql数据库。

2.通过myBatis将sql语句返回的值自动包装成一个java对象

如果我们从数据库中读取了一个用户的两个属性——用户名和密码。此时我们希望把这两个属性放入一个java的用户对象中。我们可以选择new一个user对象,向构造器传入我们刚刚读取的两个属性。但一旦从数据库中读取的内容变多,我们就需要new很多新的对象。这时我们就可以通过xml和myBatis来配置一种映射关系,当我从数据库中读取时,自动完成java对象的创建。 

1. 创建对应的类

以上面为例。要想把数据库里的数据映射成一个java对象,首先我们需要有一个对应的java类来描述数据库中的这个对象。

package Mybatis;import lombok.Data;@Data
public class User {String username; //名称最好和数据库字段名称保持一致,不然可能会映射失败导致查询结果丢失String password;
}

2.Lombok 

lombok是一种可以简化代码的框架,这里的@Data注释表明:在编译时,lombok框架会自动将这个类重新编译,添加一些常用方法,如 toStringequalshashCode、以及所有字段的 getter 和 setter 方法。所以在这个类里,即使字段默认为protected的,也没有编写getter和setter方法,但是在这个类外,我们依旧可以使用getter和setter方法来编辑类。

3.mapper

我们需要一种配置文件(映射关系)来告诉myBatis:对于某一种特定的sql语句,应该把sql里user的a内容映射到 java中user类的a字段上。

我们在工程文件的大目录下创建一个配置文件Mapper.xml,配置文件内容如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--MyBatis 映射器(Mapper)XML 文件,用于定义 SQL 映射配置。映射器文件通常用于将数据库操作与 Java 方法关联起来。
--><!-- 定义映射器命名空间,通常与对应的 Java 接口或类的全限定名一致 -->
<mapper namespace="User"><!--定义一个查询操作,id 属性为该操作的唯一标识符。resultType 属性指定查询结果的返回类型,这里是 com.test.entity.Student。--><select id="selectUser" resultType="Mybatis.User">select * from user</select><!--在实际项目中,查询语句通常更为复杂,可以包含条件、关联查询等。这里的示例是一个简单的查询所有user的语句。--></mapper>

注意这一段:

 <!-- 定义映射器命名空间,通常与对应的 Java 接口或类的全限定名一致 -->
<mapper namespace="User"><!--定义一个查询操作,id 属性为该操作的唯一标识符。resultType 属性指定查询结果的返回类型--><select id="selectUser" resultType="Mybatis.User">select * from user</select>

 namespace是这个mapper的名字

id指的是“select * from user”这条语句的名字,起了这个名字后,我们就可以在后面的java代码里用这个名字指代这条sql语句

resultType是需要映射成的类型的位置(不是电脑里的路径,是在java里的位置,哪个包(也可能不在包里,看你自己),哪个类),在这个例子里User是类名,Mybatis是User类所在的包名,这个地方每个人不一样,根据你的类的位置来决定。

4.在myBatis配置文件里添加mapper

当我们完成mapper之后,我们需要告诉java:我配置好了这个一个mapper。而myBatis和java连接就是靠我们一开始配置的哪个xml配置文件,所以我们在那个配置文件里添加如下语句:

   <mappers><mapper url="file:UserMapper.xml"/></mappers>

 “file:”表明这里的mapper是一个本地的file,冒号后可以跟mapper文件的相对路径或绝对路径。(这里是相对路径)(不是上面说的Java里的位置)(不是上面namespace属性里mapper的名字)

路径example:C:\Users\86136\projects\IdeaProjects\javaWeb\UserMapper.xml

添加完成后的完整的myBatis配置文件如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- XML 配置文件的根元素,包含了 MyBatis 的全局配置信息 --><!-- 定义了数据库环境配置 --><environments default="development"><!-- 默认使用的数据库环境 --><!-- 定义一个数据库环境 --><environment id="development"><!-- 事务管理器的配置 --><transactionManager type="JDBC"/><!-- 数据源的配置 --><dataSource type="POOLED"><!-- 数据库驱动 --><property name="driver" value="com.mysql.cj.jdbc.Driver"/><!-- 数据库连接 URL --><property name="url" value="jdbc:mysql://localhost:3306"/><!-- 数据库用户名 --><property name="username" value="root"/><!-- 数据库密码 --><property name="password" value="020809"/></dataSource></environment></environments><mappers><mapper url="file:UserMapper.xml"/></mappers>
</configuration>

5.SqlSessionFactory

我们已经配置好了myBatis,当我们希望使用myBatis的时候,我们就会创建一个SqlSessionFactory类,在这个类里使用myBatis的各种功能。

每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的,我们可以通过SqlSessionFactory来创建多个新的会话——SqlSession对象,你可以认为这就是之前JDBC中的Statement对象,会话之间相互隔离,没有任何关联。(我可以通过mysql的用户界面访问数据库,创建会话,也可以通过idea来访问数据库,这两种访问方式虽然都访问了相同的数据库,但相互没有关联)。

package Mybatis;import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.List;/*** 我们已经配置好了myBatis,当我们希望使用myBatis的时候,* 我们就会创建一个SqlSessionFactory类,在这个类里使用myBatis的各种功能。*/
public class Main {public static void main(String[] args) throws FileNotFoundException {//寻找配置文件SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(new FileInputStream("myBatis_config.xml"));//sqlSession就像之前的statement一样,创建一个连接,执行sql语句,它也需要关闭,所以写进trytry (SqlSession sqlSession = sqlSessionFactory.openSession(true)){//这里的参数是mapper里指定的那个sql语句的名称//也就是UserMapper.xml里的id字段的名称List<User> student = sqlSession.selectList("selectUser");//这行代码使用了 Java 8 引入的新特性之一,称为方法引用(Method Reference)。// 具体来说,System.out::println 是一个静态方法引用,用于将 println 方法关联到 System.out 对象上。//在这里,System.out::println 等效于 lambda 表达式 (s) -> System.out.println(s)。// 它表示将遍历 student 集合的每个元素,并将每个元素传递给 System.out.println 方法,实现在控制台上打印每个元素的效果。student.forEach(System.out::println);}}
}

运行后应该可以打印出数据库的全部内容,并且list中存放了和数据库等大小的user对象:

相关文章:

MyBatis的配置及简单使用

1.配置myBatis 1.myBatis的作用 MyBatis 是一个开源的持久层框架&#xff0c;它的主要作用是简化数据库操作&#xff0c;使得开发者能够更方便地与数据库进行交互。 MyBatis 允许开发者使用简单的 XML 或注解配置 SQL 映射&#xff0c;从而实现数据库操作&#xff0c;而不需要…...

【UE Niagara学习笔记】07 - 火焰的热变形效果

目录 效果 步骤 一、创建热变形材质 二、添加新的发射器 2.1 设置粒子材质 2.2 设置粒子初始大小 2.3 设置粒子持续生成 三、修改材质 四、设置粒子效果 在上一篇博客&#xff08;【UE Niagara学习笔记】06 - 制作火焰喷射过程中飞舞的火星&#xff09;的基础上继续…...

深度学习模型中 argparse 模块Python 脚本的部分参数解读

尤其注意下面这句中的action"store_true"的作用解析&#xff1a; --resume_ckpt 是一个标志参数&#xff0c;它不需要附加值。如果将该参数作为命令行参数传递给脚本&#xff0c;则 resume_ckpt 的值将被设置为 True。action"store_true" 意味着如果在命令…...

在win10和Linux上配置SSH 无密码登录

文章目录 一、用途二、在本地机器上使用ssh-keygen产生公钥私钥对1&#xff09;在Linux (或macOS) 上产生SSH公私钥的方法2&#xff09;在win10上产生SSH公私钥的方法a&#xff09;检查windows 本地是否安装有sshb&#xff09;在本地生成SSH密钥对&#xff08;公钥和私钥&#…...

【VUE】无法加载文件 \node\vue.ps1,因为在此系统上禁止运行脚本。问题解决

问题描述 在VS Code中输入vue create -p dcloudio/uni-preset-vue uniapp-demo命令时报错 无法加载文件 D:\address\node\vue.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_Executi…...

C //练习 4-12 运用printd函数的设计思想编写一个递归版本的itoa函数,即通过递归调用把整数转换为字符串。

C程序设计语言 &#xff08;第二版&#xff09; 练习 4-12 练习 4-12 运用printd函数的设计思想编写一个递归版本的itoa函数&#xff0c;即通过递归调用把整数转换为字符串。 注意&#xff1a;代码在win32控制台运行&#xff0c;在不同的IDE环境下&#xff0c;有部分可能需要…...

【python playwright 安装及验证】

python playwright pip install playwright pip install playwright -i http://mirrors.aliyun.com/pypi/simple/ playwright codegen -o script.py -b chromium --ignore-https-errors --viewport-size “2560,1440” --proxy-server “http://100.8.64.8:60497” https://w…...

极简云源码已经开源

源码介绍 极简云已经开源 解绑卡密 查询卡密 总体来说还是很完善的 对接例子网盘里有 用户注册需要配置邮箱 上网页QQ邮箱标准版开启SMTP 然后生成授权码 后台发信邮箱里填就对了 实在不会配置邮箱的 可以下载网盘里的reg.php 把reg.php上传源码里的user目录 之后注册就不需要…...

Shell中cp和mv命令说明

在Shell&#xff08;如Bash&#xff09;中&#xff0c;cp 和 mv 是两个常用的命令&#xff0c;用于处理文件和目录。它们的用法和作用如下&#xff1a; cp 命令 作用&#xff1a;cp&#xff08;copy的缩写&#xff09;用于复制文件或目录。基本用法&#xff1a;cp [选项] 源文…...

cssip 第11章 : 安全网络架构和保护网络组件

11.1 OSI模型 协议&#xff1a;定义数据如何通过网络介质传输。 11.1.1 OSI模型的历史 开发 OSI 协议是为给所有计算机系统建立通用的通信结构或标准。 OSI模型表示&#xff1a;应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。 11.1.3 封装/解…...

ITSS申报条件以及评审方式

01、四级申报基本条件&#xff1a; &#xff08;1&#xff09;具有独立法人地位&#xff1b; &#xff08;2&#xff09;已按照《运维服务能力成熟度》四级特征和关键指标建立了运维服务能力体系&#xff0c;且已有效运行三个月以上&#xff1b; &#xff08;3&#xff09;能…...

Qt中QByteArray之元素访问

访问QByteArray类对象中的某个元素主要有4种方式,分别为[]、at()、 data[]和constData[]。其中&#xff0c;[]和data]]方式为可读可写&#xff0c;at()和constData[]方式仅为可读。如果只是进行读操作&#xff0c;则通过at()和constData[]方式的访问速度最快&#xff0c;因为避…...

java实现教务管理系统

git地址&#xff1a;https://gitee.com/myshort-term/school-management 1.系统简介 开发教务管理系统程序&#xff0c;设计了ems&#xff08;EMSApp&#xff09;、dao&#xff08;AssignmentDAO、CourseDAO、DeptDAO、ScoreDAO、UserDAO、EmailDAO&#xff09;、domain&#…...

NPS配置https访问web管理页面

因为NPS默认也支持http的访问&#xff0c;所以在部署完后就一直没在意这个事情。 因为服务器是暴露在公网内的&#xff0c;所以还是要安全一点才行。不然一旦远控的机器被破解了就很危险了 一、使用nginx反向代理访问 1、首先在nps的配置文件里关闭使用https选项&#xff0c;…...

nginx和CDN应用

一、代理的工作机制 1&#xff0e;代替客户机向网站请求数据&#xff0c;从而可以隐藏用户的真实IP地址。 2&#xff0e;将获得的网页数据&#xff08;静态 Web 元素&#xff09;保存到缓存中并发送给客户机&#xff0c;以便下次请求相同的数据时快速响应。 二、代理服务器的…...

Keil5如何生成反汇编文件

Keil5如何生成反汇编文件 在Keil5界面下点击选项&#xff0c;选择“User”&#xff0c;勾选“After Build/Rebuild”中“RUN #1”&#xff0c;复制fromelf --text -a -c --outputxxx.dis xxx.axf 在Linker栏中找到“Linker Control string”里最后-o后的.axf文件&#xff0c;将…...

网络地图服务(WMS)详解

文章目录 1.概述2.GetCapabilities3.GetMap4.GetFeatureInfo 阅读本文之前可参考前文&#xff1a;《地图服务器GeoServer的安装与配置》与《GeoServer发布地图服务&#xff08;WMS、WFS&#xff09;》。 1.概述 经过前文的介绍&#xff0c;相信我们对WMS/WFS服务已经有了一个非…...

【排序篇3】快速排序、归并排序

目录 一、快速排序1.1 递归1.2 非递归 二、归并排序2.1 递归2.2 非递归 一、快速排序 1.1 递归 快速排序的递归采用二叉树的前序遍历的思路&#xff0c;单趟排序先确定好一个元素的位置&#xff0c;然后往后递归再确定其他子区域内的某个元素的位置&#xff0c;直到只有一个元…...

Python中的@property

在 Python 中&#xff0c;property 是一种装饰器&#xff0c;用于将一个方法转换成只读属性。通过使用 property 装饰器&#xff0c;你可以定义一个类的方法&#xff0c;使其在访问时可以像访问属性一样&#xff0c;而不是通过方法调用。 下面是一个简单的例子来说明 property …...

二叉树基础oj练习(单值二叉树、相同的树、二叉树的前序遍历)

讲了这么多数据结构相关的知识(可以看我的数据结构文章专栏): 抓紧刷题巩固一下了 目录 1.单值二叉树 题目描述 思路1 代码1 思路2 代码2 2.相同的树 题目描述 思路 代码 3.二叉树的前序遍历 代码 思路 1.单值二叉树 965. 单值二叉树 - 力扣&#xff08;LeetCod…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...