一 Mybatis简介

news2024/11/25 14:47:29

一 Mybatis简介

1.1 简介

MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下, iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github。

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

mybatis – MyBatis 3 | Introduction

1.2持久层框架

  • JDBC

    • SQL 夹杂在Java代码中耦合度高,导致硬编码内伤
    • 维护不易且实际开发需求中 SQL 有变化,频繁修改的情况多见
    • 代码冗长,开发效率低
  • Hibernate 和 JPA

    • 操作简便,开发效率高
    • 程序中的长难复杂 SQL 需要绕过框架
    • 内部自动生成的 SQL,不容易做特殊优化
    • 基于全映射的全自动框架,大量字段的 POJO 进行部分映射时比较困难。
    • 反射操作太多,导致数据库性能下降
  • MyBatis

    • 轻量级,性能出色
    • SQL 和 Java 编码分开,功能边界清晰。Java代码专注业务、SQL语句专注数据
    • 开发效率稍逊于 Hibernate,但是完全能够接收

开发效率:Hibernate>Mybatis>JDBC

运行效率:JDBC>Mybatis>Hibernate

1.3 快速入门

数据库

CREATE DATABASE `mybatis-example`;

USE `mybatis-example`;

CREATE TABLE `t_emp`(
  emp_id INT AUTO_INCREMENT,
  emp_name CHAR(100),
  emp_salary DOUBLE(10,5),
  PRIMARY KEY(emp_id)
);

INSERT INTO `t_emp`(emp_name,emp_salary) VALUES("tom",200.33);
INSERT INTO `t_emp`(emp_name,emp_salary) VALUES("jerry",666.66);
INSERT INTO `t_emp`(emp_name,emp_salary) VALUES("andy",777.77);

创建maven项目设置maven,使用自己的maven

导入依赖

<dependencies>
  <!-- mybatis依赖 -->
  <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.11</version>
  </dependency>

  <!-- MySQL驱动 mybatis底层依赖jdbc驱动实现,本次不需要导入连接池,mybatis自带! -->
  <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.25</version>
  </dependency>

  <!--junit5测试-->
  <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-api</artifactId>
      <version>5.3.1</version>
  </dependency>
</dependencies>

编写实体类

package com.ls.pojo;

public class Employee {
    private  Integer empId;
    private  String empName;
    private double empSalary;

    public Integer getEmpId() {
        return empId;
    }

    public void setEmpId(Integer empId) {
        this.empId = empId;
    }

    public String getEmpName() {
        return empName;
    }

    public void setEmpName(String empName) {
        this.empName = empName;
    }

    public double getEmpSalary() {
        return empSalary;
    }

    public void setEmpSalary(double empSalary) {
        this.empSalary = empSalary;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "empId=" + empId +
                ", empName='" + empName + '\'' +
                ", empSalary=" + empSalary +
                '}';
    }
}

编写dao层接口,不过在mybatis框架中名叫mapper接口 :包package com.ls.mapper;

package com.ls.mapper;

import com.ls.pojo.Employee;

/**
 * 操作employee数据库的接口
 */
public interface EmployeeMapper {
    //根据id查询员工的信息
    Employee findById(int id);
}

以往就是在dao层包下新建imp实现类,但是现在使用mybatis框架,在resource/新建mappers文件夹。并在里面创建对应接口的xxx.xml文件。

编写接口的对应的xml文件。  约束在官网查看

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace等于mapper接口类的全限定名,这样实现对应 -->
<mapper namespace="com.ls.mapper.EmployeeMapper">

    <!-- 查询使用 select标签
            id = 方法名  绑定对应接口的方法名
            resultType = 返回值类型   方法的返回值类型
            标签内编写SQL语句          sql的参数和方法的参数一致
     -->
    <select id="findById" resultType="com.ls.pojo.Employee">
        <!-- #{empId}代表动态传入的参数,并且进行赋值!后面详细讲解 -->
        select emp_id empId,emp_name empName, emp_salary empSalary from
        t_emp where emp_id = #{empId}
    </select>
</mapper>

编写mybatis配置文件 约束在官网查看

mybatis框架配置文件: 数据库连接信息,性能配置,mapper.xml配置等!

习惯上命名为 mybatis-config.xml,这个文件名仅仅只是建议,并非强制要求。将来整合 Spring 之后,这个配置文件可以省略,所以大家操作时可以直接复制、粘贴。

<?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>

  <!-- environments表示配置Mybatis的开发环境,可以配置多个环境,在众多具体环境中,使用default属性指定实际运行时使用的环境。default属性的取值是environment标签的id属性的值。 -->
  <environments default="development">
    <!-- environment表示配置Mybatis的一个具体的环境 -->
    <environment id="development">
      <!-- Mybatis的内置的事务管理器 -->
      <transactionManager type="JDBC"/>
      <!-- 配置数据源 -->
      <dataSource type="POOLED">
        <!-- 建立数据库连接的具体信息 -->
        <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatis-example"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
      </dataSource>
    </environment>
  </environments>

  <mappers>
    <!-- Mapper注册:指定Mybatis映射文件的具体位置 -->
    <!-- mapper标签:配置一个具体的Mapper映射文件 -->
    <!-- resource属性:指定Mapper映射文件的实际存储位置,这里需要使用一个以类路径根目录为基准的相对路径 -->
    <!--    对Maven工程的目录结构来说,resources目录下的内容会直接放入类路径,所以这里我们可以以resources目录为基准 -->
    <mapper resource="mappers/EmployeeMapper.xml"/>
  </mappers>

</configuration>

测试

import com.ls.mapper.EmployeeMapper;
import com.ls.pojo.Employee;
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.jupiter.api.Test;

import java.io.IOException;
import java.io.InputStream;

public class mybatisQuickTest {

    @Test
    public  void test() throws IOException {
        // 1. 根据mybatis.xml创建SqlSessionFactory 对象
        //以输入流的方式加载mybatis配置文件
        InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
        //根据配置文件创建SqlSessionFactory
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);

        // 2 .根据SqlSessionFactory 对象开启一个会话
        SqlSession sqlSession = sessionFactory.openSession();

        //3. 根据接口的class对象获取接口类型的对象(动态代理)
        EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);

        //4.使用代理类,调用方法
        Employee employee = employeeMapper.findById(1);
        System.out.println("employee = " + employee);

        //5. 关闭Sqlsession
        sqlSession.commit(); //提交事务,查询不需要,其他操作需要
        sqlSession.close(); //关闭会话
       
        return 0;
    }
}

说明:

  • SqlSession:代表Java程序和数据库之间的会话。(HttpSession是Java程序和浏览器之间的会话)
  • SqlSessionFactory:是“生产”SqlSession的“工厂”。
  • 工厂模式:如果创建某一个对象,使用的过程基本固定,那么我们就可以把创建这个对象的相关代码封装到一个“工厂类”中,以后都使用这个工厂类来“生产”我们需要的对象。

二 ibatis简介

2.1 简介

ibatis 1.x  ibatis 2.x ——> myabtis 3.x

名字发生了改变,主要是因为用法发生了改变。mybatis 3.x 是对ibatis1.x,2.x的封装以及优化。

导入mybatis3.x的包,依然有ibatis的包,就是mybatis 3.x 是对ibatis1.x,2.x的封装以及优化。

2.2 ibatis使用

数据库

create table students(
	sid int primary key,
	sname vachar(20)
)

实体类

package com.ls.pojo;

/**
 * ibatis 使用演示实体类
 */
public class Student {
    private  Integer sid;
    private  String sname;

    public Integer getSid() {
        return sid;
    }

    public void setSid(Integer sid) {
        this.sid = sid;
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    @Override
    public String toString() {
        return "Student{" +
                "sid=" + sid +
                ", sname='" + sname + '\'' +
                '}';
    }
}

不需要mapper接口,直接写mapper.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
    ibatis方式对数据库crud
    1. 不要求写接口
    2. 直接创建mapper.xml ,编写sql
            namespace="xxx" 没有要求。仅作为后续寻找sql语句的标识

    3. 内部通过crud标签声明sql
            select update  delete insert
            id  无任何要求,仅作为后续寻找sql语句的标识
            resultType 返回结果的全限定符
            
-->
<mapper namespace="aa">
    <select id="bbb" resultType="com.ls.pojo.Student">
        select * from students where sid = #{id}
    </select>

</mapper>

配置文件

<?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>

    <!-- environments表示配置Mybatis的开发环境,可以配置多个环境,在众多具体环境中,使用default属性指定实际运行时使用的环境。default属性的取值是environment标签的id属性的值。 -->
    <environments default="development">
        <!-- environment表示配置Mybatis的一个具体的环境 -->
        <environment id="development">
            <!-- Mybatis的内置的事务管理器 -->
            <transactionManager type="JDBC"/>
            <!-- 配置数据源 -->
            <dataSource type="POOLED">
                <!-- 建立数据库连接的具体信息 -->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis-example"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <!-- Mapper注册:指定Mybatis映射文件的具体位置 -->
        <!-- mapper标签:配置一个具体的Mapper映射文件 -->
        <!-- resource属性:指定Mapper映射文件的实际存储位置,这里需要使用一个以类路径根目录为基准的相对路径 -->
        <!--    对Maven工程的目录结构来说,resources目录下的内容会直接放入类路径,所以这里我们可以以resources目录为基准 -->
    
        <mapper resource="mappers/Student.xml"/>
    </mappers>

</configuration>

测试

    @Test
    public  void test2() throws IOException {

        //1.获取配置文件并根据配置文件创建SqlSessionFactory 对象
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //2. 通过工程 打开会话
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //3. 调用sqlSession的方法对数据库操作
        // select delete update insert
        //都是两个参数,第一个参数字符串,第二个参数object
        // 第一个参数填写sql语句的位置 namespace.id,
        // 第二个参数写sql的参数,如果sql有多个参数还要封装比较麻烦(mybatis的优化)
        // 返回值是object类,需要强制转化

         Student student = sqlSession.selectOne("aa.bbb", 1);
        System.out.println("student = " + student);

        //缺点: 1.参数串一个字符串,表示sql语句的位置,容易写错
        //      2.只能传一个参数,如果有多个参数还要封装。
        //      3.返回值问题,返回的是Object类,还要强转。

        //事务
        sqlSession.commit();
        sqlSession.close();
    }

总结

ibatis不用创捷接口,而是直接创建mapper.xml文件。通过namespace和id表示sql语句的位置。

获取sqlsession后,并不向mybatis那样根据接口获得代理,在用代理的方法。而是调用sqlsesion方法如select,update,insert,delete方法对数据库操作。

对于这些方法来说都有两个参数一个是sql的位置,一个是object。当sql有多个数据的时候,还要封装成一个对象传入object.

总体来说ibatis的缺点:1. 调用sqlsession方法只能传一个参数

									2.返回值是object类还要自己强制转换。

三 mybatis原理

mybatis的底层还是ibatis。

mybatis的getMapper(接口)会使用jdk动态代理实现代理类。通过代理类,获取namespace.id即sql语句的位置和参数,将sql语句以及参数拼接调用sqlsession方法。

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

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

相关文章

JavaSE备忘录(未完)

文章目录 基本数据类型println 小知识除法( / ) 和 Infinity(无穷) 小知识除法InfinityInfinity 在除法中正负判断 求余(%) 小知识 基本数据类型 除 int、char 的包装类分别为 Integer、Character 外&#xff0c;其余基本数据类型的第一个字母大写就是它的包装类。 println 小…

微信小程序使用 Vant Weapp 中 Collapse 折叠面板 的问题!

需求&#xff1a;结合Tab 标签页 和 Collapse 折叠面板 组合成显示课本和章节内容&#xff0c;并且用户体验要好点&#xff01; 如下图展示&#xff1a; 问题&#xff1a;如何使用Collapse 折叠面板 将内容循环展示出来&#xff1f; js中的数据是这样的 代码实现&#xff1…

第二证券今日投资参考:人形机器再迎催化 钙钛矿电池产业化提速

昨日&#xff0c;沪指盘中在金融等板块的带动下强势拉升&#xff0c;一举打破3100点&#xff1b;但午后涨幅逐渐收窄。截至收盘&#xff0c;沪指微涨0.09%报3074.22点&#xff0c;深证成指跌0.05%报9376.81点&#xff0c;创业板指跌0.55%报1787.49点&#xff0c;上证50指数涨0.…

“We Need Structured Output”: 以用户为中心的大模型输出

发表机构&#xff1a;Google Research 这篇论文的核心是设计了一种系统&#xff0c;可以让开发者和用户对大型语言模型的输出施加结构性约束。系统的主要部分包括&#xff1a; 1. 用户界面&#xff08;GUI&#xff09;&#xff1a;允许用户通过图形界面来定义他们希望LLM遵守…

Meta Llama3 炸裂登场:一夜刷屏AI界,基准测试中一骑绝尘,GPT-4 Turbo遭遇强劲对手

在 2024年4月19 日&#xff0c;AI界迎来了一项重大突破&#xff1a;Meta 公司宣布推出了迄今为止最强大的新一代开源大语言模型 Llama3。这一消息无疑为我国AI产业的发展带来了新的希望和机遇。 &#x1f3af; Llama3 系列语言模型&#xff08;LLM&#xff09;包括 Llama3 8B …

深度剖析Gateway在微服务治理中的关键角色

目录 一、多层网关 二、Gateway 路由规则 2.1 路由 2.2 谓词 2.3 过滤器 三、路由声明规则 3.1 谓词 寻址谓词 请求参数谓词 时间谓词 自定义谓词 一、多层网关 首先我们先了解下一个请求是如何到达服务端并得到相应的。过程如图所示&#xff1a; 首先网址解析的第一步是 DN…

2024年分享酷我音乐如何下载mp3的方法

这里教大家用酷我音乐小程序的下载方法,小程序下载资源的方法有3种 1.利用专业的抓包工具(Fiddler/Charles)进行获取,然后分析数据包,最后直接用下载器下载分析出来的链接。强烈不推荐,因为大部分人并非程序员出身 2.录屏,录屏效率太慢,所以也不推荐 3. 利用专门的下载资源的…

第49篇:简易处理器<三>

Q&#xff1a;本期我们来设计实现以上介绍的简易处理器&#xff0c;并进行仿真。 A&#xff1a;简易处理器顶层.v文件代码&#xff0c;顶层文件中例化实现处理器的子模块3-8译码器以及寄存器。 仿真示例&#xff1a;DIN (100)8在30 ns时加载到 IR中&#xff0c;而DIN (100)8对…

基于LSTM的负荷预测

长短 期 记 忆 网 络 ( long short term memory&#xff0c; LSTM) &#xff3b;11-12&#xff3d;作为一种特殊的循环神经网络( recurrent neural network&#xff0c;&#xff32;NN) &#xff0c;主要用于解决长序列训 练过程中的梯度消失和梯度爆炸问题。典型的 LSTM 结构如…

高中数学:三角函数之考点精华-对称性相关问题

一、对称性的几种情况 1、1个对称点/对称轴 此种情况&#xff0c;用整体换元法解题 参考&#xff1a;三角函数的整体换元法 2、2个对称点 画图 如果两个对称点之间的距离是a&#xff0c;则函数周期T2a 3、2个对称轴 画图 如果两个对称轴之间的距离是a&#xff0c;则函数…

[Python开发问题] Selenium ERROR: Unable to find a matching set of capabilities

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

【计算机毕业设计】点餐平台网站——后附源码

&#x1f389;**欢迎来到琛哥的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 琛哥&#xff0c;一名来自世界500强的资深程序猿&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 琛哥在深度学习任务中展现出卓越的能力&a…

天赐和美,大麗和和典藏珍罕翡翠手镯巡礼

翡翠玉镯矜贵难得,从整块质地完美的珍贵原玉中取出,切磨过程往往会造成玉料损耗。色佳、种水细腻且无纹裂的手镯更是难得一见。质素上乘的宝石级翡翠几乎全部产自缅甸,历来珍罕稀有,备受倾慕。大麗和和怀着对翡翠的钟情与对东方气韵的热爱,臻呈「天赐和美」和和典藏缅甸翡翠手镯…

故障诊断 | 基于迁移学习和SqueezeNet 的滚动轴承故障诊断(Matlab)

目录 效果一览基本介绍程序设计参考文献 效果一览 基本介绍 将一维轴承振动信号转换为二维尺度图&#xff08;时频谱图&#xff09;&#xff0c;并使用预训练网络应用迁移学习对轴承故障进行分类。 迁移学习显著减少了传统轴承诊断方法特征提取和特征选择所花费的时间&#xff…

通过实例学C#之FileStream类

简介 可以通过此类进行文件读取。 首先在项目所在文件夹的Bin文件中新建一个test.txt文件&#xff0c;里面输入内容“hello world!”。 构造函数 FileStream (string path, FileMode mode&#xff0c;FileAccess access) 通过路径文件path&#xff0c;打开文件模式mode以及读写…

智能内容分析:Kompas.ai如何揭示内容表现的秘密

在数字营销的世界里&#xff0c;内容分析是衡量内容表现、优化策略并实现营销目标的关键。通过深入分析内容的各项指标&#xff0c;品牌能够更准确地理解其内容的市场表现&#xff0c;从而做出更加明智的营销决策。本文将深入探讨内容分析的重要性&#xff0c;详细介绍Kompas.a…

医疗信创发展走势

2023年&#xff1a;医疗信创的“元年” ----------------------医疗信创的主要任务------------------------ (一) 电脑终端方面 行政办公类电脑终端需支持信创改造&#xff0c;实现“应替尽替真替真用”的目标。 (二) 系统改造方面 1.与诊疗业务无关的信息系统 行政办公…

Navicat导入数据与导出数据

1. 导出数据 * 1. 在表格管理中找打导出向导.* 2. 选择导出格式.* 3. 勾选需要导出的表格(其他设置默认即可).* 4. 选择每张表需要导出的字段(默认即可).* 5. 附加选项(默认即可).* 6. 点击开始.* 7. 默认导出导入到桌面.2. 导入数据 * 0. 先删除原先的表格, 好演示效果. * 1…

CentOS显示mac地址错误|虚拟机克隆|CentOS静态ip

文章目录 怎么复制虚拟机&#xff1f;修改虚拟机静态ip遇到的错误解决 怎么复制虚拟机&#xff1f; 方法一&#xff1a; 方法二&#xff1a; 1.以前创建好的虚拟机所在文件夹复制一份&#xff0c;改名字 2.在虚拟机中打开 后缀为.vmx文件 3.启动虚拟机 修改虚拟机静态ip …

51单片机实验04 -数码管的动态显示实验

目录 一、实验目的 二、实验内容 三、实验原理 四、实验方法 五&#xff0c;实验效果及代码 1&#xff0c;效果 2&#xff0c;代码 六&#xff0c;课后习题 1&#xff0c;使用定时器T0的中断函数1 从999999~0计时 1&#xff09;效果 2&#xff09;代码 2&#xff0c…