1、概述
- 什么是mybatis?
MyBatis是一个基于Java的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis消除了几乎所有的JDBC代码和参数的手动设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plain Ordinary Java Objects,普通的Java对象)映射成数据库中的记录。
它是一款半自动的ORM持久层框架,具有较高的SQL灵活性,支持高级映射(一对一,一对多),动态SQL,延迟加载和缓存等特性,但它的数据库无关性较低
-
什么是ORM?
Object Relation Mapping,对象关系映射。对象指的是Java对象,关系指的是数据库中的关系模型,对象关系映射,指的就是在Java对象和数据库的关系模型之间建立一种对应关系,比如用一个Java的Student类,去对应数据库中的一张student表,类中的属性和表中的列一一对应。Student类就对应student表,一个Student对象就对应student表中的一行数据
-
为什么mybatis是半自动的ORM框架?
用mybatis进行开发,需要手动编写SQL语句。而全自动的ORM框架,如hibernate,则不需要编写SQL语句。用hibernate开发,只需要定义好ORM映射关系,就可以直接进行CRUD操作了。由于mybatis需要手写SQL语句,所以它有较高的灵活性,可以根据需要,自由地对SQL进行定制,也因为要手写SQL,当要切换数据库时,SQL语句可能就要重写,因为不同的数据库有不同的方言(Dialect),所以mybatis的数据库无关性低。虽然mybatis需要手写SQL,但相比JDBC,它提供了输入映射和输出映射,可以很方便地进行SQL参数设置,以及结果集封装。并且还提供了关联查询和动态SQL等功能,极大地提升了开发的效率。并且它的学习成本也比hibernate低很多
2、MyBatis的优缺点
-
优点
-
代码量减少:与JDBC相比,MyBatis能够显著减少代码量,减少了50%以上的代码量。
-
简单易学:MyBatis是最简单的持久化框架之一,小巧并且简单易学,适合初学者快速上手。
-
灵活性高:不会对应用程序或者数据库的现有设计强加任何影响,SQL写在XML里,从程序代码中彻底分离,降低耦合度,便于统一管理和优化,可重用。
-
动态SQL:提供XML标签,支持编写动态SQL语句(如if、else等),增强了SQL的灵活性和可读性。
-
映射标签:提供映射标签,支持对象与数据库的ORM字段关系映射,可以在XML中配置映射关系,也可以使用注解配置映射关系。
-
兼容性好:由于MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持,具有良好的兼容性。
-
性能较高:MyBatis使用JDBC提供的原生SQL接口,没有封装过多的抽象层,运行效率相对较高。
-
易于调试:提供了日志输出功能,可以详细记录SQL执行情况,便于开发者进行调试。
-
集成方便:能够与Spring等主流框架很好地集成,提高了开发效率。
-
-
缺点
-
SQL维护复杂:需要手动编写SQL语句,如果SQL语句写得不好,就会导致可读性差、难以维护。
-
编程量较大:虽然MyBatis提供了很多插件和辅助工具,但是需要编写大量的XML文件,会导致编程量增大,不利于快速开发。
-
集成困难:如果需要整合多个数据源,就需要编写较多的配置文件,集成起来比较麻烦。
-
调试难度增加:与JDBC相比,增加了调试代码和查错的难度,因为使用了ORM需要额外花费时间学习ORM的框架,调试错误比JDBC难很多。
-
单步调试限制:JDBC可以单步调试,但MyBatis不能单步调试,需要通过日志输出日志信息帮助调试。
-
数据库移植性差:SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
-
学习成本较高:需要开发人员掌握XML文件编写和SQL语句的构建等技术,学习成本较高
-
3、快速入门
3.1 添加依赖
在pom.xml里面添加依赖
<!-- MyBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.11</version>
</dependency>
<!-- MySQL Connector/J -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.32</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
3.2 配置数据源
- 在
resouces文件创建数据源jdbc.properties文件
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://IP:端口/数据库名?serverTimezone=Asia/Shanghai&useSSL=true&useUnicode=true&characterEncoding=utf-8
jdbc.username=账号
jdbc.password=密码
- 在
resouces文件下创建xml文件mybatis-config.xml
<?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>
<!-- 引入了外部的属性文件jdbc.properties -->
<properties resource="jdbc.properties"/>
<!-- 定义环境集合,并指定了默认的环境为development -->
<environments default="development">
<!-- 定义了名为 development 的具体环境配置 -->
<environment id="development">
<!-- 指定了事务管理器类型为JDBC -->
<transactionManager type="JDBC"/>
<!-- 指定了数据源类型为POOLED -->
<dataSource type="POOLED">
<!-- 驱动名、URL、用户名和密码,使用 ${jdbc.driver} 等从 jdbc.properties 文件获取值 -->
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 定义了一组映射器(Mapper),用于将SQL语句与Java对象进行映射。 -->
<mappers>
<!-- 映射器文件UserMapper.xml -->
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
3.3 数据准备
- 创建数据库表,与实体类对应,创建
user表

- 在
com.example.mybatis.model包下面创建User类
@Data
public class User {
private int id;
private String username;
private String password;
}
3.4 创建映射文件UserMapper.xml
-
创建映射接口,在
com.example.mybatis.dao下创建UserMapper接口需根据命名空间创建对应接口
<?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">
<!-- namespace 命名空间 -->
<mapper namespace="com.example.mybatis.dao.UserMapper">
<!-- 根据 id 查询用户 -->
<select id="selectById" resultMap="UserResultMap">
SELECT * FROM user WHERE id = #{
id}
</select>
<!-- 插入用户 -->
<insert id="insert" keyProperty="id" useGeneratedKeys="true">
INSERT INTO user (use

最低0.47元/天 解锁文章
15万+

被折叠的 条评论
为什么被折叠?



