SQL映射文件
SQL映射文件中的几个顶级元素介绍如下:
- mapper:SQL映射文件的根元素。只有一个属性namespace,用于区分不同的mapper,必须全局唯一。
- cache:为给定命名空间中的缓存配置。
- cache-ref:引用其他命名空间配置缓存。
- resultMap:用来描述查询结果集中的字段和Java实体类属性的对应关系。
- sql:定义可重用的SQL语句块,可以在其他语句映射中引用,提高编写和维护SQL语句效率。
- insert:映射insert语句。
- update:映射update语句。
- delete:映射delete语句。
- select:映射select语句。
MyBatis框架的条件查询
MyBatis 是一个优秀的持久层框架,它允许你直接使用 SQL,同时提供映射文件来配置 SQL 和 Java 对象的对应关系。下面是一个使用 MyBatis 实现单一条件查询的示例代码。
1. 创建数据库表
首先,我们假设有一个简单的 users
表:
CREATE TABLE users ( | |
id INT PRIMARY KEY AUTO_INCREMENT, | |
name VARCHAR(50), | |
age INT | |
); |
2. 创建 Java 实体类
然后,我们创建一个与 users
表对应的 Java 实体类 User
:
public class User { | |
private Integer id; | |
private String name; | |
private Integer age; | |
// getters and setters | |
// ... | |
@Override | |
public String toString() { | |
return "User{" + | |
"id=" + id + | |
", name='" + name + '\'' + | |
", age=" + age + | |
'}'; | |
} | |
} |
3. 创建 MyBatis 映射文件
在 MyBatis 中,我们使用 XML 映射文件来配置 SQL 语句和 Java 对象的对应关系。创建一个 UserMapper.xml
文件:
<?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.example.mapper.UserMapper"> | |
<select id="selectUserByName" resultType="com.example.entity.User"> | |
SELECT * FROM users WHERE name = #{name} | |
</select> | |
</mapper> |
注意:这里的 namespace
需要与你的 UserMapper
接口的全名一致,resultType
需要与你的 User
类的全名一致。
4. 创建 MyBatis Mapper 接口
接下来,我们创建一个与 XML 映射文件对应的 Java 接口 UserMapper
:
package com.example.mapper; | |
import com.example.entity.User; | |
public interface UserMapper { | |
User selectUserByName(String name); | |
} |
5. 在 MyBatis 配置文件中注册 Mapper
最后,在你的 MyBatis 配置文件(通常是 mybatis-config.xml
)中注册这个 Mapper:
<configuration> | |
<!-- ... 其他配置 ... --> | |
<mappers> | |
<mapper resource="com/example/mapper/UserMapper.xml"/> | |
</mappers> | |
</configuration> |
6. 使用 MyBatis 进行查询
现在,你可以在你的 Java 代码中使用 MyBatis 提供的 SqlSession
或 SqlSessionFactory
来获取 UserMapper
实例,并执行查询操作:
try (SqlSession session = sqlSessionFactory.openSession()) { | |
UserMapper userMapper = session.getMapper(UserMapper.class); | |
User user = userMapper.selectUserByName("John Doe"); | |
System.out.println(user); | |
} |
MyBatis实现多参数查询主要有以下几种方式:
- 使用
#{paramName}
直接传递参数- 当参数较少时,可以直接在Mapper接口的方法中定义多个参数,并在XML映射文件中使用
#{paramName}
来引用它们。 - 示例:
在XML中:List<User> selectUsersByNameAndAge(String name, Integer age);
<select id="selectUsersByNameAndAge" resultType="com.example.entity.User">
SELECT * FROM users WHERE name = #{name} AND age = #{age}
</select>
- 当参数较少时,可以直接在Mapper接口的方法中定义多个参数,并在XML映射文件中使用
- 使用
@Param
注解- 当参数较多或需要明确指定参数名时,可以使用
@Param
注解来命名参数。 - 示例:
在XML中:List<User> selectUsers(@Param("name") String name, @Param("age") Integer age);
<select id="selectUsers" resultType="com.example.entity.User">
SELECT * FROM users WHERE name = #{name} AND age = #{age}
</select>
- 当参数较多或需要明确指定参数名时,可以使用
- 使用Map传递参数
- 将多个参数放入一个Map中,然后在XML映射文件中通过Map的key来引用参数。
- 示例:
在调用时:List<User> selectUsersByMap(Map<String, Object> params);
在XML中:Map<String, Object> params = new HashMap<>();
params.put("name", "John Doe");
params.put("age", 30);
List<User> users = userMapper.selectUsersByMap(params);
<select id="selectUsersByMap" resultType="com.example.entity.User">
SELECT * FROM users WHERE name = #{name} AND age = #{age}
</select>
- 使用Java Bean或DTO(Data Transfer Object)
- 创建一个包含所有查询参数的Java Bean或DTO,并在Mapper接口的方法中使用该Bean或DTO作为参数。
- 示例:
在XML中:public class UserQueryParam {
private String name;
private Integer age;
// getters and setters
}
List<User> selectUsersByQueryParam(UserQueryParam queryParam);
<select id="selectUsersByQueryParam" resultType="com.example.entity.User">
SELECT * FROM users WHERE name = #{queryParam.name} AND age = #{queryParam.age}
</select>
MyBatis框架的结果映射
使用resultMap元素自定义结果映射
resultMap元素包含以下属性:
- id:映射规则集的唯一标识,可以被select元素的resultMap属性引用。
- type:映射的结果过类型,这里指定封装成User实例。
resultMap元素包含以下子元素:
- id:指定和数据表主键字段对应的标识属性。设置此项可以提升MyBatis框架的性能,特别是应用缓存和嵌套结果映射的时候。
- resuly:指定结果集字段和实体类属性的映射关系。
- association元素
- collection元素
MyBatis框架的缓存分类
一级缓存
MyBatis框架是基于PerpetualCache的HashMap本地缓存,默认是SqlSession级别的缓存,在SqlSession的一个生命周期内有效。
二级缓存
二级缓存是SqlSessionFactory级别的,其作用域超出了一个SqlSession的范围,缓存中的数据可以被所有SqlSession共享。