Mybatis1(JDBC编程和ORM模型 MyBatis简介 实现增删改查 MyBatis生命周期)

目录

一、JDBC编程和ORM模型

1. JDBC回顾

2. JDBC的弊端 

3. ORM模型

Mybatis和hibernate 区别: 

4. mybatis 解决了jdbc 的问题

二、MyBatis简介

1. MyBatis快速开始 

1.1 导入jar包

1.2 引入 mybatis-config.xml 配置文件 

1.3 引入 Mapper 映射文件 

1.3 测试

2. 实现增删改查

1. 导入jar包  配置文件等

2. 创建 MyBatisUtil 类

3. 完成增删改查功能

4. 测试类

三、MyBatis生命周期

四、总结


一、JDBC编程和ORM模型

1. JDBC回顾

  1. 加载驱动 导入JDBC 连接数据库的 jar 包,利 用 CLASS.forName 加载驱动;
  2. 获取连接 利用DriverManager 获取 Connection,然后创建 Statement;
  3. 执行SQL语句 利用 Statement 执行 SQL 语句并结 合 ResultSet 处理结果集映射 Java 对象;
  4. 关闭资源 先开后关的顺序关闭 ResultSet, Statement,Connection 等资源。

2. JDBC的弊端 

  • 硬编码:SQL语句存在Java代码中,不能很好的分离数据库语句和 Java语句,造成代码不易维护;
  • 代码重复度高 :量的重复代码,以 ResultSet 为例,每次都需要重复解析结果集;
  • 底层技术:JDBC属于底层的技术,不支持分布式,缓存等技术,对于复杂场景的应对不好;
  • SQL参数固定:SQL语句的参数固定,使得SQL语句不灵活,无法满足多变的场景。

Jdbc的本质

JDBC是SUN公司制定的一套接口(interface)
目的:解耦合——>降低程序的耦合度,提高程序的扩展力

3. ORM模型

        ORM 模型是数据库的表和简单 Java 对象(Plain Ordinary Java Object,简称 POJO就是javabean)的映射关系模型,主要解决数据库数据和 POJO 对象的相互映射。 

  • Java对象:POJO 对象(Plain Ordinary Java Object): 简单的 Java 对象,实际就是 普通 JavaBeans。
  • 映射配置配置分为:类与数据库中表 的映射;对象与表中记录的 映射;类的属性与数据库中 表的字段的映射。
  • 数据库:按照数据结构来组织、存储 和管理数据的仓库,ORM 模型中最底层的内容。

OBject Relation Mapping 对象关系映射

对象指的是面向面向对象,关系指的是数据库中的表,

例如Java语言中的POJO类与数据库模型之间的对应关系。

常见的ORM模型

  • Hibernate Hibernate 是一个 全自动 的ORM 模 型,Hibernate 可以自动生成 SQL 语 句,自动执行
  • MyBatis MyBatis 是一款 半自动 的ORM 模型,它支持定制化SQL、存储过程以及高级映射.

Mybatis和hibernate 区别: 

  • Hibernate是全自动化ORM; Mybatis是半自动化ORM。
  • Hibernate简化dao层,不用考虑SQL语句的编写和结果映射,重点放在业务逻辑上; Mybatis需要手写SQL语句以及结果映射。
  • Hibernate是一个重量级的框架,内部生成SQL语句,反射操作太多,导致性能下降; Mybatis是一个轻量级的框架,需要自己写sql语句,有较少的反射操作。
  • Hibernate 不方便做SQL优化,遇到较复杂的SQL语句需要绕过框架实现复杂, 对多字段的结构进行部分映射困难;                                                                                        Mybatis 不仅可以做SQL优化还可以SQL与Java分离,还可以自行编写映射关系, 复杂的SQL语句Mybatis效率更高

Mybatis优势: 可以进行更细致的SQL优化;容易掌握

Hibernate优势; dao层开发比mybatis简单,mybatis需要维护SQL和结果映射 hibernate数据库移植性好

4. mybatis 解决了jdbc 的问题

  • 1.数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库连接池可解决此问题。                                                                                                        解决:在SqlMapConfig.xml中配置数据连接池,使用连接池管理数据库链接。
  • 2.Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。                                                                                                                    解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
  • 3.向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。                                                                                                        解决:Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型。
  • 4.对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象 解析比较方便。                                                                              解决:Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型。

二、MyBatis简介

为什么选择MyBatis 

  • 简单易学:易于学习,易于使用,通过文档和源 代码,可以比较完全的掌握它的设计 思路和实现;
  • 灵活度高:通过定制 SQL 语句,可以比较灵活的 访问数据库,获取数据;
  • 功能完整:提供了连接管理,缓存支持,线程支 持,(分布式)事务管理等功能,还 提供了其他 ORM 模型的支持。

        MyBatis是一款ORM模型,支持定制化SQL、存储过程以及高级映射。可以使用简单的 XML 或注解来配置和映射 原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录

  • 半自动化 支持定制化SQL、存储过程以及高级映射;
  • 集成方便 不仅方便 Spring 等 JavaEE 框架的集成,还与其他 ORM 模型集成也很方便。

1. MyBatis快速开始 

1.1 导入jar包

同之前一样 

1.2 引入 mybatis-config.xml 配置文件 

该配置文件主要是连接数据库所需的配置信息 放到src下

1.3 引入 Mapper 映射文件 

配置 SQL语句和映射的配置文件放到mapper包下配置文件前面不能有空格

1.3 测试

 javabean 主要作用 传递数据  不属于任何层 

Student类

public class Student {//属性 对应 数据库中的字段 ---名字一致 类型一致//长像相似就行private int sid;private String snameString;private Date birthday;//这里日期是java.util.Date 包下private String ssex;private int classid;get/set方法省略构造方法省略
}
public class TestFirst {public static void main(String[] args) throws IOException {// 1. 加载驱动// 2. 获取连接// 3. sql语句 --执行// 处理逻辑// 解析结果集// 4. 释放资源// 1. 加载配置文件InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");// 2. 工厂来获取工厂对象SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);//		alt+shift+l// 3. 通过工厂生产产品SqlSession sqlSession = sessionFactory.openSession();// 4. 产品的功能
//		sqlSession.insert(null);
//		sqlSession.update(null);
//		sqlSession.delete(null);
//		sqlSession.selectOne(null); -- 查询一个对象
//		sqlSession.selectList(null); -- 查询多个对象// 查询所有学生信息List<Student> sList = sqlSession.selectList("chaxunxuesheng");// 测试sList.forEach(System.out::println);// 释放资源sqlSession.close();}

 测试成功:

在mybatis中 所有的id 不允许重复 不然mybatis 直接报错 就是上面的 chuangjianxuesheng

2. 实现增删改查

1. 导入jar包  配置文件等

主配置文件:

<?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><!-- 和spring整合后 environments配置将废除 --><environments default="development"><environment id="development"><!-- 使用jdbc事务管理 --><transactionManager type="JDBC" /><!-- 数据库连接池 --><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver" /><property name="url"value="jdbc:mysql://localhost:3306/myhomework03?serverTimezone=GMT" /><property name="username" value="root" /><property name="password" value="123456" /></dataSource></environment></environments><mappers><mapper resource="com/zkt/mapper/StudentMapper.xml" /></mappers>
</configuration>

StudentMapper代码:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="test">
<select id="quanchaxuesheng" resultType="com.zkt.bean.Student">select * from student
</select>
<select id="danchaxuesheng" resultType="com.zkt.bean.Student" parameterType="int">select * from student where sid = #{v}
</select>
<insert id="tianjiaxuesheng" parameterType="com.zkt.bean.Student">insert into student(sname,birthday,ssex,classid)values(#{sname},#{birthday},#{ssex},#{classid})
</insert>
<delete id="shanchuxuesheng" parameterType="int">delete from student where sid = #{v}
</delete>
<update id="xiugaixuesheng" parameterType="com.zkt.bean.Student">update studentset sname = #{sname},birthday = #{birthday},ssex = #{ssex},classid = #{classid} where sid = #{sid}
</update>
</mapper>

2. 创建 MyBatisUtil 类

用来创建 MyBatis的数据库SqlSession会话类

创建 SqlSession 类访问数据库:创建出 SqlSession后,利用 SqlSession访问数据库

public class DaoUtil {private static SqlSessionFactory factory;static {try {InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");factory = new SqlSessionFactoryBuilder().build(resourceAsStream);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//执行对象public static SqlSession getSqlSession() {return factory.openSession();}//资源释放public static void closeResource(SqlSession sqlSession) {sqlSession.close();}

3. 完成增删改查功能

要与配置文件中一致

增删改 没有resulttype

只有查询有

public class StudentDaoImpl implements IStudentDao {@Overridepublic int addStudent(Student s) {SqlSession sqlSession = DaoUtil.getSqlSession();int ret = sqlSession.insert("tianjiaxuesheng", s);// 事务 -- 增删改if (ret > 0) {sqlSession.commit();} else {sqlSession.rollback();}DaoUtil.closeResource(sqlSession);return ret;}@Overridepublic int updateStudent(Student s) {SqlSession sqlSession = DaoUtil.getSqlSession();int ret = sqlSession.update("xiugaixuesheng", s);// 事务 -- 增删改if (ret > 0) {sqlSession.commit();} else {sqlSession.rollback();}DaoUtil.closeResource(sqlSession);return ret;}@Overridepublic int deleteStudent(int sid) {SqlSession sqlSession = DaoUtil.getSqlSession();int ret = sqlSession.delete("shanchuxuesheng", sid);// 事务 -- 增删改if (ret > 0) {sqlSession.commit();} else {sqlSession.rollback();}DaoUtil.closeResource(sqlSession);return ret;		}@Overridepublic Student findStudentBySid(int sid) {SqlSession sqlSession = DaoUtil.getSqlSession();Student s = sqlSession.selectOne("danchaxuesheng", sid);DaoUtil.closeResource(sqlSession);return s;}@Overridepublic List<Student> findAllStudent() {SqlSession sqlSession = DaoUtil.getSqlSession();List<Student> sList = sqlSession.selectList("quanchaxuesheng");DaoUtil.closeResource(sqlSession);return sList;}}

4. 测试类

public class Test {public static void main(String[] args) {IStudentDao isd = new StudentDaoImpl();
//		List<Student> sList = isd.findAllStudent();
//		sList.forEach(System.out::println);//		Student s = isd.findStudentBySid(5);
//		System.out.println(s);//		Student s1 =new Student();
//		s1.setSname("刘备");
//		s1.setSsex("男");
//		s1.setBirthday(new Date());
//		s1.setClassid(2);
//		int ret =isd.addStudent(s1);
//		if (ret>0) {
//			System.out.println("添加成功");
//		}else {
//			System.out.println("添加失败");
//		}//		int ret=isd.deleteStudent(13);
//		if (ret>0) {
//			System.out.println("删除成功");
//		}else {
//			System.out.println("删除失败");
//		}Student s2 =new Student();s2.setSid(9);s2.setSname("张飞");s2.setSsex("女");s2.setBirthday(new Date());s2.setClassid(1);int ret =isd.updateStudent(s2);if (ret>0) {System.out.println("修改成功");}else {System.out.println("修改失败");}}
}

全部查询单个查询添加

删除

修改

三、MyBatis生命周期

  • SqlSessionFactoryBuilder 构造器,会根据配置信息 生成 SqlSessionFactory。 SqlSessionFactory 利用工厂模式生产 SqlSession;
  • SqlSession 既可以发送 SQL 语句去 执行并返回结果,也可以 获取 Mapper 的接口;
  • SQL Mapper 映射器,给出对应的 SQL 和映射规则,负责 发送 SQL 和处理结果;

  • 1)读取MyBatis 配置文件:mybatis-config.xml 为 MyBatis 的全局配置文件,配置了 MyBatis 的运行环境等信息,例如数据库连接信息。
  • 2)加载映射文件。映射文件即SQL 映射文件,该文件中配置了操作数据库的SQL 语句, 需要在MyBatis 配置文件mybatis-config.xml 中加载。mybatis-config.xml 文件可以 加载多个映射文件,每个文件对应数据库中的一张表。
  • 3)构造会话工厂:通过MyBatis 的环境等配置信息构建会话工厂SqlSessionFactory。
  • 4)创建会话对象:由会话工厂创建SqlSession 对象,该对象中包含了执行SQL 语句的 所有方法。
  • 5)Executor 执行器:MyBatis 底层定义了一个 Executor 接口来操作数据库,它将根据 SqlSession 传递的参数动态地生成需要执行的SQL 语句,同时负责查询缓存的维护。
  • 6)MappedStatement 对象:在 Executor 接口的执行方法中有一个 MappedStatement 类型的参数,该参数是对映射信息的封装,用于存储要映射的SQL 语句的id、参数等信息。
  • 7)输入参数映射:输入参数类型可以是Map、List 等集合类型,也可以是基本数据类型 和POJO 类型。输入参数映射过程类似于JDBC 对preparedStatement 对象设置参数 的过程。 8)输出结果映射:输出结果类型可以是Map、List 等集合类型,也可以是基本数据类 型和POJO 类型。输出结果映射过程类似于JDBC 对结果集的解析过程。

四、总结

• 什么是 ORM 

        • 对象关系映射,用于实现面向对象编程语言里不同类型系统的数据之间的转换;

• MyBatis 的优势

         • 简单易学,灵活度高,功能完整;

• MyBatis 的生命周期

        • SqlSessionFactoryBuilder,SqlSessionFactory,SqlSession,SQL Mapper;

 

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

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

相关文章

Ubuntu Server 和 Ubuntu Desktop 组合使用

1.常见的组合使用方式 Ubuntu Server 和 Ubuntu Desktop 确实可以组合使用&#xff0c;但具体要看你的需求和使用场景。以下是一些常见的组合使用方式&#xff1a; 单一设备上安装&#xff1a;你可以在一台设备上同时安装 Ubuntu Server 和 Ubuntu Desktop。这样&#xff0c;你…

【ARM系列】1of N SPI

1 of N模式 SPI 概述配置流程 概述 GIC-600AE支持1 of N模式SPI。在此模式下可以将SPI target到多个core&#xff0c;并且GIC-600AE可以选择哪些内核接收SPI。 GIC-600AE只向处于powered up 并且使能中断组的core发送SPI。 GIC-600AE会优先考虑那些被认为是active的核&#xf…

OOCL东方海外不定位置旋转验证码识别代码

样例图如下 这款验证码的识别最大难度在于&#xff0c;旋转的位置不固定&#xff0c;需要识别旋转图片的位置。 第二大难点就是旋转角度的识别。所以我们采集了大量样例图片进行训练&#xff0c;如下图所示 最终训练得到的模型需要两张图片输入&#xff0c;才能完成旋转角度识…

阿里 Mobile-Agent-v2:基于大模型的安卓鸿蒙自动化工具

与之前介绍的 DigiRL类似, Mobile-Agent-v2是一个支持安卓和鸿蒙系统的自动化工具&#xff0c;它使用视觉模型理解手机屏幕&#xff0c;并利用 ADB 来实现操作手机&#xff0c;你可以在本地运行&#xff0c;或者通过手机截图在线体验 Mobile-Agent-v2 从演示来看&#xff0c;可…

短信接口平台的核心功能有哪些?如何使用?

短信接口平台怎么有效集成&#xff1f;选择短信接口平台的技巧&#xff1f; 短信接口平台作为一种重要的通信工具&#xff0c;广泛应用于各种企业和组织。通过短信接口平台&#xff0c;企业能够高效、便捷地与客户进行互动和沟通。AoKSend将详细介绍短信接口平台的核心功能。 …

Android --- 新电脑安装Android Studio 使用 Android 内置模拟器电脑直接卡死,鼠标和键盘都操作不了

新电脑安装Android Studio 使用 Android 内置模拟器电脑直接卡死&#xff0c;鼠标和键盘都操作不了 大概原因就是,初始化默认Google的安卓模拟器占用的RAM内存是2048&#xff0c;如果电脑的性能和内存一般的话就可能卡死&#xff0c;解决方案是手动修改安卓模拟器的config文件&…

Python酷库之旅-第三方库openpyxl(20)

目录 一、 openpyxl库的由来 1、背景 2、起源 3、发展 4、特点 4-1、支持.xlsx格式 4-2、读写Excel文件 4-3、操作单元格 4-4、创建和修改工作表 4-5、样式设置 4-6、图表和公式 4-7、支持数字和日期格式 二、openpyxl库的优缺点 1、优点 1-1、支持现代Excel格式…

架构练习题目

【2022下架构真题第24题&#xff1a;红色】 24.在分布式系统中&#xff0c;中间件通常提供两种不同类型的支持&#xff0c;即&#xff08;27) A.数据支持和交互支持 B.交互支持和提供公共服务 C.数据支持和提供公共服务 D.安全支持和提供公共服务 解答&#xff1a;答案选择B。…

【知识图谱系列】(实例)python操作neo4j构建企业间的业务往来的知识图谱

本章节通过聚焦于"金额"这一核心属性&#xff0c;构建了一幅知识图谱&#xff0c;旨在揭示"销售方"与"购买方"间的商业互动网。在这张图谱中&#xff0c;绿色节点象征着购买方&#xff0c;而红色节点则代表了销售方。这两类节点间的紧密连线&…

苹果手机+AI手机概念股名单一览表

苹果智能将成为AI手机引领者&#xff0c;推动原生智能加速渗透&#xff0c;据Canlys预计2025年iOS操作系统将占据全球AI手机出货的55%。 AI手机端侧算力提升&#xff0c;将带动产业链部件升级创新 端侧算力提升或带动手机芯片及零部件升级&#xff0c;如 1&#xff09;SoC芯片&…

无人机智能追踪反制系统技术详解

随着无人机技术的飞速发展&#xff0c;无人机在各个领域的应用越来越广泛。然而&#xff0c;无人机的无序飞行和非法使用也带来了一系列安全隐患和威胁。因此&#xff0c;无人机智能追踪反制系统应运而生&#xff0c;成为维护公共安全和防止无人机滥用的重要工具。本文将详细介…

Java Lambda语法介绍

目录 一、概述 二、Lambda语法的历史 2.1 Lambda名字的含义 2.2 Lambda的历史 三、Lambda语法的核心接口 3.1 Lambda的四大核心接口 3.1.1 概述 3.1.2 Consumer 接口 3.1.3 Supplier 接口 3.1.4 Function 接口,> 3.1.5 Predicate 接口 四、Lambda的引用 4.1 概…

云海中的坚固灯塔:等保测评视角下的混合云安全策略与合规性深度剖析

在数字化浪潮的推动下&#xff0c;混合云架构以其独特的优势成为企业转型升级的得力助手。然而&#xff0c;随着数据资产向云端迁移&#xff0c;安全风险与合规挑战亦如影随形&#xff0c;成为企业前行的绊脚石。等保测评作为我国网络安全的一道坚实屏障&#xff0c;对于护航云…

Gartner发布软件供应链安全指南:软件供应链攻击造成的损失将从 2023 年的460亿美元上升到2031年的1380亿美元

软件供应链安全是一个关键的风险和合规性问题&#xff0c;但大多数组织都以分散的方式处理它。缺乏一个包罗万象的框架会遗留安全漏洞。通过实施三支柱框架&#xff0c;安全和风险管理领导者可以确保广泛的保护。 主要发现 对软件供应链的攻击给组织带来重大的安全、监管和运营…

【深度学习】pytorch训练中的一个大坑

使用的命令&#xff1a;iostat -x 5 可以看到 ssd的利用率已经满了。 之前在的数据集放在了 hdd上&#xff0c;训练结果特别慢。 所以我把它移动到了ssd上&#xff0c;然后训练参数用的 resume&#xff0c; 但是&#xff01;&#xff01;&#xff01;&#xff01;它把历史记住…

【C语言】19.预处理详解

文章目录 1.预定义符号2.#define定义常量3.#define定义宏4.带有副作用的宏参数5.宏替换的规则6.宏函数的对比7.#和##7.1 #运算符7.2 ## 运算符 8.命名约定9.#undef10.命令行定义11.条件编译12.头文件的包含12.1 头⽂件被包含的⽅式12.1.1 本地⽂件包含12.1.2 库⽂件包含 12.2 嵌…

甲骨文首次将LLMs引入数据库,集成Llama 3和Mistral,和数据库高效对话

信息时代&#xff0c;数据为王。数据库作为数据存储&管理的一种方式&#xff0c;正在以势不可挡的趋势与AI结合。 前有OpenAI 收购了数据库初创公司 Rockset&#xff0c;引发广泛关注&#xff1b;Oracle公司&#xff08;甲骨文&#xff09;作为全球最大的信息管理软件及服…

计算机硬件(考点篇)试题

波特率&#xff1a; 在电子通信领域&#xff0c;波特&#xff08;Baud&#xff09;即调制速率&#xff0c;指的是有效数据讯号调制载波的速率&#xff0c;即单位时间内载波调制状态变化的次数。波特&#xff08;Baud&#xff0c;单位符号&#xff1a;Bd&#xff09;。 波特率…

PHP景区旅游多商户版微信小程序系统源码

解锁景区新玩法&#xff01;​ 引言&#xff1a;一站式旅行新体验 厌倦了传统景区的单调游览&#xff1f;想要一次旅行就能体验多种风情&#xff1f;那么&#xff0c;“景区旅游多商户版”绝对是你的不二之选&#xff01;这个创新模式将景区内多个商户资源整合&#xff0c;为…

【MySQL备份】Percona XtraBackup增量备份实战篇

目录 1.前言 2.准备工作 2.1.环境信息 2.2.创建备份目录 2.3.配置/etc/my.cnf文件 2.4.授予root用户BACKUP_ADMIN权限 3.增量备份 3.1.第一步&#xff1a;全量备份 3.2.第二步&#xff1a;增量备份 3.3.第三步&#xff1a;再次增量备份 4.准备备份 4.1.准备全量备…