本文详细介绍了Mybatis教程,包括环境搭建、核心配置文件解析、基本CRUD操作以及动态SQL的使用。此外,还涵盖了Mybatis与Spring的集成和一些高级特性如分页查询和缓存机制。通过这些内容,读者可以全面了解和掌握Mybatis的使用方法。
Mybatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。Mybatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。Mybatis可以使用简单的 XML 或注解进行配置和原始映射,并将接口和 Java 的 POJO 传递给 SQL 语句。
首先,确保你的开发环境已经安装了 Java 和 Maven。这里推荐使用 IntelliJ IDEA 或 Eclipse 作为开发工具。创建一个新的 Maven 项目,并在项目的 pom.xml 文件中添加 Mybatis 依赖。以下是示例代码:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>mybatisDemo</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>1.4.200</version> </dependency> </dependencies> </project> `` 上述代码中,添加了 Mybatis 依赖和 H2 数据库依赖,H2 是一个嵌入式数据库,适用于开发和测试环境。 ## Mybatis核心配置文件解析 ### 配置文件详解 Mybatis 的配置文件通常命名为 `mybatis-config.xml`,主要包含以下几个部分: - `<configuration>`:配置文件的根元素。 - `<environments>`:定义 Mybatis 环境,如连接的数据库类型、事务管理方式等。 - `<mappers>`:定义映射文件,映射 SQL 语句和 Java 实体类。 数据库连接信息通常在 `<environments>` 标签中进行配置: ```xml <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="org.h2.Driver"/> <property name="url" value="jdbc:h2:mem:test"/> <property name="username" value="sa"/> <property name="password" value=""/> </dataSource> </environment> </environments>
映射文件用于定义 SQL 语句与 Java 实体类之间的映射关系。映射文件通常命名为 UserMapper.xml
,并放置在 src/main/resources
目录下。
<mappers> <mapper resource="com/example/mapper/UserMapper.xml"/> </mappers>
使用 Mybatis 进行查询操作,可以通过 SQL 语句和对应的 Java 方法进行映射。
假设有一个 User
类:
public class User { private int id; private String name; private int age; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
对应的 UserMapper.xml
文件:
<mapper namespace="com.example.mapper.UserMapper"> <select id="selectUserById" resultType="com.example.User"> SELECT id, name, age FROM user WHERE id = #{id} </select> </mapper>
Java 方法:
public interface UserMapper { User selectUserById(int id); }
插入操作同样可以使用 SQL 语句和 Java 方法进行映射。
假设有一个 User
类:
public class User { private int id; private String name; private int age; public User(String name, int age) { this.name = name; this.age = age; } }
对应的 UserMapper.xml
文件:
<mapper namespace="com.example.mapper.UserMapper"> <insert id="insertUser" parameterType="com.example.User"> INSERT INTO user (name, age) VALUES (#{name}, #{age}) </insert> </mapper>
Java 方法:
public interface UserMapper { void insertUser(User user); }
更新操作可以使用 SQL 语句和 Java 方法进行映射。
假设有一个 User
类:
public class User { private int id; private String name; private int age; public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } }
对应的 UserMapper.xml
文件:
<mapper namespace="com.example.mapper.UserMapper"> <update id="updateUser" parameterType="com.example.User"> UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id} </update> </mapper>
Java 方法:
public interface UserMapper { void updateUser(User user); }
删除操作可以使用 SQL 语句和 Java 方法进行映射。
假设有一个 User
类:
public class User { private int id; private String name; private int age; }
对应的 UserMapper.xml
文件:
<mapper namespace="com.example.mapper.UserMapper"> <delete id="deleteUser" parameterType="int"> DELETE FROM user WHERE id = #{id} </delete> </mapper>
Java 方法:
public interface UserMapper { void deleteUser(int id); }
Mybatis 支持动态生成 SQL 语句,通过标签如 if
, choose
, foreach
可以使 SQL 语句更灵活。
if
标签用来条件判断,如果条件成立,则插入 SQL 语句片段。
假设有一个 User
类:
public class User { private int id; private String name; private int age; }
对应的 UserMapper.xml
文件:
<mapper namespace="com.example.mapper.UserMapper"> <select id="selectUserByName" resultType="com.example.User"> SELECT id, name, age FROM user WHERE 1=1 <if test="name != null"> AND name = #{name} </if> <if test="age != null"> AND age = #{age} </if> </select> </mapper>
Java 方法:
public interface UserMapper { List<User> selectUserByName(String name, Integer age); }
choose
标签类似于 Java 中的 switch
语句,用来选择多个条件中的一个执行。
假设有一个 User
类:
public class User { private int id; private String name; private int age; }
对应的 UserMapper.xml
文件:
<mapper namespace="com.example.mapper.UserMapper"> <select id="selectUser" resultType="com.example.User"> SELECT id, name, age FROM user WHERE <choose> <when test="name != null"> name = #{name} </when> <when test="age != null"> age = #{age} </when> <otherwise> 1=1 </otherwise> </choose> </select> </mapper>
Java 方法:
public interface UserMapper { List<User> selectUser(String name, Integer age); }
foreach
标签用来遍历集合。
假设有一个 User
类:
public class User { private int id; private String name; private int age; }
对应的 UserMapper.xml
文件:
<mapper namespace="com.example.mapper.UserMapper"> <select id="selectUsersByIds" resultType="com.example.User"> SELECT id, name, age FROM user WHERE id IN <foreach item="item" index="index" collection="ids" open="(" separator="," close=")"> #{item} </foreach> </select> </mapper>
Java 方法:
public interface UserMapper { List<User> selectUsersByIds(List<Integer> ids); }
other
标签用于其他场景,可以根据实际需求进行扩展。
Spring 与 Mybatis 集成可以实现事务管理、依赖注入等功能,使开发更加便捷。
在 Spring 配置文件中引入 Mybatis 的配置信息。
在 Spring 配置文件 applicationContext.xml
中配置 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="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg> <ref bean="sqlSessionFactory"/> </constructor-arg> </bean> <bean id="userMapper" class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.example.mapper"/> <property name="sqlSessionTemplateRef" value="sqlSessionTemplate"/> </bean>
可以使用 @Mapper
注解来代替 XML 文件。
假设有一个 UserMapper
接口:
@Mapper public interface UserMapper { List<User> selectUser(String name, Integer age); }
分页查询可以通过 Mybatis 的 PageHelper
插件实现。
在 pom.xml
中引入 PageHelper
插件依赖:
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.1.4</version> </dependency>
配置 pagehelper
插件:
<bean id="pageHelper" class="com.github.pagehelper.PageHelper"> <property name="properties"> <value> helperDialect=mysql reasonable=true </value> </property> </bean>
使用 PageHelper
进行分页查询:
PageHelper.startPage(pageNum, pageSize); List<User> users = userMapper.selectUser(name, age); Page<User> result = (Page<User>) users;
一级缓存是 SqlSession 级别的缓存,每个 SqlSession 中都有一个缓存。
二级缓存是 Mapper 级别的缓存,多个 SqlSession 共享同一个 Mapper 级别的缓存。
配置 Mybatis 二级缓存:
<cache />
Mybatis 允许用户自定义插件来扩展或改造 Mybatis 框架。
假设一个插件用于拦截 SQL 语句:
@Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})}) public class MyPlugin implements Interceptor { @Override public Object intercept(Invocation invocation) throws Throwable { MappedStatement ms = (MappedStatement) invocation.getArgs()[0]; Object parameter = invocation.getArgs()[1]; // 执行 SQL 语句之前的操作 System.out.println("Before executing SQL: " + ms.getId()); Object result = invocation.proceed(); // 执行 SQL 语句之后的操作 System.out.println("After executing SQL: " + ms.getId()); return result; } }
在 Spring 配置文件中配置插件:
<bean id="myInterceptor" class="com.example.interceptor.MyPlugin"/>
本文介绍了 Mybatis 框架的基本概念、配置文件的解析、CRUD 操作、动态 SQL 的使用、与 Spring 的集成以及高级特性如分页查询、缓存和插件开发。通过这些建议和示例代码,你可以进一步掌握 Mybatis 的使用。更多详细信息和高级用法可以参考 Mybatis 官方文档。