Java持久层框架:MyBatis介绍

MyBatis

  • 概述

在这里插入图片描述

概述

MyBatis,是支持定制化 SQL 、存储过程和高级映射的优秀持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object ,普通的 Java 对象)映射成数据库中的记录。

MyBatis 特点

  • 简单易学:没有任何第三方依赖。易于学习和使用
  • 灵活:MyBatis 不会对应用程序或数据库的现有设计强加任何影响。 SQL 写在 xml 里,便于统一管理和优化
  • 解除 SQL 与程序代码的耦合:通过提供 DAO 层,将业务逻辑和数据访问逻辑分离,使系统设计更清晰,也更易维护和单元测试。同时提高了可维护性
  • 提供映射标签,支持对象与数据库的 ORM 字段关系映射
  • 提供对象关系映射标签,支持对象关系组建维护
  • 提供 xml 标签,支持编写动态 SQL

MyBatis 功能架构

  • API 接口层:提供给外部使用的接口 API ,开发者通过这些本地 API 来操作数据库。接口层接收到调用请求便会调用数据处理层来完成具体的数据处理
  • 数据处理层:负责具体的 SQL 查找、SQL 解析、SQL 执行和执行结果映射处理等。主要目的是根据调用的请求完成一次数据库操作
  • 基础支撑层:负责最基础的功能支撑(连接管理、事务管理、配置加载和缓存处理),这些都是共用的,将其抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑

简单示例:
首先,创建一个 Maven 的 Java 项目
在这里插入图片描述

接着,在 pom.xml 配置文件中添加以下配置

<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/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>MyBatisDemo</groupId><artifactId>MyBatisDemo</artifactId><packaging>jar</packaging><version>1.0-SNAPSHOT</version><name>MyBatisDemo</name><url>http://maven.apache.org</url><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>compile</scope></dependency><!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.6</version></dependency><!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.25</version></dependency></dependencies><!-- 错误:Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.io.IOException: Could not find resource cn/edu/MyBatisDemo/model/UserMapper.xml --><!-- 解决方案:--><!--   UserMapper.xml 配置文件写在 src 找不到问题解决方案     --><build><resources><resource><!-- directory:指定资源文件的位置 --><directory>src/main/java</directory><includes><!-- “**”:表示任意级目录    “*”:表示任意任意文件 --><!-- mvn resources:resources :对资源做出处理,先于 compile 阶段  --><include>**/*.properties</include><include>**/*.xml</include></includes><!--  filtering:开启过滤,用指定的参数替换 directory 下的文件中的参数(eg. ${name}) --><filtering>false</filtering></resource><resource><directory>src/main/resources</directory></resource></resources></build>
</project>

然后,创建一个数据表 user
在这里插入图片描述
在这里插入图片描述

并在 model 目录下创建与数据表 user 一一映射的实体类 User

package cn.edu.MyBatisDemo.model;import java.util.Date;public class User {private int id;private String name;private String password;private Date date; //注册日期private int state; //用户状态public User() {super();}public User(int id, String name, String password, Date date, int state) {this.id = id;this.name = name;this.password = password;this.date = date;this.state = state;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public Date getDate() {return date;}public void setDate(Date date) {this.date = date;}public int getState() {return state;}public void setState(int state) {this.state = state;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", password='" + password + '\'' +", date=" + date +", state=" + state +'}';}
}

再在 mapper 目录下创建一个接口 UserMapper ,声明获取指定用户信息的方法

package cn.edu.MyBatisDemo.mapper;import cn.edu.MyBatisDemo.model.User;//不需要写实现类,配置 UserMapper.xml 配置文件即可
public interface UserMapper {public User selectUserById(int id); // 获取指定用户的信息
}

在此不需要写实现类,在 model 目录下创建 UserMapper.xml 配置文件配置即可

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd"><!-- namespace 必须为接口的全类名 -->
<mapper namespace="cn.edu.MyBatisDemo.mapper.UserMapper"><!-- id 必须为接口对应的方法名 --><select id="selectUserById" resultType="cn.edu.MyBatisDemo.model.User">SELECT `id`,`name`,`password`,`date`,`state` FROM `user` WHERE id=#{id}</select>
</mapper>

随之,在 resources 目录下创建 mybatis.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"><!-- mybatis 全局配置文件 -->
<configuration><!-- 数据库连接配置 --><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatisdemo?useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false&amp;serverTimezone=UTC"/><property name="username" value="root"/><property name="password" value="0123"/></dataSource></environment></environments><!-- POJO对象与数据表的映射配置 --><mappers><mapper resource="cn/edu/MyBatisDemo/model/UserMapper.xml" /></mappers>
</configuration>

最后,在 test 目录下创建测试类 MyBatisTest ,测试结果

package cn.edu.MyBatisDemo.test;import cn.edu.MyBatisDemo.mapper.UserMapper;
import cn.edu.MyBatisDemo.model.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.Test;import java.io.IOException;
import java.io.InputStream;public class MyBatisTest {@Testpublic void test() throws IOException {//1.根据配置文件创建数据库连接会话的工厂类InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");//获取工厂类SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//2.通过工厂类获取数据库连接的会话SqlSession sqlSession = sqlSessionFactory.openSession();//3.通过 sqlSession 操作数据库try {UserMapper userMapper = sqlSession.getMapper(UserMapper.class);User user = userMapper.selectUserById(20230815);System.out.println(user);} finally {sqlSession.close();}}
}

结果如图:
在这里插入图片描述

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

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

相关文章

巡检管理系统哪一款简单实用?如何解决传统巡检难题,实现高效监管?

在电力、燃气、水务等公共服务领域&#xff0c;线路巡检工作是保障公众安全、避免事故发生的重要环节。然而&#xff0c;传统的巡检方式存在一些显著的问题&#xff0c;可能会对公共安全和稳定运行产生不利的影响。为了解决这些问题&#xff0c;需要一种能够实现高效、精准的线…

【Godot】【BUG】4.x NavigationAgent 导航不生效

4.2.beta2 试了半天才发现原来默认只对第一个有导航的 TileMap 的第 1 层 生效&#xff0c;而我设置的导航层不是第一层&#xff0c;然后我新建了一个 TileMap 将导航的瓦片设置到这个 TileMap 上了&#xff0c;如图 这样就解决了问题&#xff0c;不用再修改默认设置的东西了&a…

Qt QDialog模式对话框传递数据给主窗口(主窗口->子窗口)

Qt工作笔记-QDialog模式对话框传递数据给主窗口_qt dialog-CSDN博客话不多说&#xff0c;上图&#xff1a;这里同样是采用了Qt的信号与槽机制。项目文件分布如下&#xff1a;代码如下&#xff1a;dialog.h#ifndef DIALOG_H#define DIALOG_H#include <QDialog>namespace U…

react 中获取多个input输入框中的值的 俩种写法

目录 1. 使用受控组件 2. 使用非受控组件 1. 使用受控组件 这是React中最常见的方法&#xff0c;每个输入框都与React组件的state相关联&#xff0c;并通过onChange事件来更新state。 代码示例&#xff1a; import React, { Component } from react;class MultipleInputExam…

1 如何入门TensorFlow

近年来人工智能的火爆吸引了很多人&#xff0c;网上相关的热门课程报名的人很多&#xff0c;但是坚持下去的人却少。那些晦涩的原理没有一定知识的积累很难能理解。 如果你对人工智能感兴趣&#xff0c;且想利用人工智能去实现某项功能&#xff0c;而不是对人工智能本身感兴趣&…

SpringBoot+微信小程序实现的酒店预订小程序系统 附带详细运行指导视频

文章目录 一、项目介绍二、项目介绍三、运行截图四、主要代码 一、项目介绍 项目演示地址&#xff1a;视频地址 二、项目介绍 项目描述&#xff1a;这是一个基于SpringBoot微信小程序框架开发的酒店预订小程序系统。首先&#xff0c;这是一个前后端分离的项目&#xff0c;代…

【Linux】进程概念(上)

进程概念 一、冯诺依曼体系二、操作系统三、进程1. 基本概念2. 描述进程 - PCB3. 组织进程4. 查看进程&#xff08;1&#xff09;通过系统调用接口查看&#xff08;2&#xff09;通过 /proc 系统文件夹查看 5. 通过系统调用创建进程 - fork&#xff08;1&#xff09;初识 fork&…

Muse 2获取实时脑电数据

Muse 2获取实时脑电数据 之前转载了一篇知乎大佬汇总的采集Muse数据的博客&#xff0c;从亚马逊中国刷到了一个Muse 2&#xff0c;看了下不到2000块&#xff0c;于是果断下单。。。 历时一个月终于到了。。。 试用 需外网才能获取冥想音频资源&#xff0c;然后才能采集数据…

Linux 指令学习

Linux 指令学习 以此为记录&#xff0c;也方便自己日后查看回顾&#xff01; Linux命令基础格式 无论是什么命令&#xff0c;用于什么用途&#xff0c;在Linux中&#xff0c;命令有其通用的格式&#xff1a; command&#xff1a; 命令本身 options&#xff1a;[可选&#xf…

c++_learning-c++标准库STL和boost库

c的标准库 STL标准库&#xff1a;#include<iostream>&#xff1a;#include<iomanip>&#xff1a;#include<cstdlib>&#xff1a;#include<cmath>&#xff1a;#include<tuple>&#xff1a;利用可变参数模板&#xff0c;借助“递归继承”或“递归组…

Spring Boot + EasyUI 创建第一个项目(一)

创建一个Spring Boot和EasyUI相结合的项目。 一、构建一个Spring Boot项目 Spring Boot之创建一个Spring Boot项目&#xff08;一&#xff09;-CSDN博客 二、配置Thymeleaf Spring Boot Thymeleaf&#xff08;十一&#xff09;_thymeleaf 设置字体_人……杰的博客-CSDN博客…

论文阅读[51]通过深度学习快速识别荧光组分

【论文基本信息】 标题&#xff1a;Fast identification of fluorescent components in three-dimensional excitation-emission matrix fluorescence spectra via deep learning 标题译名&#xff1a;通过深度学习快速识别 三维激发-发射矩阵荧光光谱中的荧光组分 期刊与年份&…

数据结构: 红黑树

目录 1.红黑树概念 2.红黑树性质 3.调整 1.如果p和u都是红色&#xff0c;将其都改为黑色即可,然后向上调整 2.如果p红&#xff08;u黑/u不在&#xff09;&#xff0c;这时候左子树两红&#xff0c;于是给右子树一个红&#xff08;旋转变色&#xff09; 2.1右单旋 变色- …

栈和队列的C++模拟实现

一、栈stack 1.介绍&#xff08;库里面的文档介绍&#xff09; 1. stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行元素的插入与提取操作。 2. stack是作为容器适配器被实现的&#xff0c;容器适配器即是对…

有效管理token,充分发挥ChatGPT的能力

目录 给提供了 Token 的计算工具,来理解一下Token的计算方式,网址如下: 窗口如下: 实际消耗 Token 数量为 59个,换算之后为2.1-2.2的比例,即一个汉字消耗2.12.2个Token, 再测一下英文的Token消耗,包含空格在内,一共52个英文字母,消耗Token 13个,正好对应13个单词,…

vue3入门级笔记

一.vue3的优势 二.使用create-create-vue搭建vue3项目 三.项目目录和关键文件 四.组合式API 1&#xff0c;setup的写法和执行时机 执行时机比beforeCreate还要早 setup函数中&#xff0c;获取不到this(this 是undefined) 数据 和 函数 &#xff0c;需要在 setup 最后 return&a…

策略模式在社会中的应用

文章目录 &#x1f31f; 如何将设计模式策略模式运用到社会当中&#x1f34a; 什么是策略模式&#x1f34a; 策略模式在社会中的应用&#x1f389; 1. 政治选举&#x1f389; 2. 商业竞争&#x1f389; 3. 教育培训 &#x1f34a; 策略模式的优缺点&#x1f389; 优点&#x1f…

类加载的过程总结以及双亲委派模型[JVM]

类加载过程 类一共有七个生命周期:加载->验证->准备->解析->初始化->使用->卸载 加载&#xff08;加载字节码文件&#xff0c;生成.class对象&#xff09; 加载是类加载的第一个阶段。 加载阶段的任务是在类文件从磁盘加载到内存中&#xff0c;通常是从cl…

【LCR 170. 交易逆序对的总数】

目录 一、题目描述二、算法原理三、代码实现3.1升序&#xff1a;3.2降序&#xff1a; 一、题目描述 二、算法原理 三、代码实现 3.1升序&#xff1a; class Solution { public:int mergeSort(vector<int>& nums, int left, int right){if (left > right){retur…

mysql varchar int

年龄是数字类型int SELECT * FROM test ORDER BY age; 年龄是字符类型varchar SELECT * FROM test ORDER BY code; 第1种 补前导0可以和数字一样排序 MySQL会比较字符的ASCII值&#xff0c;并根据这些值来确定字符的排列顺序。 印象中oracle好像也是吧。 ASCII (American …