武汉市建设局网站英文seo
目录
一、ORM框架
二、MyBatis与Hibernate
1、 概念与设计理念
2、SQL 控制
3、学习成本
4、开发效率
三、MyBatisAPI
1、SqlSessionFactoryBuilder
2、SqlSessionFactory
3、SqlSession
四、MyBatis配置
1、核心依赖与日志依赖
2、建立.XML映射文件
3、建立映射接口文件
4、数据源特性文件
5、框架配置文件
6、封装MyBatisUtil
一、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 mapperPUBLIC "-//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 configurationPUBLIC "-//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;// 静态代码块,在类加载时执行,用于初始化 SqlSessionFactorystatic {try {// 加载 MyBatis 配置文件String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);// 创建 SqlSessionFactorysqlSessionFactory = 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();}} }