本文详细介绍了Mybatis教程,包括环境搭建、核心配置文件解析、基本CRUD操作以及动态SQL的使用。此外,还涵盖了Mybatis与Spring的集成和一些高级特性如分页查询和缓存机制。通过这些内容,读者可以全面了解和掌握Mybatis的使用方法。
Mybatis教程:从入门到初级实战 Mybatis简介与环境搭建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基本CRUD操作
查询操作
使用 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的使用
Mybatis 支持动态生成 SQL 语句,通过标签如 if
, choose
, foreach
可以使 SQL 语句更灵活。
if标签
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标签
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标签
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标签
other
标签用于其他场景,可以根据实际需求进行扩展。
Spring与Mybatis集成的必要性
Spring 与 Mybatis 集成可以实现事务管理、依赖注入等功能,使开发更加便捷。
配置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>
使用注解进行Mybatis的映射
可以使用 @Mapper
注解来代替 XML 文件。
示例代码
假设有一个 UserMapper
接口:
@Mapper
public interface UserMapper {
List<User> selectUser(String name, Integer age);
}
Mybatis的高级特性
分页查询
分页查询可以通过 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 官方文档。