【Mybatis入门】配置Mybatis(IDEA)

Mybatis和JDBC一样,是连接数据库的工具。它是一款优秀的持久层框架,主要用于 Java 语言中简化数据库操作,实现对象与数据库表之间的映射。

Mybatis相比于JDBC的优势

Mybatis消除了传统 JDBC 代码中繁琐的手动处理、参数设置、结果集解析等重复工作,让开发者更专注于 SQL 逻辑本身。

JDBC操作数据库的大概流程如下:

1.加载数据库驱动

2.创建并获取数据库连接对象connection

3.通过连接对象获取会话对象statement

4.编写sql语句

5.如果有参数的话需要通过Statement设置参数

6.执行sql语句并获取结果

7.关闭资源

上述操作流程会造成一些问题:

  • JDBC连接数据库频繁创建、释放,浪费资源进而影响系统性能。
  • sql代码写在java文件当中,如果在开发过程中我们改动某个sql,就需要去修改java代码,改完之后还需要重新编译。
  • JDBC对结果集的解析是硬编码,sql变化会导致解析结果的代码也跟着变化,系统不易维护。

而针对 JDBC 编程的劣势,MyBatis 提供了以下解决方案:

  • 在 SqlMapConfig.xml 中配置数据连接池,使用连接池管理数据库链接,避免了连接频繁创建和释放;
  • 将 SQL 语句分离到配置文件中,MyBatis 允许将 SQL 语句写在 XML 映射文件或使用注解的方式定义,与 Java 业务代码完全分离;
  • 提供自动映射机制,MyBatis 可以根据 SQL 查询结果的列名与 Java 实体类的属性名进行自动匹配,将结果集自动封装为对应的实体对象,无需手动编写结果集解析代码。

Mybatis环境配置

创建数据库和表结构

create database mybatis_demo; use mybatis_demo;CREATE TABLE `user` (
`id` int(11) NOT NULL auto_increment,
`username` varchar(32) NOT NULL COMMENT '用户名称',
`birthday` datetime default NULL COMMENT '生日',
`sex` char(1) default NULL COMMENT '性别',
`address` varchar(256) default NULL COMMENT '地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;insert into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (1,'老王','2018-02-27
17:47:08','男','北京'),(2,'熊大','2018-03-02 15:09:37','女','上海'),(3,'熊二','2018-03-04
11:34:34','女','深圳'),(4,'光头强','2018-03-04 12:04:06','男','广州');

建好后的表如图:

之后去官网下载 MyBatis,在D盘根目录解压下载的MyBatis文件 apache-maven-3.6.2,同样在D盘根目录新建 maven 文件夹用于存项目开发jar包。

下载好后就可以打开IDEA,我们创建一个Maven项目

之后点击 File -> Settings,将Maven配置成我们本地下载的文件

建好后的项目如图:

在pom.xml文件中导入maven相关依赖,用于声明项目运行或编译时需要依赖的第三方库(Jar 包),Maven 会根据这些配置自动下载并管理这些依赖。

引入坐标

1. 引入MyBatis的3.4.5的版本的坐标

2. 引入MySQL驱动的jar包,5.1.6版本

3. 引入Junit单元测试的jar包

4. 引入log4j的jar包,1.2.12版本(需要引入log4j.properties的配置文件)

<dependencies>
<!--mybatis核心包--> 
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!--mysql驱动包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
<!-- 日志 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>

点击加载jar包后即可使用

依旧是在 File -> Settings中,我们手动创建 SqlMapConfig.xml 模版文件(名字无所谓),用于配置 MyBatis 的运行环境、数据库连接信息、类型别名、映射文件路径等关键信息。
这里我们需要配置数据库环境,可以配置多个environment环境,通过 default 属性指定默认mysql环境,以及配置 Mapper 映射文件的路径,告诉 MyBatis 去哪里找映射文件。

在resources目录下按照模板创建SqlMapConfig.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><!-- settings:控制mybatis的全局行为--><settings><!--设置mybatis输出日志--><!--logImpl:表示对日志的控制--><!--STDOUT_LOGGING:将日志输出到控制台上--><setting name="logImpl" value="STDOUT_LOGGING" /></settings><environments default="mysql"><environment id="mysql"><!--配置事务的类型,使用本地事务策略--><transactionManager type="JDBC"></transactionManager><!--是否使用连接池 POOLED表示使用链接池,UNPOOLED表示不使用连接池--><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis_demo"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><mappers><mapper resource="mapper/UserMapper.xml"></mapper></mappers>
</configuration>

创建dao包和entity包

在entity包中编写User的实体类,用于封装 User 对象的属性(与数据库中的属性相对应),属性尽量使用包装类型,具体的代码如下(快捷键alt+enter:导入类; alt+insert:添加Getter、Setter、toString方法)

package com.qcby.entity;
import java.util.Date;public class User {private Integer id;private String username;private Date birthday;private String sex;private String address;public User(){};public User(String username, Date birthday, String sex, String address) {this.username = username;this.birthday = birthday;this.sex = sex;this.address = address;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", birthday=" + birthday +", sex='" + sex + '\'' +", address='" + address + '\'' +'}';}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 Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}
}

在dao包中创建 UserDao 接口,并且定义方法,接口将使用与实现分离,调用者只需依赖接口,无需依赖具体实现类,当需要替换实现时,只需更换实现类无需修改调用代码,降低了代码间的耦合度。

package com.qcby.dao;
import com.qcby.entity.User;
import java.util.List;public interface UserDao {
/*** 查询所有用户*/public List<User> findAll();
}

手动创建 mybatis-mapper.xml 模版文件(名字无所谓)

在resources目录下,创建mapper文件夹,编写 Mapper 映射文件用于管理sql语句,利用上面的mybatis-mapper.xml 模版文件创建UserMapper.xml文件,管理user表的sql语句。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qcby.dao.UserDao">
<!--叫名称空间,和接口绑定,该xml文件可以理解为UserDao接口的实现类,实现类来实现接口中的方法--><!--查询方法的实现 id属性是方法名,实现UserDao接口中方法的名称
parameterType 指定输入参数的类型,resultType 指定输出结果的类型-->   <select id="findAll" resultType="com.qcby.entity.User">select * from user</select>
</mapper>

在Test文件下创建测试类sqlsession会话UserTest.java:

import com.qcby.Dao.UserDao;
import com.qcby.entity.User;
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.After;
import org.junit.Before;
import org.junit.Test;import java.io.IOException;
import java.io.InputStream;
import java.util.List;public class UserTest {private InputStream in = null;private SqlSession session = null;private UserDao userDao = null;@Before  //前置通知, 在方法执行之前执行public void init() throws IOException {//加载主配置文件,目的是为了构建SqlSessionFactory对象in = Resources.getResourceAsStream("SqlMapConfig.xml");//创建SqlSessionFactory对象SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);//通过SqlSessionFactory工厂对象创建SqlSesssion对象session = factory.openSession();//通过Session创建UserDao接口代理对象userDao = session.getMapper(UserDao.class);}@After  //@After: 后置通知, 在方法执行之后执行 。public void destory() throws IOException {//释放资源session.close();in.close();}@Testpublic void findAll(){List<User> users = userDao.findAll();for (User user : users) {System.out.println(user.toString());}}
}

其中:

@Before :前置通知注解,在方法执行之前执行。首先,方法通过MyBatis提供的Resources工具类,调用getResourceAsStream方法读取类路径下名为SqlMapConfig.xml的主配置文件,将文件内容以输入流in的形式加载到内存中,这个配置文件包含了数据库连接信息、映射文件路径等关键配置;接着,创建SqlSessionFactoryBuilder构建者对象,并调用其build方法,传入前面获取的配置文件输入流,由此构建出SqlSessionFactory会话工厂对象,它是MyBatis框架的核心工厂,负责管理数据库会话的创建;然后,通过SqlSessionFactory的openSession方法创建SqlSession会话对象,SqlSession就像Java程序与数据库之间的桥梁,后续所有的数据库操作都需要通过它来完成;最后,调用SqlSession的getMapper方法,传入UserDao接口的字节码对象,MyBatis会通过动态代理技术在运行时生成UserDao接口的代理实现类对象,并将其赋值给userDao变量,这个代理对象内部已经整合了SQL执行逻辑,后续只需调用userDao的方法就能直接操作数据库

@Test :测试注解,标识这是一个可独立运行的测试用例方法内部的逻辑是:首先调用之前通过动态代理生成的userDao对象的findAll方法,这个方法会触发MyBatis执行对应的SQL查询,并将查询结果封装成User对象的集合List;接着通过增强for循环遍历这个用户集合,对集合中的每个User对象调用toString()方法,将用户的详细信息转换为字符串并打印到控制台。整个方法的作用是测试UserDao接口中findAll方法的功能是否正常,通过执行查询并输出结果,验证数据库查询操作是否能正确获取并展示所有用户数据。

@After:后置通知注解,在方法执行之后执行。方法内部主要实现了资源释放的功能:首先通过session.close()关闭SqlSession对象,SqlSession作为Java程序与数据库交互的会话桥梁,使用完毕后关闭可以释放数据库连接等资源,避免连接泄露;接着通过in.close()关闭之前打开的配置文件输入流in,输入流属于IO资源,及时关闭能释放系统文件句柄等资源,防止资源耗尽。整个方法的核心作用就是在测试方法执行完成后,清理初始化阶段创建的资源,保证资源的合理使用和系统的稳定运行

运行后findAll方法的实现结果如图:

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

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

相关文章

多路转接之epoll 【接口】【细节问题】【LT与ET模式】【Reactor】

目录 一.接口 1.1epoll_creaet 1.2epoll_ctl 1.3epoll_wait 二.细节问题 2.1 工作原理 2.2 epoll的demo 2.3 epoll的优点 三. LT 与 ET模式 理解ET 四. reactor 一.接口 1.1epoll_creaet 注意返回值是一个文件描述符 创建一个epoll模型 1.2epoll_ctl 返回值&…

渗透测试现已成为 CISO 战略的核心

随着数字供应链的扩展以及生成式人工智能在关键系统中的嵌入&#xff0c;安全领导者正在重新思考其网络安全策略。Emerald Research 最近对 225 位安全领导者进行的一项调查发现&#xff0c;68% 的人担心第三方软件和组件带来的风险。虽然大多数受访者表示他们正在满足监管要求…

音视频学习(五十三):音频重采样

概述 音频重采样&#xff08;sample rate conversion, SRC&#xff09;是把采样率从 Fs_in 变换为 Fs_out 的过程。常见场景有格式转换&#xff08;44.1→48 kHz&#xff09;、采样率匹配&#xff08;播放链路统一采样率&#xff09;、以及通信中语音采样率升降&#xff08;8 k…

【C#】正则表达式

一、核心优势&#xff1a;用一小段规则搞定大量复杂的字符串匹配&#xff0c;查找和替换&#xff0c;并且可移植可复用。使用正则表达式的好处&#xff1a;1. 强大且灵活&#xff1a;可以一次性匹配非常复杂的规则&#xff0c;比如验证邮箱、提取特定的格式日志、解析URL&#…

【[特殊字符][特殊字符] 协变与逆变:用“动物收容所”讲清楚 PHP 类型的“灵活继承”】

你有没有遇到过这样的问题&#xff1a;“为什么子类方法可以返回 Cat&#xff0c;而父类只写了返回 Animal&#xff1f;” “为什么参数反而能从 CatFood 变成更宽泛的 Food&#xff1f;”这些看似“违反直觉”的设计&#xff0c;其实背后有一个优雅的编程概念&#xff1a;协变…

cesium/resium 修改子模型材质

我是 www.v2ex.com/t/1151549 的作者&#xff0c;在csdn这边补全一些更多的信息 相关工具 主项目插件版本&#xff1a; "cesium": "^1.131.0",、"resium": "^1.19.0-beta.1"、"three": "^0.178.0"、"react…

nvm install 14.21.3 时npm 无法下载和识别

错误&#xff1a;C:\Users\H3C>nvm install 14.21.3 Downloading node.js version 14.21.3 (64-bit)... Complete Downloading npm... Creating C:\Users\H3C\AppData\Local\Temp\nvm-install-939491942\temp Downloading npm version 6.14.18... Error while downloading h…

【网络运维】Linux:LNMP 项目实践

LNMP 项目实践 简介&#xff1a;什么是 LAMP/LNMP LAMP&#xff1a;LinuxApacheMysql/MariadbPHP/Python/Perl。 LNMP&#xff1a;LinuxNginxMysql/MariadbPHP/Python/Perl。 Linux&#xff1a;操作系统&#xff0c;提供程序运行基础。Apache/Nginx&#xff1a;Web 服务器&…

用 Docker 安装并启动 MySQL:从零到实战的完整指南

用 Docker 安装并启动 MySQL&#xff1a;从零到实战的完整指南MySQL 是目前最流行的关系型数据库之一&#xff0c;广泛应用于各类应用系统中。使用 Docker 部署 MySQL 可以极大简化环境配置&#xff0c;保证开发、测试和生产环境的一致性。本文将详细介绍如何使用 Docker 安装、…

动态规划----1.爬楼梯

70. 爬楼梯 - 力扣&#xff08;LeetCode&#xff09; /** 1阶:1步,即1种; 2阶:1步1步或直接2步,即2种 f(1) 1,f(2) 2 3阶:由1阶迈2步,或2阶迈一步; 4阶:由2阶迈2步,或3阶1步; n阶:由n-2阶迈2步,或n-1阶迈1步 f(n) f(n - 1) f(n - 2) */ class Solution {/**1阶:1步,即1种…

special topic 11 (1)

preface 虽然我知道专业课必须得学&#xff0c;但是要学的东西&#xff0c;好多&#xff0c;我对专业课很害怕&#xff0c;稍微往后挪一挪&#xff0c;今天学了两个强化网课之后再学专业课吧。今天的目标是学完 11 到 14.任重道远&#xff0c;加油&#xff01;从今天开始尽量早…

MTD和FTL的关系

在嵌入式存储系统里&#xff0c;MTD&#xff08;Memory Technology Device&#xff09;和 FTL&#xff08;Flash Translation Layer&#xff09;是上下两层、互相配合的概念。你可以把它想成**“原始硬件接口”和“硬盘驱动”**的关系。1. MTD 是什么定位&#xff1a;内核里对原…

自动驾驶 HIL 测试:构建 “以假乱真” 的实时数据注入系统

01 引言在端到端自动驾驶的研发竞赛中&#xff0c;算法的迭代速度远超物理世界的测试能力。单纯依赖路测不仅成本高昂、周期漫长&#xff0c;更无法穷尽决定系统安全性的关键边缘场景&#xff08;Corner Cases&#xff09;。因此&#xff0c;硬件在环&#xff08;HIL&#xff0…

jdk升级

列出所有的jdk版本 /usr/libexec/java_home -V 永久切换版本 export JAVA_HOME(/usr/libexec/javahome−v11)exportPATH(/usr/libexec/java_home -v 11) export PATH(/usr/libexec/javah​ome−v11)exportPATHJAVA_HOME/bin:$PATH 保存后执行 source ~/.zshrc

Openlayers基础教程|从前端框架到GIS开发系列课程(24)openlayers结合canva绘制矩形绘制线

本章节讲解Canvas如何结合 Openlayer 使用&#xff0c;首先我们讲解Canvas的绘图基础。我们初始化地图的时候可以看见&#xff0c;实际上Openlayer的地图就是用Canvas实现绘制的。Canvas绘制基本概念什么是canvas&#xff1f;HTML5 <canvas> 元素用于图形的绘制&#…

深度学习——01 深度学习简介

1 什么是深度学习&#xff1f;人工智能是个大范畴&#xff0c;目标是打造智能机器和程序&#xff1b; 机器学习是实现人工智能的一种途径&#xff0c;它能让机器在不被明确编程的情况下自主学习&#xff1b;而深度学习&#xff0c;是机器学习的一个分支&#xff0c;它是基于深度…

自然语言处理( NLP)基础

一、基本概念自然语言处理也就是Natural Language Processing&#xff0c;简称NLP。NLP就是人工只能和语言学领域的一个分支&#xff0c;涉及到计算机与人类语言之间的相互作用。主要目标是让计算机能够理解、解释和生成人类语言的数据。1 自然语言处理的基本介绍NLP包括但不限…

云原生作业(nginx)

目录 1 Web 服务基础介绍 1.1 Web 服务介绍 1.1.1 Apache 经典的 Web 服务端 1.1.2 Nginx-高性能的 Web 服务端 1.1.3 用户访问体验和性能 1.1.4 服务端 I/O 流程 1.2 I/O 模型 1.2.1 I/O 模型相关概念 1.2.2 网络 I/O 模型 1.2.3 五种 IO 对比 1.2.4 I/O 的具体实现…

NY198NY203美光固态闪存NY215NY216

NY198NY203美光固态闪存NY215NY216技术架构与核心创新突破美光NY系列&#xff08;含NY198/NY203/NY215/NY216&#xff09;作为新一代企业级存储解决方案&#xff0c;其底层采用232层NAND闪存三维堆叠工艺&#xff0c;如同垂直建造数字世界的摩天大楼&#xff0c;在有限芯片面积…

後端開發技術教學(四) 數據交互延伸

書接上回&#xff1a;後端開發技術教學(三) 表單提交、數據處理-CSDN博客 必要資源&#xff1a; trae中文版下載網址: TRAE - The Real AI Engineer phpStudy 2018 : phpStudy - Windows 一键部署 PHP 开发环境 小皮出品 前言 大家好&#xff0c;我是小楓。書接上期說到的後…