MyBatis 是一款优秀的基于Java的持久层框架,它能够帮助开发者灵活地将SQL语句与Java对象进行映射,简化了数据库操作的复杂性。以下是一些MyBatis的核心语法和用法:
### 基本配置与映射文件
- **配置文件**(`mybatis-config.xml`):包含了数据库连接、事务管理、映射文件路径等全局配置信息。
```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/mydatabase"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/example/mapping/UserMapper.xml"/>
</mappers>
</configuration>
```
### 映射文件(Mapper XML 文件)
- **增删改查操作**:
- `insert`:用于插入数据
```xml
<insert id="insertUser" parameterType="com.example.model.User">
INSERT INTO users(username, password)
VALUES (#{username}, #{password})
</insert>
```
- `update`:用于更新数据
```xml
<update id="updateUser" parameterType="com.example.model.User">
UPDATE users SET password=#{password} WHERE username=#{username}
</update>
```
- `delete`:用于删除数据
```xml
<delete id="deleteUser" parameterType="java.lang.String">
DELETE FROM users WHERE username=#{username}
</delete>
```
- `select`:用于查询数据
```xml
<select id="findUserByUsername" resultType="com.example.model.User">
SELECT * FROM users WHERE username=#{username}
</select>
```
### 参数传递
- MyBatis可以通过多种方式进行参数传递:
- 单个简单类型参数:
```xml
#{paramName}
```
- Map类型参数:
```xml
#{map.key}
```
- POJO类型参数,通过属性名引用:
```xml
#{propertyName}
```
### 动态SQL
- MyBatis支持动态SQL标签,例如:
- `<if>`:根据条件包含或排除SQL片段
```xml
<select id="selectUsers" parameterType="map">
SELECT * FROM users
<if test="name != null">
WHERE name = #{name}
</if>
</select>
```
- `<foreach>`:循环遍历集合
```xml
<select id="selectUsersByIds" parameterType="list">
SELECT * FROM users
WHERE id IN
<foreach item="id" index="index" collection="list" open="(" separator="," close=")">
#{id}
</foreach>
</select>
```
### 输出映射(ResultMap)
- 结果集映射到实体类
```xml
<resultMap id="userResultMap" type="com.example.model.User">
<id property="id" column="user_id"/>
<result property="username" column="username"/>
<result property="password" column="password"/>
</resultMap>
```
以上仅是MyBatis基础语法的一部分,实际使用中还包括许多其他特性,比如association(关联)、collection(集合映射)等。通过这些语法结构,MyBatis使得SQL操作更加灵活且易于维护。
### 其他高级特性
#### 注解方式开发
除了XML映射文件之外,MyBatis也支持注解方式定义SQL语句和结果映射。在接口方法上添加注解,可以直接实现对SQL的操作。
```java
public interface UserMapper {
@Insert("INSERT INTO users(username, password) VALUES(#{username}, #{password})")
@Options(useGeneratedKeys = true, keyProperty = "id")
int insert(User user);
@Select("SELECT * FROM users WHERE id = #{id}")
@Results({
@Result(id = true, column = "id", property = "id"),
@Result(column = "username", property = "username"),
@Result(column = "password", property = "password")
})
User selectById(int id);
}
```
#### 别名
为了简化长类型的书写,MyBatis允许在配置文件中定义别名。
```xml
<typeAliases>
<typeAlias alias="User" type="com.example.model.User"/>
</typeAliases>
```
这样,在映射文件或注解中就可以直接使用`User`代替完整的类名。
#### 二级缓存
MyBatis 提供了一级缓存(Session 级别的缓存)和二级缓存(全局级别的缓存)。二级缓存可以在多个会话间共享查询结果,以提高性能。
```xml
<cache eviction="LRU" flushInterval="60000" size="512" readOnly="true"/>
```
#### 插件(Plugins)
MyBatis 提供了插件机制,可以自定义拦截器来扩展 MyBatis 的行为。例如,可以创建一个插件来实现自动填充时间戳字段。
```java
@Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})})
public class ExamplePlugin implements Interceptor {
// ...
}
```
以上只是MyBatis众多特性的部分介绍,具体使用时可以根据项目需求选择适合的配置和功能。总的来说,MyBatis作为一个轻量级ORM框架,以其灵活性和强大的功能深受开发者喜爱。
#### 分页支持
MyBatis 并没有内置分页功能,但是可以通过编写动态 SQL 来实现分页查询。在实际应用中,常结合具体的数据库方言进行分页处理,例如在MySQL中的分页示例:
```xml
<select id="selectUsersWithPagination" parameterType="map" resultMap="userResultMap">
SELECT * FROM users
<if test="orderByClause != null">
ORDER BY ${orderByClause}
</if>
LIMIT #{offset}, #{limit}
</select>
```
在这个例子中,`offset` 和 `limit` 分别对应分页的起始位置和每页大小。
另外,社区也有像 mybatis-paginator、PageHelper 这样的第三方分页插件,它们提供了更为便捷的分页支持,只需简单的配置即可实现分页功能。
#### 多表关联查询
MyBatis 可以通过 resultMap 定义复杂的实体类之间的关联关系,包括一对一、一对多、多对多等。
```xml
<resultMap id="userAndOrdersResultMap" type="User">
<id property="id" column="user_id"/>
<result property="username" column="username"/>
<!-- 一对多关联 -->
<collection property="orders" ofType="Order">
<id property="id" column="order_id"/>
<result property="productName" column="product_name"/>
<!-- 关联外键 -->
<association property="user" javaType="User">
<id property="id" column="user_id"/>
<result property="username" column="username"/>
</association>
</collection>
</resultMap>
```
#### 事务管理
在 MyBatis 配置文件中,可以通过 `<transactionManager>` 标签配置事务管理器,例如 JDBC 或者 MANAGED(对于 Spring 环境下的事务管理)。
```xml
<transactionManager type="MANAGED"/>
```
在 Spring 集成环境下,可以通过 AOP 配置事务策略,对数据库操作进行统一的事务管理。
总之,MyBatis 以其高度的灵活性和丰富的功能,极大地简化了 Java 应用程序对数据库的操作,并且能够很好地与其他框架进行集成,满足各种业务场景的需求。
#### SQL构建器(SqlBuilder)
从MyBatis 3.4.5版本开始,引入了新的API SqlBuilder,它可以方便地构建动态SQL,而无需在XML中编写大量的`<if>`、`<choose>`、`<when>`、`<otherwise>`、`<foreach>`等标签。```java
public interface UserMapper {
@SelectProvider(type = UserSqlBuilder.class, method = "selectUsers")
List<User> selectUsers(@Param("username") String username, @Param("statusList") List<Integer> statusList);
}
public class UserSqlBuilder {
public static String selectUsers(final Map<String, Object> params) {
return new SQL() {{
SELECT("*");
FROM("users");
if (params.get("username") != null) {
WHERE("username = #{username}");
}
if (params.get("statusList") != null) {
WHERE("status IN " + SqlBuilder.in(params.get("statusList")));
}
}}.toString();
}
}
```
#### Scripting Support
MyBatis 支持在XML映射文件中使用Groovy脚本来编写动态SQL,增强了SQL表达能力。
```xml
<select id="selectUsers" resultType="User">
<script>
SELECT * FROM users
<where>
<if test="username != null">
AND username = #{username}
</if>
<if test="statusList != null">
AND status IN
<foreach item="status" index="index" collection="statusList" open="(" separator="," close=")">
#{status}
</foreach>
</if>
</where>
</script>
</select>
```
#### 自动填充(Automatic Mapping)
MyBatis 支持自动映射结果集到Java对象,如果数据库表字段名称与Java对象的属性名称相匹配,则无需手动指定`<resultMap>`。
此外,MyBatis还有更多高级特性,例如延迟加载(懒加载)、存储过程调用、日志记录、类型处理器等等,能满足不同层次和规模的应用程序需求。同时,由于其轻量级和易扩展的特性,使得它在现代Web应用和微服务架构中得到了广泛的应用。