引言
MyBatis 是一个优秀的持久层框架,它消除了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的工作。MyBatis 可以使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。本文将手把手教你从入门到实战,全面解析 MyBatis 的使用。
一、MyBatis 简介
1.1 MyBatis 的特点
- 半自动化:MyBatis 将 SQL 映射文件和 Java 代码分离,使得 SQL 的编写和 Java 代码的编写更加清晰。
- 灵活的映射:MyBatis 支持复杂的映射,如一对一、一对多、多对多等。
- 支持自定义 SQL:MyBatis 允许自定义 SQL,实现复杂的业务逻辑。
- 支持缓存:MyBatis 支持一级缓存和二级缓存,提高查询效率。
1.2 MyBatis 的优势
- 简化开发:减少 JDBC 代码,提高开发效率。
- 易于维护:SQL 和 Java 代码分离,易于维护。
- 灵活配置:支持 XML 和注解两种配置方式。
二、MyBatis 入门
2.1 环境搭建
- 安装 JDK:MyBatis 需要 JDK 1.6 或更高版本。
- 安装 Maven:Maven 是一个项目管理工具,用于构建和管理 Java 项目。
- 添加依赖:在
pom.xml文件中添加 MyBatis 依赖。
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
2.2 编写 Mapper 接口
public interface UserMapper {
User getUserById(Integer id);
}
2.3 编写 Mapper XML
<mapper namespace="com.example.mapper.UserMapper">
<select id="getUserById" resultType="com.example.entity.User">
SELECT * FROM user WHERE id = #{id}
</select>
</mapper>
2.4 配置 MyBatis
- 创建
SqlSessionFactory:用于创建SqlSession。 - 创建
SqlSession:用于执行 SQL 语句。
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
2.5 使用 MyBatis
User user = sqlSession.selectOne("com.example.mapper.UserMapper.getUserById", 1);
System.out.println(user);
sqlSession.close();
三、MyBatis 实战案例解析
3.1 一对一映射
假设有一个用户表和一个地址表,用户表和地址表通过用户 ID 进行关联。
- 创建实体类:
public class User {
private Integer id;
private String name;
// ... getter 和 setter
}
public class Address {
private Integer id;
private String address;
// ... getter 和 setter
}
- 编写 Mapper 接口:
public interface UserMapper {
User getUserById(Integer id);
Address getAddressById(Integer id);
}
- 编写 Mapper XML:
<mapper namespace="com.example.mapper.UserMapper">
<resultMap id="userAddressMap" type="com.example.entity.User">
<id property="id" column="id" />
<result property="name" column="name" />
<association property="address" column="id" javaType="com.example.entity.Address">
<id property="id" column="id" />
<result property="address" column="address" />
</association>
</resultMap>
<select id="getUserById" resultMap="userAddressMap">
SELECT u.id, u.name, a.address FROM user u LEFT JOIN address a ON u.id = a.user_id WHERE u.id = #{id}
</select>
</mapper>
3.2 一对多映射
假设有一个用户表和一个订单表,一个用户可以有多个订单。
- 创建实体类:
public class User {
private Integer id;
private String name;
// ... getter 和 setter
}
public class Order {
private Integer id;
private String orderNo;
// ... getter 和 setter
}
- 编写 Mapper 接口:
public interface UserMapper {
User getUserById(Integer id);
List<Order> getOrdersByUserId(Integer id);
}
- 编写 Mapper XML:
<mapper namespace="com.example.mapper.UserMapper">
<resultMap id="userOrderMap" type="com.example.entity.User">
<id property="id" column="id" />
<result property="name" column="name" />
<collection property="orders" column="id" ofType="com.example.entity.Order">
<id property="id" column="id" />
<result property="orderNo" column="order_no" />
</collection>
</resultMap>
<select id="getUserById" resultMap="userOrderMap">
SELECT u.id, u.name, o.id AS order_id, o.order_no FROM user u LEFT JOIN order o ON u.id = o.user_id WHERE u.id = #{id}
</select>
</mapper>
四、总结
本文从 MyBatis 的简介、入门、实战案例解析等方面进行了详细的介绍。通过本文的学习,相信你已经对 MyBatis 有了一定的了解。在实际开发中,MyBatis 可以大大提高开发效率,简化数据库操作。希望本文能对你有所帮助。
