MyBatis简介
MyBatis 是一个优秀的 Java 持久层框架,它可以帮助开发者将 Java 对象映射到数据库表,并执行 SQL 语句来操作数据库。以下从基础概念、核心组件、使用步骤及代码示例等方面详细介绍:
一、基础概念
MyBatis 允许开发者使用 XML 或注解来配置和映射原生信息,将 Java 接口和 POJO(Plain Old Java Objects,普通 Java 对象)映射成数据库中的记录。它的主要优势在于灵活的 SQL 编写、良好的封装性以及对多种数据库的支持。
优点
- 代码简洁:开发者只需编写 Mapper 接口和对应的 SQL 语句(通过 XML 或注解),无需编写具体的 SQL 执行和结果映射代码,MyBatis 会自动处理这些细节。
- 可读性和维护性好:Mapper 接口中的方法名通常与业务逻辑相关,使得代码的意图更加清晰,后续维护和扩展也更加方便。
- 类型安全:由于 Mapper 接口是强类型的,在编译时就能发现方法调用的错误,提高了代码的稳定性。
二、核心组件
- SqlSessionFactory:是 MyBatis 的核心,用于创建 SqlSession。它通过读取配置文件(如
mybatis - config.xml
)获取数据库连接等信息来构建。 - SqlSession:提供了执行 SQL 语句、提交事务、回滚事务等方法。通过它可以获取 Mapper 接口的代理对象,从而执行数据库操作。
- Mapper 接口:定义了数据库操作的抽象方法,MyBatis 通过动态代理生成其实现类,将方法调用转化为 SQL 执行。
三、使用步骤及代码示例
以下以操作 MySQL 数据库为例,假设数据库中有一张tb_user
表,包含id
、username
、password
、gender
、addr
字段。
1. 引入依赖
如果使用 Maven 项目,在pom.xml
中添加 MyBatis 和 MySQL 驱动依赖:
<dependencies>
<!-- MyBatis核心依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<!-- MySQL驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql - connector - java</artifactId>
<version>8.0.15</version>
</dependency>
</dependencies>
2. 创建 POJO 类
public class User {
private Integer id;
private String username;
private String password;
private String gender;
private String addr;
// 省略getter和setter方法
}
3. 配置 MyBatis 核心文件(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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!--数据库连接信息-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mybatis?useSSL=false&serverTimezone=Asia/Shanghai"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--加载SQL映射文件-->
<!--方式一-->
<mapper resource="com/itheima/Mapper/UserMapper.xml"/>
<!--方式二-->
<!--Mapper代理方式:包扫描-->
<!-- <package name="com.itheima.Mapper"/>-->
</mappers>
</configuration>
4. 创建 Mapper 接口
package com.itheima.mapper;
import com.itheima.pojo.User;
import java.util.List;
public interface UserMapper {
List<User> selectAll();
}
5. 创建 Mapper 映射文件(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.itheima.Mapper.UserMapper">
<select id="selectAll" resultType="com.itheima.pojo.User">
select * from tb_user;
</select>
</mapper>
6. 编写测试代码
package com.itheima;
import com.itheima.Mapper.UserMapper;
import com.itheima.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;
/**
Mybatis 快速入门代码
*/
public class MyBatisDemo2 {
public static void main (String [] args) throws IOException {
//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.1 执行 sql
// List<User> users = sqlSession.selectList("com.itheima.Mapper.UserMapper.selectAll");
//3.2 获取 UserMapper 接口的代理对象
UserMapper userMapper = sqlSession.getMapper (UserMapper.class);
List<User> users = userMapper.selectAll();
System.out.println(users);
//4. 释放资源
sqlSession.close ();
}
}
上述代码展示了 MyBatis 的基本使用流程,从配置环境、定义 Mapper 接口和映射文件,到最终执行数据库查询操作并输出结果。通过这种方式,MyBatis 实现了 Java 对象与数据库的交互,使数据库操作更加简洁和高效。
Mapper代理开发
MyBatis 的 Mapper 代理开发是一种方便快捷的数据库操作方式,它通过接口和 XML 配置文件(或注解)的结合,让开发者可以像调用普通 Java 方法一样执行数据库操作,而无需编写大量的样板代码。以下是对 Mapper 代理开发的详细介绍:
特点和优势
- 简化开发:避免了传统 JDBC 开发中大量重复的数据库连接、SQL 执行、结果集处理等代码,使数据访问层的代码更加简洁、清晰。
- 解耦性好:Mapper 接口与实现分离,业务逻辑层只需要依赖 Mapper 接口,具体的数据库操作实现可以在不影响业务逻辑的情况下进行替换或修改。
- 提高可维护性:将 SQL 语句集中管理在 XML 配置文件(或注解)中,便于统一修改和维护。
实现步骤
- 定义 Mapper 接口:在 Java 代码中定义一个接口,接口中的方法对应着要执行的数据库操作。例如:
import java.util.List;
import com.itheima.pojo.User;
public interface UserMapper {
List<User> selectAll();
User selectById(int id);
void insert(User user);
void update(User user);
void delete(int id);
}
- 编写 Mapper XML 配置文件:创建一个与 Mapper 接口同名的 XML 文件,在其中定义 SQL 语句和参数映射等信息。例如:
<?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.itheima.mapper.UserMapper">
<select id="selectAll" resultMap="UserResultMap">
SELECT * FROM users
</select>
<select id="selectById" resultMap="UserResultMap">
SELECT * FROM users WHERE id = #{id}
</select>
<insert id="insert" keyProperty="id" useGeneratedKeys="true">
INSERT INTO users (username, password, age) VALUES (#{username}, #{password}, #{age})
</insert>
<update id="update">
UPDATE users SET username = #{username}, password = #{password}, age = #{age} WHERE id = #{id}
</update>
<delete id="delete">
DELETE FROM users WHERE id = #{id}
</delete>
<resultMap id="UserResultMap" type="com.itheima.pojo.User">
<id property="id" column="id" />
<result property="username" column="username" />
<result property="password" column="password" />
<result property="age" column="age" />
</resultMap>
</mapper>
- 在 MyBatis 配置文件中注册 Mapper:在 MyBatis 的核心配置文件(通常是 mybatis-config.xml)中,通过
<mappers>
标签注册 Mapper XML 文件或 Mapper 接口。例如:
<mappers>
<mapper resource="com/itheima/mapper/UserMapper.xml" />
<!-- 或者使用以下方式注册Mapper接口 -->
<!-- <package name="com.itheima.mapper" /> -->
</mappers>
- 使用 Mapper 代理:在业务逻辑层中,通过 MyBatis 的
SqlSession
获取 Mapper 接口的代理对象,然后调用接口中的方法来执行数据库操作。例如:
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import com.itheima.mapper.UserMapper;
import com.itheima.pojo.User;
import com.itheima.utils.MyBatisUtils;
public class UserServiceImpl {
public List<User> getAllUsers() {
try (SqlSession sqlSession = MyBatisUtils.getSqlSession()) {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
return userMapper.selectAll();
}
}
public User getUserById(int id) {
try (SqlSession sqlSession = MyBatisUtils.getSqlSession()) {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
return userMapper.selectById(id);
}
}
public void addUser(User user) {
try (SqlSession sqlSession = MyBatisUtils.getSqlSession()) {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
userMapper.insert(user);
sqlSession.commit();
}
}
public void updateUser(User user) {
try (SqlSession sqlSession = MyBatisUtils.getSqlSession()) {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
userMapper.update(user);
sqlSession.commit();
}
}
public void deleteUser(int id) {
try (SqlSession sqlSession = MyBatisUtils.getSqlSession()) {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
userMapper.delete(id);
sqlSession.commit();
}
}
}
注意事项
- Mapper 接口方法签名与 XML 中 SQL 语句的对应关系:Mapper 接口中的方法名要与 XML 配置文件中
<select>
、<insert>
、<update>
、<delete>
等标签的id
属性值一致,并且方法的参数类型和返回值类型要与 SQL 语句的参数和结果映射相匹配。 - 参数传递:在 Mapper 接口方法中可以使用
@Param
注解来指定参数名称,以便在 SQL 语句中通过#{参数名}
的方式获取参数值。如果方法只有一个参数,且不是复杂对象(如 JavaBean),可以省略@Param
注解。 - 命名空间(namespace):Mapper XML 文件中的
<mapper>
标签的namespace
属性值必须与 Mapper 接口的全限定名一致,这是 MyBatis 能够正确找到并绑定 Mapper 接口和 XML 配置的关键。 - 事务管理:在使用 Mapper 代理执行数据库操作时,需要注意事务的管理。一般情况下,可以在业务逻辑层中通过
SqlSession
来控制事务的提交和回滚。
通过以上介绍和代码示例,希望你对 MyBatis 及其 Mapper 代理方式有更深入的理解。在实际的 Java Web 开发中,MyBatis 能够大大简化数据库操作,提高开发效率。