MyBatis 是一个持久层框架,用于简化数据库访问操作。MyBatis 的核心功能是通过映射文件将 SQL 与 Java 代码分离,实现灵活的数据库操作。`select`、`insert`、`update`、`delete` 是基本的 CRUD 操作CRUD中,C代表Create(创建),R代表Retrieve(读取),U代表Update(更新),D代表Delete(删除)。`resultMap` 处理复杂的结果映射,`sql` 提高代码复用性,`cache` 提升性能。掌握这些知识点可以高效地使用 MyBatis 进行数据库开发。
1.select:用于查询数据。
**参数传递**
- **单个参数**:
直接使用 `#{param}` 引用参数。
- 例如:`select * from user where id = #{id}`。
- **多个参数**:
- **使用 `@Param` 注解**:在接口方法中为参数命名,SQL 中通过 `#{name}` 引用。
User selectUser(@Param("id") int id, @Param("name") String name);
select * from user where id = #{id} and name = #{name}
- **封装为 Map**:
将多个参数封装为 Map,SQL 中通过 `key` 引用。
Map<String, Object> params = new HashMap<>();
params.put("id", id);
params.put("name", name);
select * from user where id = #{id} and name = #{name}
- **封装为对象**:
将多个参数封装为自定义对象,SQL 中通过 `#{对象属性名}` 获取属性值。
User user = new User();
user.setId(id);
user.setName(name);
select * from user where id = #{id} and name = #{name}
**返回结果**
- **简单类型**:
使用 `resultType` 指定返回类型。
<select id="getCount" resultType="int">
select count(*) from user
</select>
- **复杂对象**:
使用 `resultMap` 或 `resultType` 进行映射,`resultType` 和 `resultMap` 二选一,不能同时存在。
<select id="getUser" resultType="User">
select * from user where id = #{id}
</select>
2. insert:用于插入数据。
**语法**
<insert id="insertUser" parameterType="User">
insert into user (name, age) values (#{name}, #{age})
</insert>
**获取自增主键**
对于支持自增主键的数据库(如 MySQL),可以通过 `useGeneratedKeys` 和 `keyProperty` 获取插入后的主键值。当调用userMapper.insertUser(user) 方法时,MyBatis 会自动执行插入操作,并将生成的自增主键值设置到 user 对象的id 属性中。这样,我们就可以在插入操作完成后立即获取到新插入记录的主键值。
<insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
insert into user (name, age) values (#{name}, #{age})
</insert>
3.update:用于更新数据。
#### **语法**
<update id="updateUser" parameterType="User">
update user set name = #{name}, age = #{age} where id = #{id}
</update>
4. delete:用于删除数据。
#### **语法**
<delete id="deleteUser" parameterType="int">
delete from user where id = #{id}
</delete>
5. resultMap:用于处理数据库字段与 Java 对象属性之间的映射关系,特别是当字段名与属性名不一致时。
resultMap 的两个重要子元素是 <id> 和 <result> ,它们分别用于映射主键字段和普通字段。
property :指定 Java 对象的属性名称。 column :指定 SQL 查询结果中的列名。
**基本映射**
<resultMap id="userResultMap" type="User">
<id property="id" column="id"/>
<result property="userName" column="user_name"/>
</resultMap>
**嵌套结果映射**
- **一对一关系**:使用 `<association>`。
- **一对多关系**:使用 `<collection>`。
6. sql:用于抽取重复的 SQL 片段,提高代码复用性。
#### **语法**
<sql id="userColumns">
id, name, age
</sql>
在其他 SQL 语句中使用 `<include refid="userColumns">` 来引用这个 SQL 片段。
<select id="getUsers" resultType="User">
select <include refid="userColumns"/> from user
</select>
7. cache:用于缓存查询结果,减少数据库访问次数,提高性能。
**一级缓存**
- **默认开启**:基于 `SqlSession`,同一个 `SqlSession` 中多次执行相同的 `select` 语句会从缓存中获取数据。
- **生命周期**:与 `SqlSession` 一致,`SqlSession` 关闭后缓存失效。
**二级缓存**
- **手动开启**:基于命名空间(namespace),不同的 `SqlSession` 之间可以共享缓存。