MyBatis 是一个优秀的持久层框架,它消除了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的过程。MyBatis 可以使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
MyBatis 简介
MyBatis 是一个半自动化的持久层框架,它将 SQL 映射文件、接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。MyBatis 可以让我们在 Java 应用程序中,使用简单的 XML 或注解,完成对数据库的操作。
MyBatis 的特点
- 半自动化:MyBatis 将 SQL 映射文件、接口和 Java 的 POJOs 映射成数据库中的记录,但 SQL 映射文件的编写需要手动完成。
- 简单的 XML 或注解配置:MyBatis 可以使用简单的 XML 或注解进行配置,方便开发人员使用。
- 易于扩展:MyBatis 提供了丰富的插件机制,方便开发人员根据需求进行扩展。
MyBatis 入门
环境搭建
- 下载 MyBatis:从 MyBatis 官网下载 MyBatis 的最新版本。
- 添加依赖:在项目的
pom.xml文件中添加 MyBatis 的依赖。
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
- 配置 MyBatis:在项目的
src/main/resources目录下创建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://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value=""/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/mybatis/mapper/UserMapper.xml"/>
</mappers>
</configuration>
- 编写 Mapper 接口和 XML 映射文件:在
com/mybatis/mapper目录下创建UserMapper.java接口和UserMapper.xml映射文件。
package com.mybatis.mapper;
public interface UserMapper {
List<User> selectAll();
}
<?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.mybatis.mapper.UserMapper">
<select id="selectAll" resultType="com.mybatis.entity.User">
SELECT * FROM user
</select>
</mapper>
- 运行测试:在测试类中,注入
SqlSessionFactory和UserMapper,然后调用UserMapper的selectAll方法。
package com.mybatis.test;
import com.mybatis.mapper.UserMapper;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MyBatisTest {
public static void main(String[] args) {
try {
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build("mybatis-config.xml");
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> users = userMapper.selectAll();
for (User user : users) {
System.out.println(user);
}
sqlSession.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
MyBatis 实战
一、MyBatis 与 Spring 集成
- 添加依赖:在项目的
pom.xml文件中添加 Spring 和 MyBatis 的依赖。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.10</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
- 配置 Spring 和 MyBatis:在
applicationContext.xml文件中配置 Spring 和 MyBatis。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.mybatis"/>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value=""/>
</bean>
</beans>
编写 Mapper 接口和 XML 映射文件:与 MyBatis 入门部分相同。
编写 Service 和 Dao 层:在
com.mybatis.service和com.mybatis.dao包下分别编写 Service 和 Dao 层。
package com.mybatis.service;
public interface UserService {
List<User> selectAll();
}
package com.mybatis.dao;
import com.mybatis.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@Mapper
public interface UserMapper {
List<User> selectAll();
}
- 编写 Service 实现类:在
com.mybatis.service.impl包下编写 Service 实现类。
package com.mybatis.service.impl;
import com.mybatis.dao.UserMapper;
import com.mybatis.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public List<User> selectAll() {
return userMapper.selectAll();
}
}
- 运行测试:在测试类中,注入
UserService,然后调用UserService的selectAll方法。
package com.mybatis.test;
import com.mybatis.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyBatisSpringTest {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = context.getBean(UserService.class);
List<User> users = userService.selectAll();
for (User user : users) {
System.out.println(user);
}
}
}
二、MyBatis 动态 SQL
MyBatis 支持动态 SQL,可以使用 <if>、<choose>、<when>、<otherwise> 等标签进行条件判断和选择。
1. <if> 标签
<select id="selectUserByCondition" resultType="com.mybatis.entity.User">
SELECT * FROM user
<where>
<if test="id != null">
AND id = #{id}
</if>
<if test="name != null and name != ''">
AND name = #{name}
</if>
</where>
</select>
2. <choose>、<when>、<otherwise> 标签
<select id="selectUserByCondition" resultType="com.mybatis.entity.User">
SELECT * FROM user
<where>
<choose>
<when test="id != null">
id = #{id}
</when>
<when test="name != null and name != ''">
name = #{name}
</when>
<otherwise>
1 = 1
</otherwise>
</choose>
</where>
</select>
三、MyBatis 分页
MyBatis 支持分页查询,可以使用 <foreach>、<choose>、<when>、<otherwise> 等标签进行分页处理。
1. <foreach> 标签
<select id="selectUsersByPage" resultType="com.mybatis.entity.User">
SELECT * FROM user
<where>
<if test="ids != null">
AND id IN
<foreach item="id" collection="ids" open="(" separator="," close=")">
#{id}
</foreach>
</if>
</where>
LIMIT #{start}, #{length}
</select>
2. <choose>、<when>、<otherwise> 标签
<select id="selectUsersByPage" resultType="com.mybatis.entity.User">
SELECT * FROM user
<where>
<choose>
<when test="ids != null">
AND id IN
<foreach item="id" collection="ids" open="(" separator="," close=")">
#{id}
</foreach>
</when>
<otherwise>
1 = 1
</otherwise>
</choose>
</where>
LIMIT #{start}, #{length}
</select>
四、MyBatis 缓存
MyBatis 支持一级缓存和二级缓存。
1. 一级缓存
一级缓存是本地缓存,作用域为同一个 Mapper 映射语句的同一个 SqlSession。一级缓存默认开启。
2. 二级缓存
二级缓存是全局缓存,作用域为同一个 namespace。二级缓存需要手动开启。
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
五、MyBatis 优化
- 合理使用缓存:合理使用一级缓存和二级缓存可以提高应用程序的性能。
- 合理使用分页:使用分页查询可以减少数据库的负载。
- 优化 SQL 语句:优化 SQL 语句可以提高查询效率。
- 合理使用索引:合理使用索引可以提高查询效率。
总结
MyBatis 是一个优秀的持久层框架,它可以帮助开发人员快速、高效地完成数据库操作。本文从 MyBatis 的入门、实战、优化等方面进行了详细解析,希望对您有所帮助。
