【MyBatis】框架特点,ORM思想,事务管理机制

news2024/11/16 21:57:11

1. Mybatis概述:

1.1 基础知识:

  • SSM三大框架: Spring + SpringMVC + MyBatis

  • 框架其实就是对通用代码的封装, 提前写好一堆接口和类, 在做项目的时候直接引入这些常用的借口和类(引入框架), 基于这些现有的接口和类进行开发, 可以大大提高开发效率.

  • 框架一般是以jar包的形式存在的, jar包中有class文件以及各种配置文件等.

1.2 三层架构:

  • JDBC就是在数据访问层(持久层)来编写的

  • Mybatis在持久层, 属于持久层框架

1.3 JDBC的不足:

  • Mybatis可以理解为增强版的JDBC

  • Mybatis就是对JDBC的封装, 通过Mybatis来完成CRUD.

  • 不足:

  • sql语句不应该写死到java程序中, 如果想要修改增删查改的语句, 那么修改的程度就比较大.

  • 代码十分冗余

  • 给?传值非常的繁琐.

1.4 了解ORM思想:

ORM 对象关系映射, Mybatis就是一个半自动化的ORM框架, 基本上持久层的框架都是遵循ORM思想的.

这意味着, Mybatis可以使得java对象和数据库表中的一条记录相互转变

  • O(object) Java虚拟机中的java对象

  • R(relational) 关系型数据库

  • M(mapping) 映射, 将java对象映射到数据库表中的一行记录, 或者是将数据库表中的一行记录映射成java虚拟机中的一个对象.

1.5 Mybatis框架的特点:

  1. 支持定制化sql, 存储过程, 基本映射以及高级映射

  1. 避免了几乎所有的JDBC代码中手动设置参数以及获取结果集

  1. 支持XML开发, 也支持注解式开发.(大部分都是xml方式开发)

  1. 将接口和java中的pojo类映射成数据库中的记录

  1. 体积小, 需要俩个jar包, 俩个配置文件

  1. 完全做到了sql解耦合

  1. 提供了基本映射标签

  1. 提供了高级映射标签

  1. 提供了XML标签, 支持动态SQL的编写

2. Mybatis入门程序:

准备一个数据库:
- id: 主键
- car_num: 汽车编号
- brand: 品牌
- guide_price: 厂家指导价
- produce_time: 生产日期
- car_type: 汽车类型

2.1 步骤:

  • 放到resource目录下的文件, 也相当于放到了类的根目录下.

  • 在mybatis中, 负责执行sql语句的那个对象是sqlsession(会话)

  • SqlSession <- sqlsessionFactory <- SqlSessionFactoryBuilder.builder

  • 一般情况下一个数据库对应一个SqlSessionFactory对象


1. 设置打包的方式, 打成jar包

2. 引入依赖
    - Mybatis依赖
    - Mysql驱动依赖

3. 编写mybatis核心配置文件  mybatis-config.xml(不是必须这个名字, 一般放到resource中)
    - CV配置文件的信息, 并且把连接数据库的信息修改一下就行
    - 在mybatis中, 负责执行sql语句的那个对象是sqlsession
    - sqlsession是专门用来执行sql语句的, 是一个java程序和数据库之间的一次会话
    - 想要获取sqlsession对象需要先得到SqlSessionFactory对象, 通过SqlSessionFactory工厂来生产sqlsession对象, 获取SqlSessionFactory对象需要先获取SqlSessionFactoryBuilder.builer方法
    - SqlSession <- sqlsessionFactory <- SqlSessionFactoryBuilder.builder
    - 一般情况下一个数据库对应一个SqlSessionFactory对象

4. 编写XxxMapper.xml文件
    - 在这个配置文件中编写sql语句
    - <insert id="ajkbfa"> </insert> 这里的id是这条sql语句的唯一标识

5. 在mytbatis-config.xml文件中指定XxxMapper.xml文件的路径
    - <mapper resource="CarMapper.xml"/>
    - resource属性会自动从类的根路径下开始查找资源

6. 编写mybatis程序, 使用mybatis的类库, 编写mybatis程序, 连接数据库做CRUD即可

7. 从XML中构建SqlSessionFactory对象
    - 在Mybatis中一定有一个重要的对象, 这个对象是: SqlSessionFactory对象

8. mybatis中有俩个主要的配置文件
    - mybatis-config.xml, 这就是核心配置文件, 主要配置连接数据库的信息等 (只有一个)
    - XxxxMapper.xml, 这个文件是专门用来编写sql语句的配置文件 (一个表一个XxxMapper.xml)

2.2 代码:

public static void main(String[] args) {
    // 获取SqlSessionFactoryBuilder对象
    SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
    
    // 获取SqlSessionFactory对象
    InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
    // 一般情况下, 一个数据库对应一个SqlSessionFactory对象
    sqlSessionFactory sqlsessionfactory = sqlSessionFactoryBuilder.build(is);
    
    // 获取SqlSession对象
    SqlSession session = sqlsessionfactory.openSession();
    
    // 执行sql语句
    int count = session.insert("insertCar"); // 返回值是影响数据库当中的记录条数
    System.out.println(count);
    
    session.commit();        // 手动提交
    session.close();
}

2.3 注意细节:

1. mybatis中sql语句的结尾 ; 可以省略掉

2. InputStream is = Resources.getResourceAsStream(), 获取输入流.
    优点: 采用这种方式, 从类路径加载资源, 项目的移植性很高, 项目从windows移植到linux, 代码不需要修改, 因为这个资源文件一直都在类路径当中.
    这个代码底层的源代码就是 
        InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream();

3. InputStream is = new FileInputStream("d:\\mybatis-config.xml");
    缺点: 代码移植性差, 程序不够健壮, 移植到其他操作系统上导致以上路径无效, 还需要修改java代码中的路径, 这样就违背了OCP原则.

4. InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream();
    ClassLoader.getSystemClassLoader() 获取系统的类加载器
    系统类加载器有一个方法叫做: getResourceAsStream(这个方法就是从类路径当中加载资源的)

5. mybatis核心配置文件存放的路径也不一定是在类的根路径下, 可以放到其他位置, 但是为了项目的移植性,健壮性, 最好将这个配置文件放到类路径下面.

6. CarMapper.xml文件的路径是固定的吗? 不是固定的.
    <mapper resource="CarMapper.xml"/> resource属性: 这种方式是从类的根路径下查找资源

3. 事务管理机制:

  • 在mybatis-config.xml核心文件中, 可以通过以下路径的配置进行mybatis的事务管理

  • type的属性只有俩个(JDBC/MANAGED), 并且不区分大小写

3.1 JDBC事务管理器:

1. mybatis框架自己管理事务, 自己采用原生的JDBC代码去管理事务
    conn.setAutoCommit(false); -> 开启事务
    ... 业务处理 ...
    conn.commit(); -> 手动提交事务

2. 如果你没有在JDBC代码中执行conn.setAutoCommit(fasle)的话, 默认得autoCommit是true.

3. 使用JDBC事务管理器的话, 底层创建的事务管理器对象: JdbcTransaction对象.

4. 如果写的代码是SqlSession sqlsession = SqlSessionFactory.openSession(true);表示没有开启事务, 因为这种方式不会执行conn.setAutoCommit(false);

5. 在JDBC事务中, 没有执行conn.setAutoCommit(false)那么autoCommit默认就是true, 如果autoCommit是true, 表示没有开启事务, 不需要手动提交

6. SqlSession sqlsession = sqlSessionFactory.openSession(); 如果使用的事务管理器是JDBC的话, 底层实际上调用的是conn.setAutoCommit(false)

7. SqlSession.commit(); 如果使用的是事务管理器是JDBC的话, 底层实际上还是会执行conn.commit();

3.2 MANAGED事务管理器:

1. mybatis不再负责事务的管理了

2. 事务的管理交给其他的容器来负责, 例如: Spring

3. 当前我们单纯的只有mybatis的情况下, 如果配置为MANAGED, 那么事务就是没有人管理的, 没有人管理的事务表示事务根本没有开启

4. 完整版程序:

public static void main(String[] args) {
    SqlSession sqlSession = null;
    try {
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
        // 开启会话, 底层会开启事务
        // jdbc的事务管理器底层会调用 conn.setAutoCommit(false)
        SqlSession = sqlSessionFactory.openSession();
        // 执行sql, 处理业务
        int count = sqlSession.insert("insertCar");
        System.out.println(count);
        // 执行到这里没有发生异常, 提交事务, 终止事务
        sqlSession.commit();
    } catch (Exception e) {
        // 出现异常, 则回滚
        if (sqlSession != null) {
            sqlSession.rollback();
        }
        e.printStackTrace();
    } finally {
        // 关闭会话, 释放资源
        if (sqlSession != null) {
            sqlSession.close();
        }
    }
}

5. 封装成工具类:

public class SqlSessionUtil {
    private SqlSessionUtil() {}

    private static SqlSessionFactory sqlSessionFactory;

    // 类加载时执行
    // SqlSessionUtil工具类在进行第一次加载的时候, 解析mybatis-config.xml文件, 创建SqlSessionFactory对象
    static {
        try {
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static SqlSession openSession() {
        return sqlSessionFactory.openSession();
    }
}

public static void main(String[] args) {
    SqlSession sqlSession = SqlSessionUtil.openSession();
    int count = sqlSession.insert("insertCar");
    System.out.println(count);
    sqlSession.commit();
    sqlSession.close();
}

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

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

相关文章

Qt UDP

UDP是一种是一种轻量级、不可靠、面向数据报的无连接协议。当可靠性不重要时&#xff0c;可以使用它。 QUdpSocket 是 QAbstractSocket 的一个子类&#xff0c;所以拥有QAbstractSocket的各种方法&#xff0c;允许您发送和接收 UDP 数据报。 QAbstractSocket的各种函数已经在上…

【数据结构基础】树 - 前缀树(Trie Tree)

Trie&#xff0c;又称字典树、单词查找树或键树&#xff0c;是一种树形结构&#xff0c;是一种哈希树的变种。典型应用是用于统计&#xff0c;排序和保存大量的字符串&#xff08;但不仅限于字符串&#xff09;&#xff0c;所以经常被搜索引擎系统用于文本词频统计。它的优点是…

Zabbix灾难备份多种方式分享(建议收藏)

感谢本文译者田川 ! 欢迎更多资深用户翻译原厂博文&#xff08;https://blog.zabbix.com/&#xff09;&#xff01; 田川 | 宏时数据技术工程师 Zabbix 5.0中文手册官方译者 2017-2018年Zabbix中国峰会演讲嘉宾 8年监控领域实施和管理工作经验 ►在这篇博文中&#xff…

mysql关系型数据库免安装包下载以及安装教程

对于大部分技算计技术相关的初学者而言&#xff0c;mysql关系型数据库无可厚非是最适合初学者学习使用的&#xff0c;但是对于安装mysql数据库来说可能就不是特别明确&#xff0c;到底如何安装。互联网上比较多都是官网的.msi安装包&#xff0c;自带mysql客户端和一些其他关联程…

2023年“华数杯”国际大学生数学建模A题赛题发布

MCM问题一&#xff1a;雅鲁藏布江综合发展规划背景雅鲁藏布江是中国最长的高原河流&#xff0c;也是世界上最高的高原河流之一。它起源 于喜马拉雅山脉的北部山麓&#xff0c;从西向东流&#xff0c;然后转向南部&#xff0c;流向印度。中国的雅鲁 藏布江全长2057公里&#xff…

诺依集成mybatis换成mybatis-plus(完美解决)

总结分析&#xff1a;问题1&#xff1a;mybatis与mybatis-plus能否共存&#xff1f;经过将近一天的搜索发现&#xff0c;mybatis与mybatis-plus的sql工厂不通&#xff0c;mybatis是SqlSessionFactoryBean&#xff0c;而mybatis-plus是MybatisSqlSessionFactoryBean&#xff0c;…

python下载油管、B站视频的方法

这是2023年的第一篇博客。但绝不是最后一篇。 今天的博客记录篇娱乐向。 今夜想让wh听我听的歌。 利用python的you-get实现听歌自由。&#xff08;虽然有音乐会员&#xff09; FFmpeg的下载与安装。 FFmpeg的下载地址 选择对应型号的操作系统。 本次演示采用windows操作系统…

ChatGPT的调用API被提前发现了?

前言 近日&#xff0c;有消息称ChatGPT的API已经被提前发现。作为一名技术爱好者&#xff0c;我决定亲自试试看。经过几次尝试&#xff0c;我发现这确实是真的&#xff01;&#xff08;不过OpenAI确实动作很快&#xff0c;如今已经修补了大部分的模型&#xff09;。 1. 如何调…

使用 4EVERLAND 将您的 Damus 配置文件存储到 IPFS/Arweave

真正控制您的社交网络&#xff01; 挑战Twitter的去中心化社交应用Damus已登陆App Store。它是第一个使用名为Nostr的开放式去中心化社交网络协议的移动应用程序&#xff0c;该协议由 Twitter 联合创始人 Jack Dorsey 资助&#xff0c;该协议基于加密密钥对。 Damus 的出现是…

001. SQL慢查询排查(字段类型不一致)

目录一&#xff1a;背景二&#xff1a;排查过程2.1: SQL慢查询定位2.2: Python层面分析将String翻译成Int类型的原因2.3: Python进行SQL执行时间检测出现的问题三&#xff1a;总结一&#xff1a;背景 新的业务上线后&#xff0c; 合作部门发现我们引擎执行完&#xff0c; 回调…

从用户到专家-Zabbix培训【优惠】通道开启

Q&#xff1a;我从2.0开始使用Zabbix&#xff0c;还用得着参加培训&#xff1f; A&#xff1a;相信我&#xff0c;多得是你不知道的事&#xff01; Zabbix与时俱进&#xff0c;6.0新增了很多功能&#xff0c;如何快速系统掌握&#xff1f; 培训内容是Zabbix原厂设计的系统课…

自学软件测试从哪里开始?给还在迷茫的人一条出路

这两天和朋友谈到软件测试的发展&#xff0c;其实软件测试已经在不知不觉中发生了非常大的改变&#xff0c;前几年的软件测试行业还是一个风口&#xff0c;随着不断地转行人员以及毕业的大学生疯狂地涌入软件测试行业&#xff0c;目前软件测试行业“缺口”已经基本饱和。当然&a…

JVM的垃圾回收机制GC

GC回收区域GC主要针对堆区回收&#xff0c;回收是以对象为单位。方法区的类对象加载后不太需要回收&#xff1b;栈区的释放时机确定&#xff0c;不必回收&#xff1b;程序计数器是固定内存地址&#xff0c;不必回收。找出垃圾的方法引用计数法&#xff08;jvm未采取&#xff09…

SAP 编号范围及BUFFER缓冲

一 前言 编号范围对象(NUMBER RANGE)是SAP ERP 软件中的一个重要概念. 主要用来获取流水号. 在标准功能及自开发功能中大量使用.系统中的几乎所有对象的号码都是通过编号范围对象获取的. 二 编号范围对象的创建 事务代码SNRO 用于创建编号范围对象 三 编号范围对象的配置…

几个关键字(final、static、权限修饰符、super、this、instanceof)

Java知识点总结&#xff1a;想看的可以从这里进入 目录5、关键字5.1、final5.2、static5.3、 权限修饰符5.4、 super、this5.5、instanceof5、关键字 5.1、final 1、final&#xff1a;最终的。 修饰局部变量时赋值后不可改&#xff0c;修饰成员变量时必须赋初值且不可改&#x…

基于AST的babel库实现js反混淆还原基础案例荟萃

基本概念 AST简介 AST全称Abstract Syntax Tree&#xff0c;即抽象语法树&#xff0c;简称语法树&#xff08;Syntax tree&#xff09;&#xff0c;树上的每个节点都表示源代码中的一种结构。 JavaScript 领域常用的 AST 解析库有 babel、esprima、espree 和 acorn 等&#…

【2023】Prometheus-先搭出来玩玩

找两台还没回收的服务器&#xff08;虚拟机&#xff09;&#xff0c;使用centos7.*系统 一台作为监控端&#xff0c;一台作为被监控端。目录1.快速部署Prometheus服务2.快速部署被监控端加入监控端3.使用grafana作为UI展示4.导入node_exporter模板监控node节点1.快速部署Promet…

【nodejs】脚手架从零开始搭建JBD

&#x1f6ce;️脚手架编写 脚手架框架&#xff1a; bin www.js src contant.js create.js main.js package-lock.json package.json &#x1f6e0;️插件安装 devDependencies & dependencies 脚本名称脚本作用commander读取版本&#xff0c;设定选项&#xff…

混合人机协同制造系统设计与控制中的运营管理问题:一项调查

S. Ehsan Hashemi-Petroodi , Simon Thevenin , Sergey Kovalev , Alexandre Dolgui 小于翻译摘要&#xff1a;能够执行多种任务的制造系统需要不同类型的资源。使用机器人的全自动系统具有高速、准确、不知疲倦和力量&#xff0c;但它们很昂贵。另一方面&#xff0c;人类工作者…

【Redis】快速入门使用

文章目录Redis初识NosqlRedis安装依赖库上传安装包并解压启动Redis桌面客户端Redis常见命令Redis通用命令String类型String的常见命令Key结构Hash类型List类型Set类型SortedSet类型Redis的Java客户端Jedis客户端快速入门连接池SpringDataRedis客户端快速入门自定义序列化String…