本文深入讲解了Mybatis持久层框架项目实战的各个方面,包括环境搭建、基本使用、动态SQL的应用、与Spring的整合以及高级特性。通过实际项目案例,进一步展示了如何在实际开发中应用这些技术。文中详细介绍了配置、代码实现、关键概念和操作步骤,帮助读者全面掌握Mybatis持久层框架项目实战。
Mybatis 持久层框架项目实战:入门与初级教程 Mybatis 简介与环境搭建Mybatis 是什么
Mybatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。Mybatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。Mybatis 可以使用简单的 XML 或注解进行配置和原始映射,将接口和 Java 的 POJO 传递给任意类型的关系数据库,并且它支持自定义 SQL、存储过程以及高级映射。
Mybatis 的核心概念
- SqlSessionFactory:Mybatis 的工厂类,用于创建 SqlSession 对象。
- SqlSession:用于执行数据库操作,可以理解为一个轻量级的数据库会话。
- Configuration:配置类,包含了 Mybatis 的所有配置信息,如数据源、事务管理器、环境配置等。
- Mapper:映射器接口,用于定义数据库操作的接口方法。
开发环境设置
IDE 配置
选择一个合适的开发环境,如 IntelliJ IDEA 或 Eclipse,并安装必要的插件,如 Lombok 插件。
依赖引入
在项目的 pom.xml 文件中引入 Mybatis 和其他必要的依赖:
<dependencies>
<!-- Mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!-- MySQL Driver -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
<!-- Junit for testing -->
<dependency>
<groupId>junit</groupId>
. . .
</dependencies>
Mybatis 的基本使用
配置数据源和数据库连接
在 Mybatis 中,你需要配置数据源和数据库连接。这通常在 mybatis-config.xml
文件中完成。
<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/mydb"/>
. . .
</dataSource>
</environment>
</environments>
</configuration>
映射文件的编写
映射文件定义了 SQL 语句和 Java 方法之间的映射关系。例如,下面是一个简单的映射文件(UserMapper.xml
):
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectUserById" resultType="com.example.model.User">
SELECT * FROM user WHERE id = #{id}
</select>
<insert id="insertUser" parameterType="com.example.model.User">
INSERT INTO user (name, email) VALUES (#{name}, #{email})
</insert>
<update id="updateUser" parameterType="com.example.model.User">
UPDATE user SET name = #{name}, email = #{email} WHERE id = #{id}
</update>
<delete id="deleteUserById" parameterType="int">
DELETE FROM user WHERE id = #{id}
</delete>
</mapper>
CRUD 操作的实现
创建(Insert)
创建一个新的用户:
<insert id="insertUser" parameterType="com.example.model.User">
INSERT INTO user (name, email) VALUES (#{name}, #{email})
</insert>
读取(Select)
查询用户信息:
<select id="selectUserById" resultType="com.example.model.User">
SELECT * FROM user WHERE id = #{id}
</select>
更新(Update)
更新用户信息:
<update id="updateUser" parameterType="com.example.model.User">
UPDATE user SET name = #{name}, email = #{email} WHERE id = #{id}
</update>
删除(Delete)
删除用户:
<delete id="deleteUserById" parameterType="int">
DELETE FROM user WHERE id = #{id}
</delete>
动态 SQL 的应用
if 标签
if
标签用于条件判断,如果条件为真,则包含的内容将被包含在最终的 SQL 语句中。
<select id="selectUser" resultType="com.example.model.User">
SELECT * FROM user WHERE 1=1
<if test="name != null">
AND name = #{name}
</if>
<if test="email != null">
AND email = #{email}
</if>
</select>
choose 标签
choose
标签类似于 Java 中的 switch
语句,用来选择一个条件。
<select id="selectUser" resultType="com.example.model.User">
SELECT * FROM user WHERE 1=1
<choose>
<when test="id != null">
AND id = #{id}
</when>
<when test="name != null">
AND name = #{name}
</when>
<otherwise>
AND email = #{email}
</otherwise>
</choose>
</select>
foreach 标签
foreach
标签用于遍历集合中的元素。常用于处理 IN 条件。
<select id="selectUsersByIds" resultType="com.example.model.User">
SELECT * FROM user WHERE id IN
<foreach item="item" index="index" collection="ids" open="(" separator="," close=")">
#{item}
</foreach>
</select>
其他常用标签介绍
- trim 标签可以添加前缀和后缀,通常用于动态 SQL 的拼接。
- where 标签可以自动处理 SQL 语句的
WHERE
关键字。 - set 标签可以自动处理 SQL 语句的
SET
关键字。
<update id="updateUser" parameterType="com.example.model.User">
UPDATE user
<set>
<if test="name != null">name = #{name},</if>
<if test="email != null">email = #{email},</if>
</set>
WHERE id = #{id}
</update>
Mybatis 与 Spring 的整合
Spring 与 Mybatis 整合的必要性
Spring 和 Mybatis 的整合可以使得 Mybatis 的配置和数据库操作更加简洁和灵活。Spring 可以管理 Mybatis 的数据源和 SqlSessionFactory 的生命周期,简化代码的维护。
Spring 配置文件的编写
在 Spring 的配置文件中,需要配置数据源、SqlSessionFactory 和 Mapper 接口的扫描。
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath*:mapper/*.xml"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.mapper"/>
</bean>
Mybatis 与 Spring 事务管理
在 Spring 中配置事务管理,可以使用 AOP 和 Spring 的事务管理器来管理 Mybatis 的事务。
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
使用注解配置事务
在 Mapper 接口的方法上使用 @Transactional
注解来配置事务。
import org.springframework.transaction.annotation.Transactional;
@Transactional
public interface UserMapper {
@Override
void updateUser(User user);
@Override
void deleteUserById(int id);
}
Mybatis 的高级特性
分页查询
Mybatis 提供了自定义 SQL 的方式来实现分页查询。使用 RowBounds
类来实现分页。
public List<User> getUsersByPage(int offset, int limit) {
return sqlSession.selectList("com.example.mapper.UserMapper.getUsersByPage", new RowBounds(offset, limit));
}
结果集的延迟加载
Mybatis 支持延迟加载,可以在需要的时候加载数据,减少不必要的查询。
<resultMap id="UserResultMap" type="com.example.model.User">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="email" property="email"/>
<association property="address" javaType="com.example.model.Address" select="selectAddressById" column="addressId" fetchType="lazy"/>
</resultMap>
二级缓存的配置与使用
Mybatis 的二级缓存可以提高查询性能,需要在配置文件中开启缓存。
<cache-refresher class="com.example.cache.CacheRefresher"/>
<cache>
<type>PER_CLASS</type>
<flushInterval>1000</flushInterval>
<size>1000</size>
<blocking/>
</cache>
实战项目案例
实际项目需求分析
假设我们正在开发一个简单的图书管理系统,需要支持添加、删除、查询图书信息。整个项目需要支持数据库操作,并且需要具备分页查询和延迟加载的功能。
项目结构设计
项目结构如下:
mybatis-demo
│
├── src
│ ├── main
│ │ ├── java
│ │ │ ├── com
│ │ │ │ ├── example
│ │ │ │ │ ├── BookService.java
│ │ │ │ │ ├── BookServiceImpl.java
│ │ │ │ │ ├── BookMapper.java
│ │ │ │ │ ├── BookMapper.xml
│ │ │ │ │ └── config
│ │ │ │ │ └── MybatisConfig.java
│ │ │ └── resources
│ │ │ ├── mapper
│ │ │ │ └── BookMapper.xml
│ │ │ └── mybatis-config.xml
│ └── test
│ └── java
│ └── com
│ └── example
│ └── BookServiceTest.java
├── pom.xml
└── README.md
关键代码实现与解析
Mybatis 配置文件
<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/bookdb"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/BookMapper.xml"/>
</mappers>
</configuration>
Mapper 接口
package com.example;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
@Mapper
public interface BookMapper {
@Select("SELECT * FROM book WHERE id = #{id}")
Book selectBookById(int id);
}
Mapper XML 文件
<mapper namespace="com.example.BookMapper">
<select id="selectBookById" resultType="com.example.Book">
SELECT * FROM book WHERE id = #{id}
</select>
</mapper>
服务层实现
package com.example;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
public class BookServiceImpl implements BookService {
private SqlSessionFactory sqlSessionFactory;
public BookServiceImpl(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
@Override
public Book getBookById(int id) {
try (SqlSession session = sqlSessionFactory.openSession()) {
BookMapper mapper = session.getMapper(BookMapper.class);
return mapper.selectBookById(id);
}
}
}
分页查询
public List<Book> getBooksByPage(int offset, int limit) {
try (SqlSession session = sqlSessionFactory.openSession()) {
BookMapper mapper = session.getMapper(BookMapper.class);
return mapper.selectBooksByPage(offset, limit);
}
}
延迟加载
<resultMap id="BookResultMap" type="com.example.Book">
<id column="id" property="id"/>
<result column="title" property="title"/>
<result column="author" property="author"/>
<association property="publisher" javaType="com.example.Publisher" select="selectPublisherById" column="publisherId" fetchType="lazy"/>
</resultMap>
``
通过以上步骤,我们完成了 Mybatis 的基本使用、动态 SQL 的应用、Mybatis 与 Spring 的整合以及 Mybatis 的高级特性。希望这篇文章能帮助你更好地理解和使用 Mybatis。
共同学习,写下你的评论
评论加载中...
作者其他优质文章