完整教程:Mybatis入门
2026-01-17 10:45 tlnshuju 阅读(0) 评论(0) 收藏 举报1.创建数据库
在数据库中创建一个表,命名随意,字段随意,但是一定要给id主键且自动递增!!!

给表添加数据

2.在idea中创建maven环境
在新建项目中选择maven而不是java

3.配置坐标
打开maven项目中的pox.xml文件
在dependencies里面配置相应的mybatis依赖,mysql依赖和junit单元测试
org.mybatis
mybatis
3.5.5
com.mysql
mysql-connector-j
8.0.33
runtime
junit
junit
4.13
test
4.配置文件
4.1.从 XML 中构建 SqlSessionFactory
!!!配置文件要放在resources下面
4.1.1 mybatis-config.xml
在url中:jdbc:mysql:///mybatis?useSSL=false-->mysql是你的数据库类型;mybatis是数据库的名称。
其中mapper是用来指明sql的映射文件的
4.2 sql映射文件
UserMapper.xml
id是此SQL语句的唯一标识,com.qcby.pojo.User你要包装的类型
5.定义User类
此类用于接受数据库的数据
package com.qcby.pojo;
public class User {
private Integer id;
private String username;
private String password;
private String sex;
private String address;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
'}';
}
}
6.测试:
1.加载mybatis核心配置文件,获取SqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
2.创建SqlSession对象,用于执行sql操作
SqlSession sqlSession = sqlSessionFactory.openSession();
3.执行 sql
其中添加的内容就是sql映射文件中的命名空间加唯一标识
List users = sqlSession.selectList("test.selectAll");

4.回收资源
sqlSession.close();
完整代码:
package com.qcby;
import com.qcby.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class mybatisDemo {
public static void main(String[] args) throws IOException {
//1.创建SqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2.创建SqlSession对象,用于执行sql操作
SqlSession sqlSession = sqlSessionFactory.openSession();
//3.执行 sql
List users = sqlSession.selectList("test.selectAll");
System.out.println(users);
//4.关闭SqlSession对象
sqlSession.close();
}
}
7.优化使用Mapper代理完成第三步执行 sql
- 定义与 SQL 映射文件同名的 Mapper 接口,并且将 Mapper 接口和 SQL 映射文件放置在同一目录下
将映射文件放于接口同一文件下有两种方法:1.直接放于mapper包中(不推荐);2.在resources下创建与java中同结构的包名,!!!创建不能使用.要用/做为分割

- 设置 SQL 映射文件的 namespace 属性为 Mapper 接口全限定名

- 在 Mapper 接口中定义方法,方法名就是 SQL 映射文件中 sql 语句的 id,并保持参数类型和返回值类型一致 如果放回的是一个数据就是User,多个就用List<User>.其中User是和映射文件中类型相同

还要修改mybatis配置文件中的映射地址
优化使用包扫描
- 编码
- 通过 SqlSession 的 getMapper 方法获取 Mapper 接口的代理对象
- 调用对应方法完成 sql 的执行
//3.获取UserMapper接口的代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List users = userMapper.selectAll();
System.out.println( users);

8.总结
| 对比维度 | JDBC(原生) | MyBatis(基于 JDBC 封装) |
|---|---|---|
| 代码复杂度 | 极高:需手写加载驱动、创建连接、编写 SQL、创建 Statement/PreparedStatement、设置参数、遍历结果集、关闭资源(连接 / Statement/ResultSet),代码冗余且重复。 | 极低:无需手写连接管理、参数设置、结果集映射,仅需定义 Mapper 接口 + 编写 SQL(XML / 注解),框架自动完成底层 JDBC 操作。 |
| SQL 编写与维护 | 硬编码在 Java 代码中,SQL 与业务代码耦合,修改需改 Java 代码并重新编译,维护成本高;拼接 SQL 易出错(如字符串拼接导致语法错误 / 注入)。 | SQL 与 Java 代码解耦(XML / 注解),修改 SQL 无需改 Java 代码,维护更灵活;支持动态 SQL(if/where/foreach 等),避免手动拼接。 |
| 参数处理 | 需手动通过setInt()/setString()设置参数,参数位置与 SQL 硬绑定,易因参数顺序错误导致问题。 | 自动映射参数:支持按参数名(#{name})绑定,无需关心顺序;支持基本类型、POJO、Map、数组 / 集合等多类型参数,框架自动处理类型转换。 |
| 结果集映射 | 需手动遍历 ResultSet,通过getInt()/getString()获取字段值,并手动封装为 POJO / 实体类,代码量大且易出错。 | 半自动映射:支持resultType(简单类型 / POJO)、resultMap(复杂映射 / 关联查询),框架自动将结果集映射为 Java 对象,无需手动遍历封装;支持一对一、一对多等关联查询映射。 |
| 资源管理(连接 / 事务) | 需手动管理数据库连接:要么每次创建新连接(性能差),要么手动实现连接池(如 C3P0/Druid);事务需手动通过Connection.commit()/rollback()控制,且需保证连接一致性。 | 内置连接池适配(可集成 Druid/HikariCP),自动管理连接获取 / 释放;事务管理更便捷:支持编程式(SqlSession)、声明式(Spring 整合后 @Transactional),无需手动操作 Connection。 |
| SQL 注入风险 | 若使用 Statement(拼接 SQL)则极易引发注入;使用 PreparedStatement 可避免,但需开发者严格遵守规范,无强制约束。 | 默认使用 PreparedStatement(#{参数}),自动预编译 SQL,从框架层面规避注入风险;仅当使用 ${参数}(字符串替换)时需手动防范,安全性更高。 |
| 灵活性 | 完全灵活:可自定义所有 JDBC 细节(如特殊的 Statement 类型、自定义结果处理),适合极致定制化场景,但开发成本高。 | 兼顾灵活与规范:核心 SQL 由开发者编写(保留 SQL 灵活性),底层 JDBC 操作由框架封装;支持自定义 TypeHandler(类型处理器)处理特殊类型(如日期、枚举),满足定制化需求。 |
| 性能 | 理论性能最高:无额外封装开销,但性能依赖开发者优化(如连接池、批处理);若手动管理不当(如频繁创建连接),性能反而差。 | 略有封装开销(可忽略):框架底层仍用 JDBC,性能接近原生;内置批处理、缓存(一级缓存默认开启,二级缓存可选),优化后性能甚至优于手写 JDBC(避免开发者低级优化失误)。 |
| 调试与排错 | 调试直观:可直接断点查看 SQL、参数、结果集,但需逐行排查 JDBC 代码;排错成本高(如资源未关闭导致连接泄漏)。 | 需借助日志(如 MyBatis 日志插件)查看最终执行的 SQL 和参数;框架封装了底层,定位 JDBC 级问题需熟悉 MyBatis 原理,但日常调试(SQL / 参数)更便捷。 |
| 学习成本 | 低:仅需掌握 JDBC 核心 API(Connection/Statement/ResultSet),入门快。 | 中:需学习 MyBatis 配置(mybatis-config.xml)、Mapper 映射、动态 SQL、结果集映射等规则,入门略高于 JDBC。 |
| 扩展性与生态 | 无生态:需手动封装工具类(如 JDBCUtil)实现连接池、通用 CRUD,扩展性完全依赖开发者。 | 丰富生态:支持 Spring/Spring Boot 整合、分页插件(PageHelper)、代码生成器(MyBatis Generator)、逆向工程,可快速集成到主流开发框架。 |
| 异常处理 | 需手动捕获 SQLException,且异常信息较底层(如 SQLState),需自行解析封装。 | 框架封装了 JDBC 异常,转换为更友好的 MyBatisException,且可通过自定义异常处理器扩展,便于业务层统一处理。 |
浙公网安备 33010602011771号