java—MyBatis框架

简介

什么是 MyBatis?
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

以上内容摘自于MyBatis中文官网:MyBatis中文官网

历史

mybatis原本是apache的一个开源项目ibatis, 2010迁移至谷歌, 改名为 Mybatis, 版本升级为3.0

特点

①Mybatis 是一款优秀的持久层框架
②Mybatis 对 jdbc 进行封装, 简化了操作
③Mybatis 使用 xml 或注解方式, 将数据库记录映射到 java 对象中,
④是一种 orm(Object Relational Mapping 对象关系映射) 实现
⑤它支持动态 SQL 以及数据缓存

搭建

        1.先在数据库创建一张表,在创建一个 maven 项目,创建一个实体类(应该于数据库中的表对应)
        2.导入 MyBatis 和 mysql 的 jar 包,创建 MyBatis 核心配置文件

其中步骤 2 为使用MyBatis框架所要用到的操作

mysql相关操作

-- 创建数据库 ssmdb
CREATE DATABASE ssmdb CHARSET utf8-- 创建表
-- 管理员表
CREATE TABLE admin(id INT PRIMARY KEY AUTO_INCREMENT,account VARCHAR(12) UNIQUE NOT NULL,`password` VARCHAR(32) NOT NULL,`name` VARCHAR(20) NOT NULL,gender CHAR(1)
)-- 添加测试用例
INSERT INTO admin (account, `password`, `name`, gender)
VALUES
('000000', '000000', 'JSON', '男'),
('000001', '000000', '张三', '男')-- 查询 admin 表中所有数据
SELECT * FROM admin

项目选择

创建Admin类

package com.flash.mybatis.model;/*** @author flash* @date 2024/06/01 14:34* 功能描述:Admin类*/
public class Admin {private int id;private String name;private String account;private String password;private char gender;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 getAccount() {return account;}public void setAccount(String account) {this.account = account;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public char getGender() {return gender;}public void setGender(char gender) {this.gender = gender;}@Overridepublic String toString() {return "Admin{" +"id=" + id +", name='" + name + '\'' +", account='" + account + '\'' +", password='" + password + '\'' +", gender=" + gender +'}';}
}

其中get, set方法不可缺, 底层会使用到

导入 MyBatis 和 mysql 的jar包

所需依赖,在 pom.xml 文件中完成配置即可

<dependencies><!-- MyBtais --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.2</version></dependency><!-- mysql --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.16</version></dependency>
</dependencies>

创建 MyBatis 核心配置文件

在resources目录中创建一个xml配置文件,如图所示

该配置文件编写内容

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><settings><!-- 打印日志,添加此设置,会在运行时打印出此次操作的日志 --><setting name="logImpl" value="STDOUT_LOGGING"/></settings><typeAliases><!-- 指定到某一个目录下,如果没有此配置,需要在配置sql管理文件时,填入完整的类地址,
如:com.flash.mybatis.model.Admin --><package name="com.flash.mybatis.model"/></typeAliases><environments default="development"><environment id="development"><!-- 事物管理方式:就是一次对数据库操作过程中, 执行多条sql的管理转账:从A账户向B账户转钱A-500代码, 异常B+500把所有的操作都成功执行后, 再提交事务, 让数据库最终执行本次提交的所有sql--><transactionManager type="JDBC"/><!-- 使用jdbc事务管理 --><!-- 数据库链接池配置频繁的创建与校徽数据库的连接对象比较浪费时间,可以在池子中默认创建若干个连接对象, 有请求使用时, 直接从连接池中取出一个对象,用完还回去但不销毁, 减少了创建和销毁的时间开销如果连接个数不够用时仍然需要创建连接对象,数据库连接池中有一个下限和一个上线,默认最多为10,最少为5个--><dataSource type="POOLED"><!-- 数据库链接 --><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://127.0.0.1:3306/ssmdb?serverTimezone=Asia/Shanghai"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><!-- 配置SQL管理文件 --><mappers><mapper resource="mappers/AdminMapper.xml"/></mappers>
</configuration>

创建与数据库交互所需的接口

package com.flash.mybatis.dao;import com.flash.mybatis.model.Admin;import java.util.List;// 定义功能
public interface AdminDao {/*根据id查询管理员对象*/Admin findAdminById(int id);List<Admin> findAdmins();int addAdmin(Admin admin);
}

创建xml文件管理sql

如图所示


该文件内容如下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.jorg//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.flash.mybatis.dao.AdminDao"><insert id="addAdmin" parameterType="Admin">INSERT INTO admin (account, `password`, `name`, gender)VALUE(#{account}, #{password}, #{name}, #{gender})</insert><!--id必须与方法名一致parameterType 接口中定义的方法所需要的参数类型resultType    查询结果返回类型#{account}    相当于调用 Admin 对象的 account 变量--><select id="findAdminById" parameterType="int" resultType="Admin">select * from admin where id = #{id}</select><select id="findAdmins" resultType="Admin">select * from admin</select>
</mapper>

测试类

package com.flash.mybatis.test;import com.flash.mybatis.dao.AdminDao;
import com.flash.mybatis.model.Admin;
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 java.io.IOException;
import java.io.Reader;
import java.util.List;/*** @author flash* @date 2024/06/01 17:35* 功能描述:测试类*/
public class Test {public static void main(String[] args) throws IOException {// 读入 mybatis 核心配置文件Reader reader = Resources.getResourceAsReader("mybatis.xml");// 创建 SqlSessionFactory 对象// sqlSessionFactory 是用来创建 sqlSession的, 由于 sqlSessionFactory 对象创建的开销较大,// 所以一个项目只创建一个 sqlSessionFactory 对象, 不用关闭SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);// 创建SqlSession对象// sqlSession 对象与数据库交互的, 每次与数据库交互, 都需要一个新的连接对象// 用完关闭即可SqlSession sqlSession = sqlSessionFactory.openSession();// 为接口创建一个代理对象// 由代理对象调用接口中对应的方法AdminDao adminDao = sqlSession.getMapper(AdminDao.class);Admin admin = adminDao.findAdminById(1);System.out.println(admin);List<Admin> admins = adminDao.findAdmins();for (Admin admin1 : admins) {System.out.println(admin1);}admin = new Admin();admin.setAccount("000002");admin.setPassword("000000");admin.setName("李四");admin.setGender('女');System.out.println("count = " + adminDao.addAdmin(admin));sqlSession.commit();// 提交数据库事物, 事物只针对 增删改, 查询不需要提交事务// 关闭与数据库的会话对象sqlSession.close();}
}

sqlSession.commit();特别说明

        如果对数据库进行查询操作,那么对数据库不会产生任何影响。如果是增删改操作,会对数据库中的数据进行一定改动。

        试想一种场景:A 给 B 转账 200 元,我们需要对数据库执行两部操作,A 中减去 200,B中增加 200,如果 两步中如有一步发生错误那么都会产生数据错误。解决方法,A 给 B 转账 200 元作为事件,java代码执行无误,将整个事件提交再来完成转账的操作,如果某一步发生错误将不会执行对应的sql语句。

        总结:由于查询操作不会对数据库数据产生影响,直接查询即可,不需要提交;如果是增删改操作,则需要将事务提交后参会执行对应的sql语句

简化测试

上面提到有些对象之需要创建一次, 那么我们就可以把他装入到一个工具类中来让我们每一次使用时直接调用即可, 但是由于要创建一个对象, 所以将他设置为静态对象, 并在static静态代码块中完成初始化, 见代码:

工具类:

package com.flash.mybatis.util;import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.Reader;/*** @author flash* @date 2024/06/01 17:32* 功能描述:*/
public class MybatisUtil {private static Reader reader;public static SqlSessionFactory sqlSessionFactory;static {// 读入 mybatis 核心配置文件try {reader = Resources.getResourceAsReader("mybatis.xml");} catch (IOException e) {e.printStackTrace();}// 创建 SqlSessionFactory 对象sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);}
}

测试类:

package com.flash.mybatis.test;import com.flash.mybatis.dao.AdminDao;
import com.flash.mybatis.model.Admin;
import com.flash.mybatis.util.MybatisUtil;
import org.apache.ibatis.session.SqlSession;import java.io.IOException;
import java.util.List;/*** @author flash* @date 2024/06/01 15:23* 功能描述:将一些重复的代码封装后使用的案例*/
public class Test2 {public static void main(String[] args) throws IOException {SqlSession sqlSession = MybatisUtil.sqlSessionFactory.openSession();// 为接口创建一个代理对象// 由代理对象调用接口中对应的方法AdminDao adminDao = sqlSession.getMapper(AdminDao.class);Admin admin = adminDao.findAdminById(1);System.out.println(admin);List<Admin> admins = adminDao.findAdmins();for (Admin admin1 : admins) {System.out.println(admin1);}admin = new Admin();admin.setAccount("000002");admin.setPassword("000000");admin.setName("李四");admin.setGender('女');adminDao.addAdmin(admin);sqlSession.commit();// 提交数据库事物, 事物只针对 增删改, 查询不需要提交事务// 关闭与数据库的会话对象sqlSession.close();}
}

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

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

相关文章

软件公司为什么必须要使用低代码系统?

在当今软件行业全国比较内卷的大环境下&#xff0c;软件公司面临着前所未有的挑战。为了在这个竞争激烈的市场中生存并脱颖而出&#xff0c;驰骋低代码设计者认为&#xff0c;软件公司必须要使用低代码系统。以下是几个关键的原因&#xff1a; 时代发展的必然选择 低代码系统是…

领导力中的说服艺术

本文主要介绍了亚里士多德修辞三角理论&#xff0c;即演讲者在说服听众时如何运用品格&#xff08;Ethos&#xff09;、情感&#xff08;Pathos&#xff09;和逻辑&#xff08;Logos&#xff09;三种基本的修辞手法。原文: The Art of Persuasion in Leadership 亚里士多德的说…

【自动驾驶技术】自动驾驶汽车AI芯片汇总——地平线篇

0. 前言 按照国际惯例&#xff0c;首先声明&#xff1a;本文只是我自己学习的理解&#xff0c;虽然参考了他人的宝贵见解及成果&#xff0c;但是内容可能存在不准确的地方。如果发现文中错误&#xff0c;希望批评指正&#xff0c;共同进步。 本篇文章是这个系列的第二篇&#x…

50个常用的Docker命令及如何使用

这里整理了50个常用的Docker命令以及每个命令的使用方法。 docker version:显示Docker版本信息。 示例:docker version docker info:显示Docker系统信息。 示例:docker info docker pull <image>:从Docker Hub下载镜像。 示例:docker pull ubuntu docker run <i…

CMake编译安装、生成可执行程序、生成静态动态库以及静态动态库的链接

1 CMake介绍 CMake是一个开源的、跨平台的构建系统&#xff0c;用于管理软件从源代码到可执行文件的整个构建过程。它最初由Kitware公司为ITK&#xff08;Insight Segmentation and Registration Toolkit&#xff09;和VTK&#xff08;Visualization Toolkit&#xff09;等开源…

在Linux kali下载、安装Perl环境

目录 Perl介绍 下载安装 官网下载 在Windows安装 在Linux和Mac OS安装 Perl介绍 Perl一种功能丰富的计算机程序语言&#xff0c;运行在超过100种计算机平台上&#xff0c;适用广泛&#xff0c;从最初是为文本处理而开发的&#xff0c;现在用于各种任务&#xff0c;包括系统…

面试官:Spring中都应用了哪些设计模式?

设计模式是我们项目中经常会涉及到的项目进行重构、解构时的一种方法。 比如我们常见的单例模式、工厂模式、策略模式、装饰器模式等都是比较常用的&#xff1b;关于 23 种设计模式&#xff0c;大家可以找本书专门去学习一下&#xff0c;在 Java 框架的源码中也不例外&#xf…

如何用python做一个用户登录界面——浔川python社

1 需解决的问题&#xff1a; 1.1如何用python做一个用户登录界面&#xff1f; 1.2需要用到哪些库、模块&#xff1f; 2 问题解决&#xff1a; 2.1 回答 1.1 &#xff1a;合理即可&#xff0c;无标准回答。 2.2 回答 1.2 &#xff1a;tk库&#xff08;缩写&#xff09;、GUL界面…

C++20实战之channel

C20实战之channel 继前面两节的直播&#xff0c;讲解了thread、jthread、stop_token、stop_source、stop_callback、cv、cv_any等的用法与底层实现&#xff0c;那么如何基于这些知识实现一个小项目呢&#xff1f; 于是引出了这篇&#xff0c;写一个channel出来。 注&#xff1a…

【AI】设计师人人必备的Ai课程,AIGC实战教学

课程介绍 专为设计师定制的AI绘画视觉课程&#xff0c;包含排版、插画、海报和动漫等。共43节课程&#xff0c;2.06G视频&#xff0c;教授AI应用技巧&#xff0c;提高设计效率和质量。内容涵盖词生图方法、AI风格设计等&#xff0c;帮助学员在设计领域取得成就。 1_01-ai课程…

jrt落地deepin

经过昨天一晚上的努力&#xff0c;把deepin和win10的双系统安装好了。同时把jrt开发需要的svn&#xff0c;jdk,idea安装好里&#xff0c;代码也checkout里。 首先安装系统碰到安装deepin后启动时候无法选择win10,在宏伟兄帮助下找到资料执行sudo update-grub解决了。 然后程…

糖果促销【百度之星】/思维

糖果促销 思维 大佬的解法&#xff1a; #include<bits/stdc.h> using namespace std; typedef long long ll; int main() {ll t;cin>>t;for(int i0;i<t;i){ll p,k;cin>>p>>k;if(k0) cout<<0<<endl;else{k-(k-1)/p;cout<<k<…

v-for中key的作用

v-for中key的作用 例如我们用v-for渲染一个列表[1, 2, 4 ,5]&#xff0c;然后在中间插入一个3变成[1,2,3,4,5]。v-for写了key和没有写key&#xff0c;Vue是怎么处理的呢&#xff1f; Vue对有key的会调用patchKeyedChildren方法&#xff1b;没有key的调用patchUnkeyedChildren方…

Vue3 -Computed计算属性

前言&#xff1a; Computed属性属于Vue3中的响应式核心(与之共同说明的还有ref&#xff0c;reactive&#xff0c;watch...) 接受一个 getter 函数&#xff0c;返回一个只读的响应式 ref 对象。该 ref 通过 .value 暴露 getter 函数的返回值。它也可以接受一个带有 get 和 set…

AI搜索,围攻百度

图片&#xff5c;电影《双子杀手》截图 ©自象限原创 作者丨程心 国内的大模型厂商落地C端&#xff0c;都盯上了AI搜索。 随着5月30号&#xff0c;腾讯宣布推出基于混元大模型的APP“腾讯元宝”&#xff0c;并基于搜狗搜索引擎&#xff0c;上线AI搜索功能。几乎当下所有…

【Qt】Qt Style Sheets (QSS) 指南:打造个性化用户界面

文章目录 前言&#xff1a;1. QSS 选择器2. 子控件选择器&#xff08;Sub-Controls&#xff09;2.1. 示例&#xff1a;给 QComboBox 给下拉按钮加上图标2.2. 示例&#xff1a;修改进度条颜色 3. 伪类选择器3.1. 代码示例: 设置按钮的伪类样式.3.2. 代码示例: 使用事件方式实现同…

数模混合芯片设计中的修调技术是什么?

一、修调目的 数模混合芯片需要修调技术主要是因为以下几个原因&#xff1a; 工艺偏差&#xff08;Process Variations&#xff09;&#xff1a; 半导体制造过程中存在不可避免的工艺偏差&#xff0c;如晶体管尺寸、阈值电压、电阻和电容值等&#xff0c;这些参数的实际值与…

【学习Day5】操作系统

✍&#x1f3fb;记录学习过程中的输出&#xff0c;坚持每天学习一点点~ ❤️希望能给大家提供帮助~欢迎点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;指点&#x1f64f; 学习编辑文章的时间不太够用&#xff0c;先放思维导图&#xff0c;后续复习完善细节。

基于jeecgboot-vue3的Flowable流程-我的任务(三)

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 这一部分主要讲我的任务里的详情&#xff0c;看流程情况 1、主要调用record/index.vue&#xff0c;调用参数如下&#xff1a; /*** 详情*/function handleDetail(record: Recordable) {c…

构建一个文字冒险游戏:Python 编程实战

在本文中&#xff0c;我们将探索如何使用 Python 创建一个简单的文字冒险游戏。通过这个项目&#xff0c;你将了解到基础的编程技术&#xff0c;包括条件语句、函数和基本的用户输入处理&#xff0c;同时也能体会到文本游戏的魅力和设计的挑战。 项目概述 文字冒险游戏是一种…