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 mapper
 PUBLIC "-//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 student
	set 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 block
			e.printStackTrace();
		}

	}

	//执行对象
	public static SqlSession getSqlSession() {
		return factory.openSession();
	}

	//资源释放
	public static void closeResource(SqlSession sqlSession) {
		sqlSession.close();
	}

3. 完成增删改查功能

要与配置文件中一致

增删改 没有resulttype

只有查询有

public class StudentDaoImpl implements IStudentDao {

	@Override
	public 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;
	}

	@Override
	public 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;
	}

	@Override
	public 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;		
	}

	@Override
	public Student findStudentBySid(int sid) {
		SqlSession sqlSession = DaoUtil.getSqlSession();
		Student s = sqlSession.selectOne("danchaxuesheng", sid);
		DaoUtil.closeResource(sqlSession);
		return s;
	}

	@Override
	public 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.mfbz.cn/a/779330.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

构建滑块组件_第 2 部分

本篇我们继续学习滑块组件&#xff0c;让我们把滑块组件构建的更好&#xff1b; ● 首先&#xff0c;我们想要获取组件的三个点&#xff0c;首先在获取到他的HTML元素 const dotContainer document.querySelector(.dots);● 接着遍历 slides 数组&#xff0c;并在动态创建 元…

【MySQL】锁(黑马课程)

【MySQL】锁 0. 锁的考察点1. 概述1. 锁的分类1.1 属性分类1.2 粒度分类 2. 全局锁2.1 全局锁操作2.2.1 备份问题 3. 表级锁3.1 表锁3.2 语法3.3 表共享读锁&#xff08;读锁&#xff09;3.4 表独占写锁&#xff08;写锁&#xff09;3.5 元数据锁(meta data lock, MDL)3.6 意向…

分享实现地铁车辆侧面图

简介 通过伪类和关键帧动画实现地铁车辆侧面图 在线演示 伪元素和关键帧动画 实现代码 <!DOCTYPE html><html><head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /> <meta http-equiv"X-UA-Co…

【免费资料】IEEE33节点系统参数及拓扑图visio

主要内容 对于初学配电网的同学&#xff0c;最经典的系统即是33节点配电网系统&#xff0c;在各个研究文献中出现频次最高的也是这个系统&#xff0c;为了让大家更好了解33节点系统参数&#xff0c;本次整理了系统节点、支路参数excel以及33节点网络拓扑图visio&#xff0c…

org.springframework.jdbc.BadSqlGrammarException异常

Bug 记录 概述 在执行定时任务更新电子书统计信息时&#xff0c;遇到了 org.springframework.jdbc.BadSqlGrammarException 异常&#xff0c;具体表现为 SQL 函数 count 被错误地解析为自定义函数 wiki.count&#xff0c;导致数据库更新操作失败。 详细描述 错误信息&#x…

adb不插usb线通过wifi调试

说起做手机开发也有好多年了&#xff0c;说来惭愧&#xff0c;我最近才知道安卓手机是可以不插数据线进行开发调试的。起因是公司近期采购了一批安卓一卡通设备&#xff0c;需要对其进行定制开发APP,但是由于我插USB调试发现没有反应。通过询问厂家才知道可以通过WIFI进行调试。…

Gradient Descent

在整个maching learning的第三个步骤要找一个最好的function。在第二步是定义了一个 Loss function L&#xff0c;这个L是一个function的fuction 求完偏微分之后得到的向量就是Gradient&#xff08;黄色部分&#xff09; 随机找一个起始点0&#xff0c;它的等高线的法线方向就…

Flash存储器解析:从原理到应用,全面了解其与缓存的区别

Flash存储器解析&#xff1a;从原理到应用&#xff0c;全面了解其与缓存的区别 Flash存储器是一种非易失性存储器技术&#xff0c;广泛应用于各种电子设备中&#xff0c;如USB闪存盘、固态硬盘&#xff08;SSD&#xff09;、智能手机、数码相机和嵌入式系统。它能够在断电情况下…

Windows使用nxlog发送系统日志到Linux的rsyslog服务器

Windows使用nxlog发送系统日志到Linux的rsyslog服务器 前言一、IP地址规划及示意图二、在windows上安装及配置nxlog1.下载nxlog2.安装nxlog3.配置nxlog4.创建对应日志路径的文件夹 三、windows上启动nxlog服务四、在CentOS 7上配置日志存到指定位置文件1.编辑/etc/rsyslog.conf…

【国产开源可视化引擎Meta2d.js】钢笔

钢笔 钢笔是和其他众多绘图工具&#xff08;Photoshop、Sketch、Illustrator&#xff09;中一致的钢笔工具&#xff0c;能够很方便的在线绘制各种小图标 在线体验&#xff1a; 乐吾乐2D可视化 示例&#xff1a; // 开始绘画&#xff1a;curve。除了curve&#xff0c;还有poly…

9 张图带你理解 Kafka 中高水位 HW

大家好&#xff0c;我是君哥。 Kafka 高水位&#xff08;简称 HW&#xff09;是 Kafka 中非常重要的一个概念&#xff0c;今天来聊一聊 HW。 1 HW 简介 HW 是 Kafka 中 Offset 的一个值&#xff0c;HW 作为一个边界&#xff0c;Offset 小于 HW 的消息被称为已提交消息&#…

让ChatGPT干正事、说人话、会思考!借助ChatGPT润出优质论文的实操指南

大家好&#xff0c;感谢关注。我是七哥&#xff0c;一个在高校里不务正业&#xff0c;折腾学术科研AI实操的学术人。关于使用ChatGPT等AI学术科研的相关问题可以和作者七哥&#xff08;yida985&#xff09;交流&#xff0c;多多交流&#xff0c;相互成就&#xff0c;共同进步&a…

Qt 文件初始化配置ini/conf类型读写

学习目标&#xff1a; 文件初始化配置 前置环境 运行环境:qt creator 4.12 学习内容 INI 文件是一种常见的配置文件格式,它通常用于存储应用程序或系统的设置和参数。INI 文件的格式很简单,由以下几个部分组成: 节(Section): 节用方括号括起来,如 [General]、[Network] 等。…

基于Redis和阻塞队列的 异步秒杀业务

异步前 之前的秒杀业务的查询优惠券、查询订单、减库存、创建订单都要查询数据库&#xff0c;而且有分布式锁&#xff0c;使得整个业务耗时长&#xff0c;对此采用异步操作处理&#xff0c;异步操作类似于餐厅点餐&#xff0c;服务员负责点菜产生订单、厨师负责根据订单后厨做…

LabVIEW图像分段线性映射

介绍了如何使用LabVIEW对图像进行分段线性映射处理&#xff0c;通过对特定灰度值区间进行不同的线性映射调整&#xff0c;以优化图像的显示效果。案例中详细展示了如何配置和使用LabVIEW中的图像处理工具&#xff0c;包括设置分段区间、计算映射参数和应用映射函数等步骤。 实…

STM32智能医疗监测系统教程

目录 引言环境准备智能医疗监测系统基础代码实现&#xff1a;实现智能医疗监测系统 4.1 数据采集模块 4.2 数据处理与分析 4.3 通信系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;医疗监测与优化问题解决方案与优化收尾与总结 1. 引言 智能医疗监测系统通过STM32嵌…

Python爬取股票信息-并进行数据可视化分析,绘股票成交量柱状图

为了使用Python爬取股票信息并进行数据可视化分析&#xff0c;我们可以使用几个流行的库&#xff1a;requests 用于网络请求&#xff0c;pandas 用于数据处理&#xff0c;以及 matplotlib 或 seaborn 用于数据可视化。 步骤 1: 安装必要的库 首先&#xff0c;确保安装了以下P…

virtualbox窗口和win10窗口的切换

1、问题&#xff1a; 从windows切换到虚拟机可以用快捷键 ALTTAB&#xff0c;但是从虚拟机到windows使用 ALTTAB 无法成功切换 2、解决方法&#xff1a; 注意&#xff1a;发现设置为ctrlAlt会导致打开终端快捷键&#xff08;CtrlAltT&#xff09;失效&#xff0c;建议这里设置…

【C++】开源:地图投影和坐标转换proj库配置使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍地图投影和坐标转换proj库配置使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&a…

mars3d加载wms服务或者wmts服务注意事项

1.wms只支持4326、3857、4490的标准切片&#xff0c;其他坐标系不支持 Mars3D三维可视化平台 | 火星科技 2.wmts同理&#xff0c;Mars3D三维可视化平台 | 火星科技 3.对应级别tilematrix找到的瓦片tilerow&tilecol这两个参数使用常见报错无效参考&#xff1a; 【Mars3d】…