java-Mybatis框架

news2024/9/25 15:25:35

简介

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

以上内容摘自于Mybatis中国官网

特点

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

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.ffyc.mybatispro.modle;

public class Admin {
    private int id;
    private String gender;
    private  String  password;
    private  String admin;


    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getAdmin() {
        return admin;
    }

    public void setAdmin(String admin) {
        this.admin = admin;
    }

    @Override
    public String toString() {
        return "Admin{" +
                "id=" + id +
                ", gender='" + gender + '\'' +
                ", password='" + password + '\'' +
                ", admin='" + admin + '\'' +
                '}';
    }
}

其中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>

测试类

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);
    }
}

测试类

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.coloradmin.cn/o/2073691.html

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

相关文章

DFS 算法:全排列问题

我的个人主页 {\large \mathsf{{\color{Red} 我的个人主页} } } 我的个人主页 往 {\color{Red} {\Huge 往} } 往 期 {\color{Green} {\Huge 期} } 期 文 {\color{Blue} {\Huge 文} } 文 章 {\color{Orange} {\Huge 章}} 章 DFS 算法&#xff1a;记忆化搜索 此系列更新频繁&…

k8s中service对象

文章目录 一、Service简介Service和kube-proxy的作用与区别Service的工作过程kube-proxy的工作过程总结 二、具体实践ClusterIPClusterIP 基本概念应用场景 NodePortNodePort 简介应用场景 ExternalName简介应用场景 一、Service 简介 Kubernetes (k8s) 中的 Service 对象是一…

使用redis设计延迟队列

目录 延迟队列概念与重要性 定义&#xff1a;延迟队列的基本概念 重要性&#xff1a;延迟队列在处理异步任务中的关键作用 图表&#xff1a;延迟队列的工作流程图 ​编辑延迟队列设计案例 背景介绍 设计目标 系统架构 设计要点 现有物理拓扑 图表&#xff1a;有赞延迟…

GStreamer 简明教程(五):Pad 相关概念介绍,Pad Capabilities/Templates

系列文章目录 GStreamer 简明教程&#xff08;一&#xff09;&#xff1a;环境搭建&#xff0c;运行 Basic Tutorial 1 Hello world! GStreamer 简明教程&#xff08;二&#xff09;&#xff1a;基本概念介绍&#xff0c;Element 和 Pipeline GStreamer 简明教程&#xff08;三…

自修C++Primer----3.2标准库类型string

目录 1.String的相关操作 1.1拷贝初始化&&直接初始化 1.2显示创建临时对象 1.3读取string对象内容 1.4一次读取多个未知对象 1.5使用getline读取一整行内容 1.6size()的返回值size_type类型 1.7两个string对象比较 1.8string对象赋值 1.9两个string对象相加 1…

策略产品 ①算法逻辑

目录 一、机器学习与AI的关系 二、机器学习全流程 1. 问题定义 2. 数据处理 3. 特征工程 4. 模型训练 5. 模型评估 6. 模型应用 机器学习是AI的关键技术之一&#xff0c;是指机器从历史数据中学习规律&#xff0c;从而提升系统某个性能度量的过程。这篇文章&#xff0c;我们在作…

C Primer Plus第十四章编程练习,仅供参考

第十四章编程练习 第一个问题让我们改写复习题5&#xff0c;创建一个函数去计算一年到某个月份的天数&#xff0c;在一个结构数组中去存储相关数据。完整程序代码以及运行结果如下&#xff1a; #include<stdio.h> #include<string.h> #include<ctype.h> st…

当外接硬盘接入到macOS上,只读不可写时,应当格式化

当windows磁盘格式例如 NTFS 的硬盘接入到macOS上时&#xff0c;会发现无法新建文件夹&#xff0c;无法删除、重命名。原因是磁盘格式对不上macOS&#xff0c;需要进行格式化。格式化时请注意备份重要数据。具体做法如下&#xff0c;在macOS中找到磁盘工具&#xff0c;然后对磁…

【HTML】常用几种模拟动画效果【附源代码】

1. 模拟音频波纹加载效果 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthde…

计算机视觉编程

目录 灰色度 缩略图 拷贝粘贴区域 调整图像尺寸 旋转图像45 画图线、描点 灰色度 灰度是指图像中每个像素的亮度值&#xff0c;用来描述图像中各个像素的明暗程度。在计算机视觉中&#xff0c;灰度可以通过以下方式来计算&#xff1a; 1. 平均值法&#xff1a;将图像中每…

如何在程序中创建出多条线程

多线程是编程中的一个重要概念&#xff0c;它允许程序同时执行多个任务&#xff0c;每个任务可以看作是一个线程。在Java中&#xff0c;多线程尤为常见且强大&#xff0c;它通过允许程序在并发环境下运行&#xff0c;提高了程序的执行效率和响应速度。以下是对Java多线程的详细…

数学建模~~~预测方法--决策树模型

目录 0.直击重点 1.决策树概念 2.节点特征的选择算法 3.基尼系数的计算 4.决策树的分类 5.模型的搭建 6.模型的改进和评价 ROC曲线 参数调优 &#xfeff;GridSearch网格搜索 使用搜索结果重新建模 0.直击重点 这个文章&#xff0c;我们从三个维度进行说明介绍&#…

如何使用Python快速修改文件的标签(如何将歌词嵌入到音乐文件中,含歌词嵌入接口源码)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 Python与Music 📒📝 1. 初探音乐文件的标签📝 使用Python修改标签📝 将歌词嵌入音乐文件⚓️ 相关链接 ⚓️📖 介绍 📖 你是否曾经听过一首好听的歌曲,却发现它的标签信息(元数据信息)杂乱无章?甚至找不到歌词?…

【Remi Pi开发板镜像烧录】使用sd卡进行瑞米派镜像的烧录

烧录大典 按照《软件开发指南》4.2.1和4.2.2的顺序进行&#xff0c;具体烧录哪个镜像结合你自己的需求&#xff0c;每个镜像的区别参考以下链接 https://mbb.eet-china.com/forum/topic/143906_1_1.html Tera term界面全屏如下设置看着比较舒服 设置完之后setup->save-&g…

智能优化特征选择|基于鹦鹉优化(2024年新出优化算法)的特征选择(分类器选用的是KNN)研究Matlab程序 【优化算法可以替换成其他优化方法】

智能优化特征选择|基于鹦鹉优化&#xff08;2024年新出优化算法&#xff09;的特征选择&#xff08;分类器选用的是KNN&#xff09;研究Matlab程序 【优化算法可以替换成其他优化方法】 文章目录 一、PO基本原理PO基本原理基本流程示例应用 二、实验结果三、核心代码四、代码获…

npm pack使用

npm pack 的作用主要是从包中创建一个压缩文件&#xff08;tarball&#xff09;&#xff0c;通常具有.tgz扩展名&#xff0c;包含了打包的模块及其依赖&#xff0c;可用于分发或部署。其应用场景包括私有库或组件的分发、离线环境的依赖安装、CI/CD 自动化构建等。 在使用npm管…

UE管理内容 —— FBX Material Pipeline

目录 Material Support Multiple Materials Material Naming Material Ordering Texture Import FBX管道将应用于网格体&#xff08;静态网格体和骨架网格体&#xff09;的材质和纹理&#xff0c;从3D应用程序传输到虚幻&#xff1b; 要转换简单材质&#xff0c;可以导入源…

Gameplay Ability System(通过GameplayEffect里的Execution修改角色属性)

一、关于GameplayEffectExecutionCalculation类 1、查看GameplayEffectExecutionCalculation类的Execute函数 这个函数将编辑器里设置的参数传进来&#xff0c;然后通过计算再返回出去&#xff0c;这个函数被标记为BlueprintNativeEvent&#xff0c;所以我们可以在自己的类Pla…

python怎么去除换行符

在Python的编写过程中&#xff0c;获取到的字符串进场存在不明原因的换行和空格&#xff0c;如何整合成一个单句&#xff0c;成为问题。 方法&#xff1a; 一、去除空格 “ ”代表的为空格 "xyz".strip() # returns "xyz" "xyz".ls…

ES6 class小挑战

// 编码挑战 #2 /* 重新创建挑战 1&#xff0c;但这次使用 ES6 类&#xff1b; a. 添加一个名为 “speedUS ”的获取器&#xff0c;返回当前速度&#xff08;单位&#xff1a;mi/h&#xff09;&#xff08;除以 1.6&#xff09;&#xff1b; 3. a. 添加一个名为 “speedUS ”…