目录
一、ORM框架
我们先来了解以下什么时ORM,下图就是一个很直观的展示了ORM之间的关系。
ORM框架就是对JDBC进行封装的持久层框架,在实体类对象(POJO对象)与SQL之间通过配置映射文件建立映射关系,将SQL所需的参数及返回的结果字段映射到相应的实体类中。
二、MyBatis与Hibernate
MyBatis的官方文档:MyBatis中文网
MyBatis和Hiberbate都是非常流行的ORM框架,前者对JDBC提供了较为完整的封装,后者主要是对实体类对象与SQL之间的映射关系。
1、 概念与设计理念
MyBatis:作为半自动化的持久化框架,MyBatis 需要开发者手动编写 SQL 语句,对 SQL 有很强的控制能力,更适合对 SQL 性能有较高要求、数据库表结构复杂多变的项目。
Hibernate:属于全自动化的持久化框架,通过对象关系映射(ORM)技术,开发者无需编写 SQL,只需操作对象即可完成数据库操作,能提高开发效率,适用于快速开发和数据库表结构相对稳定的项目。
2、SQL 控制
MyBatis:支持开发者编写自定义的 SQL 语句,因此可以对 SQL 进行精细优化,能够处理复杂的查询和业务逻辑。
Hibernate:自动生成 SQL 语句,虽然方便快捷,但对于复杂的查询,自动生成的 SQL 可能不够优化,而且难以进行深度的定制。
3、学习成本
MyBatis:由于需要手动编写 SQL,开发者需要具备一定的 SQL 基础和数据库知识,学习成本相对较高。
Hibernate:无需编写 SQL,只需掌握 ORM 的基本概念和框架的使用方法,学习成本相对较低。
4、开发效率
MyBatis:手动编写 SQL 会增加开发时间和工作量,尤其是在处理大量的增删改查操作时,但对于复杂业务逻辑,能更灵活地满足需求。
Hibernate:自动生成 SQL,减少了开发工作量,提高了开发效率,尤其适合快速迭代的项目
三、MyBatisAPI
1、SqlSessionFactoryBuilder
此 API 用于构建SqlSessionFactory
实例。它能从不同来源(如 XML 配置文件、Java 代码)读取配置信息,进而创建SqlSessionFactory
。通常在应用启动时使用一次,创建出的SqlSessionFactory
会被复用。
2、SqlSessionFactory
这是 MyBatis 的核心对象之一,是线程安全的。其作用是创建SqlSession
实例,在整个应用中一般只需一个SqlSessionFactory
实例。
3、SqlSession
代表与数据库的一次会话,是非线程安全的,要在一次请求中使用并及时关闭。它提供了执行 SQL 语句、管理事务等功能,包含selectOne
、selectList
、insert
、update
、delete
、commit
、rollback
等常用方法。
注:在使用SqlSession的方法insert()/delete()/update()时,必须使用事务提交方法commit()。
四、MyBatis配置
实例项目结构
mybatis-demo
├── src
│ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │ └── example
│ │ │ ├── entity
│ │ │ │ └── User.java
│ │ │ ├── mapper
│ │ │ │ └── UserMapper.java
│ │ │ ├── util
│ │ │ │ └── MyBatisUtil.java
│ │ │ └── Main.java
│ │ └── resources
│ │ ├── db.properties
│ │ ├── mybatis-config.xml
│ │ └── com
│ │ └── example
│ │ └── mapper
│ │ └── UserMapper.xml
└── pom.xml
1、核心依赖与日志依赖
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>mybatis-project</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <!-- MyBatis 核心依赖 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> <!-- MySQL 数据库驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency> <!-- SLF4J 和 Logback 日志依赖 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.2</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> </project>
2、建立.XML映射文件
UserMapper.xml
<?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="com.example.mapper.UserMapper"> <!-- 根据 ID 查询用户 --> <select id="getUserById" parameterType="int" resultType="com.example.entity.User"> SELECT * FROM users WHERE id = #{id} </select> <!-- 查询所有用户 --> <select id="getAllUsers" resultType="com.example.entity.User"> SELECT * FROM users </select> <!-- 插入用户 --> <insert id="insertUser" parameterType="com.example.entity.User"> INSERT INTO users (name, age) VALUES (#{name}, #{age}) </insert> <!-- 更新用户 --> <update id="updateUser" parameterType="com.example.entity.User"> UPDATE users SET name = #{name}, age = #{age} WHERE id = #{id} </update> <!-- 删除用户 --> <delete id="deleteUser" parameterType="int"> DELETE FROM users WHERE id = #{id} </delete> </mapper>
3、建立映射接口文件
UserMapper.java
package com.example; import java.util.List; // 此接口对应 XML 映射文件中的 SQL 操作 public interface UserMapper { /** * 查询所有用户 * @return 用户列表 */ List<User> getAllUsers(); /** * 根据 ID 查询用户 * @param id 用户 ID * @return 用户对象 */ User getUserById(int id); /** * 插入用户 * @param user 用户对象 */ void insertUser(User user); /** * 更新用户信息 * @param user 用户对象 */ void updateUser(User user); /** * 根据 ID 删除用户 * @param id 用户 ID */ void deleteUser(int id); }
4、数据源特性文件
db.properties
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/DBname?characterEncoding=UTF-8 jdbc.username=root // 根据数据库实际用户名更改 jdbc.password=123456 // 根据数据库实际密码更改
可能这里和书上不一样,这里加了jdbc.*但书上没有,这个具体呢要看你的properties中怎么读取的,如果如下图一样就要加
那什么时候不要加呢,如下图
5、框架配置文件
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> <!-- 引入数据源特性文件 --> <properties resource="db.properties"/> <!-- 环境配置 --> <environments default="development"> <environment id="development"> <!-- 事务管理器类型 --> <transactionManager type="JDBC"/> <!-- 数据源类型 --> <dataSource type="POOLED"> <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> <!-- 映射器配置 --> <mappers> <!-- 引入映射文件 --> <mapper resource="UserMapper.xml"/> </mappers> </configuration>
6、封装MyBatisUtil
MyBatisUtil.java
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; public class MyBatisUtil { // 定义静态的 SqlSessionFactory 对象 private static SqlSessionFactory sqlSessionFactory; // 静态代码块,在类加载时执行,用于初始化 SqlSessionFactory static { try { // 加载 MyBatis 配置文件 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); // 创建 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } /** * 获取 SqlSession 对象 * @return SqlSession 对象 */ public static SqlSession getSqlSession() { // 从 SqlSessionFactory 中获取 SqlSession 对象 return sqlSessionFactory.openSession(); } public static void closeSqlSession(SqlSession session){ if(session!=null) { session.close(); } } }