mybatis总结

本文深入解析MyBatis框架,对比Hibernate,阐述其优势与不足,包括SQL优化、ORM映射、缓存机制等,适合初学者快速入门。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介 :
MyBatis 是比较优秀的持久层框架(DAO),支持SQL,存储过程以及高级映射
如 JDBC中 我们需要有繁琐的流程,和设置参数,并且获取结果集的时候也需要循环遍历,并且手动封装到实体类对象中
MyBatis避免了几乎所有的 JDBC代码和手动设置参数以及获取结果集
MyBatis可以使用简单XML或注解来配置和映射 接口和java的实体类

MyBatis 有两种用法
1 XML形式
2 注解
注解 : 方便,灵活,看上去也比较好看,但是需要代码和SQL在一起
如果 SQL比较复杂的话,注解就很吃力
XML : 把SQL语句存放到XML文件中,java代码会比较简洁干净,并且使用XML形式,写一些复杂的SQL的时候,比较方便,也能统一管理

所以一般情况,常用的是XML,可以做到SQL分离.有时候也混用,简单的就用注解,复杂的就用XML

与同样作为持久化层框架的Hibernate之间,最常见的问题,就是

MyBatis与Hibernate的区别

整体分析 :
MyBatis 不是一个完全ORM框架,什么是ORM?
ORM : Object Relational Mapping 对象关联映射
而Hibernate就是ORM框架
ORM就是将java中的类对象和数据库表关联映射起来
Hibernate : 相对MyBatis来说,Hibernate更加复杂沉重,它有QBC/QBE,SQL,HQL三种查询方式,也就意味着在SQL语句优化时会有一定困难
而学习MyBatis成本低于Hibernate很多,我们只需要掌握原生的SQL就可以,比较灵活,因为控制器在我们手里掌握,上手比较快
但是 在数据移植时,会比较麻烦,如将MySQL移植到oracle,那么sql会发生相应的变化
而hibernate不同,配置文件中可以指定数据库,会根据指定数据库自动生成对应的SQL语句

抽象区别 :
1 hibernate是全自动,而mybatis属于半自动
前者可以完全通过对象关系模型对数据库进行操作,拥有完整的JavaBean对象与数据库映射的结构来自动生成SQL
后者 仅有基本的字段映射,对象数据以及对象实际关系,仍然需要手动SQL完成管理
2 hibernate拥有完整的日子系统,mybatis欠缺一些
3 SQL直接优化上,mybatis要比hibernate方便很多
因为语句是自己写的,hibernate是自动生成

MyBatis :
1 入门快,即学即用,提供了数据库查询的自动对象绑定
2 可以进行更细致的SQL优化,可以,减少字段操作
3 缺点框架有些简陋,功能尚有缺失
4 二级缓存机制不是很好
小巧,方便,高效,简单,直接(SQL),半自动

Hibernate :
1 功能强大,数据库绑定性能比较好,对象关系(O/R)映射能力强
2 有更好的二级缓存机制,可以使用第三方缓存
3 缺点学习门槛高,要精通的门槛也高

6.使用场景
操作持久化层(Dao),和JDBC一样,操作数据库的
当我们要写动态页面(jsp)和用户进行交互的时候,就需要操作数据库,
而MyBatis就是负责操作数据库的

创建一个MyBatis项目,了解用法

我们以 用户和 地址 为例,比如淘宝,一个账号可以添加多个收货地址
所以 他们的关系应该是一对多,用户是1,地址是多

环境搭建
MyBatis开发环境
1 导包 mybatis-3.3.0.jar
2 数据库包 mysql-connector-java-5.1.38-bin.jar
3 配置文件 mybatis-config.xml

User.java
在这里插入图片描述

Address.java
在这里插入图片描述

添加MyBatis的配置文件 mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>

Jdbc配置文件
在这里插入图片描述

Init.sql 因为要操作数据库,所以需要有示例数据

drop database IF exists test;
create database test;
use test;
create table t_user (
id int(11) primary key auto_increment,
username varchar(100),
password varchar(100),
nickname varchar(100),
type int(2)
);

create table t_address (
id int(11) primary key auto_increment,
addr varchar(100),
phone varchar(100),
postcode varchar(100),
user_id int (11),
constraint foreign key(user_id) references t_user(id)
);
insert into t_user (username , password , nickname , type) value (‘admin’,‘123’,‘帅气多汁社会你张老师’,1);
insert into t_address (addr , phone , postcode , user_id) value (‘石家庄’,‘123’,‘111’,1);

然后创建对应的User.xml

<?xml version="1.0" encoding="UTF-8" ?>
<insert id="add" parameterType="User">
<!-- #{username} 等于是用 ? 的方式进行的设置,
	等方法调用的时候,会传递一个 参数,就会自动映射到对象的username属性,设置?的值-->
		insert into t_user(username,password,nickname,type) 
			values(#{username},#{password},#{nickname},#{type});
</insert>

写完SQL语句之后,测试是否成功,如何使用
创建test,并创建类TestMyBatisDao.java
并导入Junit包
在这里插入图片描述
在这里插入图片描述

测试结果
在这里插入图片描述

功能没问题了,但是控制台什么都没有打印,没有一个日志记录
在这里插入图片描述
比如说,我想看一下执行的SQL,
这时候 就需要 log4j
1 导包 log4j-1.2.17.jar
2 log4j.properties 配置文件
再运行测试
在这里插入图片描述
Sql语句和 参数值 都会显示

基本环节测试没问题之后,测试一下mapper的三种形式
先创建IUserDao.java接口
在这里插入图片描述
一般我们的User.xml中,不会写对应的实体类的名字
1 首先 User.xml 应该和dao的方法功能对应
2 既然和DAO对应,方法也应该对象,dao的方法名,和 xml中的id的值
3 如果两者都是对应的话,可以用另外一种调用方式

更改User.xml
在这里插入图片描述

然后去弄测试,查看怎么调用使用
在这里插入图片描述
在这里插入图片描述
数据也会被插入到数据库中,但是容易拼错,字符串太长,所以我们可以用getName()代替

在这里插入图片描述
在这里插入图片描述
这样就不容易拼错了
在这里插入图片描述
在这里插入图片描述
依旧没问题
看另外一种调用方式
在这里插入图片描述
在这里插入图片描述
依然没有问题
这个时候,调用的add()方法 其实是IUserDao中声明的add()方法
但是 实际执行的,是User.xml中的 id为add的方法
想要这样使用,id的值 必须和IUserDao中的方法的名字一致才行

测试另外一种方式,注解

首先 mybatis-config.xml 配置文件中的xml映射 需要更改 , 因为注解形式不需要xml文件
但是 需要告诉mybatis 你的注解加在哪个类上面
在这里插入图片描述

然后去IUserDao中加入对应的注解
在这里插入图片描述
然后运行测试
在这里插入图片描述
依然没有问题

7.总结
MyBatis环境搭建流程
1 导包,因为需要操作数据库,所以数据库包也需要有
在这里插入图片描述

2 默认执行的时候,控制台没有任何日志记录操作,所以我们需要导入对应的日志包
在这里插入图片描述

3 日志对应的配置文件
log4j.properties

4 MyBatis的配置文件
mybatis-config.xml

5 如果不想把数据库配置,直接写死在mybatis-config.xml 配置文件中,就需要手动指定一个配置文件
创建jdbc.properties文件
在这里插入图片描述

手动指定
在这里插入图片描述

注意 :
在这里插入图片描述
这里的名字 需要和 jdbc.properties文件 的属性名字一致

6 编写每个dao对应的xml文件
User.xml

7 调用 6 步
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值