对象关系映射(ORM) 是连接面向对象编程与关系型数据库的桥梁,它实现了:
以用户表为例:
id | username | password | age |
---|---|---|---|
1 | zhangsan | 123456 | 25 |
2 | lisi | abcdef | 30 |
对应的Java实体类:
public class User {
private Integer id;
private String username;
private String password;
private Integer age;
// Getter/Setter省略
}
作为半自动化ORM框架,MyBatis提供:
对比全自动化框架(如Hibernate):
- 优势:灵活控制SQL,适合复杂查询和性能优化
- 劣势:需要手动编写SQL和映射配置
<dependencies>
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
<version>3.5.4version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>8.0.33version>
dependency>
dependencies>
DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
dataSource>
environment>
environments>
<mappers>
<mapper resource="com/test/mapper/UserMapper.xml"/>
<mapper resource="com/test/repository/UserRepository.xml"/>
mappers>
configuration>
关键配置说明:
environments
:配置数据库环境dataSource type="POOLED"
:使用连接池提升性能serverTimezone=UTC
:解决MySQL 8.x时区问题
DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.test.mapper.UserMapper">
<select id="get" parameterType="Integer"
resultType="com.test.entity.User">
SELECT * FROM user WHERE id = #{id}
select>
mapper>
public class NativeApiDemo {
public static void main(String[] args) throws IOException {
// 1. 加载配置文件
InputStream is = Resources.getResourceAsStream("config.xml");
// 2. 创建SqlSessionFactory
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
// 3. 获取SqlSession
try (SqlSession session = factory.openSession()) {
// 4. 执行原生接口查询
String statement = "com.test.mapper.UserMapper.get";
User user = session.selectOne(statement, 1);
System.out.println("查询结果: " + user);
}
}
}
public interface UserRepository {
int insert(User user);
int deleteById(Integer id);
int update(User user);
User selectById(Integer id);
}
DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.test.repository.UserRepository">
<insert id="insert" parameterType="com.test.entity.User">
INSERT INTO user(username, password, age)
VALUES(#{username}, #{password}, #{age})
insert>
<delete id="deleteById" parameterType="Integer">
DELETE FROM user WHERE id = #{id}
delete>
<update id="update" parameterType="com.test.entity.User">
UPDATE user SET
username = #{username},
password = #{password},
age = #{age}
WHERE id = #{id}
update>
<select id="selectById" parameterType="Integer"
resultType="com.test.entity.User">
SELECT * FROM user WHERE id = #{id}
select>
mapper>
public class MapperProxyDemo {
public static void main(String[] args) throws IOException {
// 1. 初始化SqlSessionFactory
InputStream is = Resources.getResourceAsStream("config.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
// 2. 获取SqlSession
try (SqlSession session = factory.openSession()) {
// 3. 获取Mapper代理对象
UserRepository repository = session.getMapper(UserRepository.class);
// 4. CRUD操作示例
// 新增用户
User newUser = new User(null, "wangwu", "888888", 28);
repository.insert(newUser);
// 查询用户
User user = repository.selectById(1);
System.out.println("查询结果: " + user);
// 提交事务(非查询操作需要)
session.commit();
}
}
}
在pom.xml中添加资源过滤配置:
<build>
<resources>
<resource>
<directory>src/main/resourcesdirectory>
<includes>
<include>**/*.xmlinclude>
includes>
resource>
<resource>
<directory>src/main/javadirectory>
<includes>
<include>**/*.xmlinclude>
includes>
resource>
resources>
build>
com.mysql.cj.jdbc.Driver
jdbc:mysql://localhost:3306/dbname?useSSL=false&serverTimezone=UTC
session.commit()
场景 | 推荐模式 |
---|---|
快速原型开发 | 原生接口模式 |
简单CRUD操作 | Mapper代理模式 |
复杂多表关联查询 | Mapper代理+注解SQL |
需要高度定制SQL | 原生接口模式 |
批量操作:使用SqlSession
的批量执行方法
try (SqlSession session = factory.openSession(ExecutorType.BATCH)) {
UserRepository mapper = session.getMapper(UserRepository.class);
for (User user : userList) {
mapper.insert(user);
}
session.commit();
}
二级缓存:在Mapper XML中启用缓存
<mapper namespace="...">
<cache eviction="LRU" flushInterval="60000" size="512"/>
mapper>
延迟加载:配置关联对象的延迟加载
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
settings>
特性 | MyBatis | Hibernate | MyBatis-Plus |
---|---|---|---|
SQL控制 | 手动编写 | 自动生成 | 手动/自动可选 |
学习曲线 | 平缓 | 陡峭 | 中等 |
灵活性 | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐ |
开发速度 | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
复杂查询支持 | 优秀 | 良好 | 优秀 |
数据库移植性 | 较差 | 优秀 | 较差 |
选择建议:
- 需要精细控制SQL:选择MyBatis
- 快速开发标准CRUD:选择MyBatis-Plus
- 数据库无关性要求高:选择Hibernate
MyBatis作为当下主流的ORM框架,平衡了灵活性和开发效率,特别适合需要精细控制SQL、优化数据库性能的项目场景。通过掌握其两种开发模式,开发者能够根据项目需求灵活选择最佳实现方案。