mybatis怎么操作数据库
- 数据库
- 2025-07-19
- 5014
MyBatis 是一款优秀的持久层框架,通过简单的配置和少量的代码即可实现对数据库的高效操作,以下是 MyBatis 操作数据库的详细指南,涵盖基础操作、核心功能及高级特性。
基础操作流程
MyBatis 的核心目标是简化数据库交互,其操作流程可分为以下步骤:
-  配置环境 - 在 mybatis-config.xml中配置数据源、事务管理器等。
- 示例配置: <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/test"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments>
 
- 在 
-  创建实体类 - 将数据库表映射为 Java 对象(POJO),字段名与表列一一对应。
- 示例: public class User { private Integer id; private String name; private String email; // getters and setters }
 
-  定义 Mapper 接口 - 编写 DAO 接口(如 UserMapper.java),声明数据库操作方法。
- 示例: public interface UserMapper { void insertUser(User user); User selectUserById(Integer id); }
 
- 编写 DAO 接口(如 
-  编写 XML 映射文件 - 在 UserMapper.xml中定义 SQL 语句,并与接口方法绑定。
- 示例: <mapper namespace="com.example.UserMapper"> <insert id="insertUser" parameterType="User"> INSERT INTO users (name, email) VALUES (#{name}, #{email}) </insert> <select id="selectUserById" resultType="User"> SELECT FROM users WHERE id = #{id} </select> </mapper>
 
- 在 
-  执行操作 - 通过 SqlSession获取 Mapper 实例并调用方法。
- 示例: try (SqlSession session = sqlSessionFactory.openSession()) { UserMapper mapper = session.getMapper(UserMapper.class); mapper.insertUser(new User("John", "john@example.com")); session.commit(); }
 
- 通过 
CRUD 操作详解
MyBatis 支持完整的增删改查操作,具体实现如下:
| 操作类型 | 方法示例 | XML 配置 | 关键特性 | 
|---|---|---|---|
| 新增(Insert) | insertUser | <insert> | 支持返回主键 | 
| 删除(Delete) | deleteUser | <delete> | 动态参数拼接 | 
| 修改(Update) | updateUserEmail | <update> | 条件更新 | 
| 查询(Select) | selectUserById | <select> | 结果映射、分页查询 | 
示例:插入返回主键

<insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
   INSERT INTO users (name, email) VALUES (#{name}, #{email})
</insert> 
通过 useGeneratedKeys 和 keyProperty,MyBatis 会自动将数据库生成的主键赋值给 POJO 的 id 字段。
动态 SQL 与参数处理
MyBatis 提供动态 SQL 功能,可根据条件灵活生成语句:
-  动态条件拼接 <select id="searchUsers" resultType="User"> SELECT FROM users <where> <if test="name != null">AND name = #{name}</if> <if test="email != null">AND email = #{email}</if> </where> </select>通过 <if>标签实现按需拼接 WHERE 条件。
-  参数传递 - 支持单个参数(如 #{id})和集合参数(如<foreach>遍历列表)。
- 示例:批量删除 <delete id="deleteUsers"> DELETE FROM users WHERE id IN <foreach item="id" collection="list" open="(" separator="," close=")"> #{id} </foreach> </delete>
 
- 支持单个参数(如 
结果映射与关联查询
MyBatis 通过 resultMap 解决字段名与属性名不一致的问题:

-  基础映射 <resultMap id="userMap" type="User"> <id property="id" column="id"/> <result property="name" column="user_name"/> <result property="email" column="email"/> </resultMap> <select id="selectAllUsers" resultMap="userMap"> SELECT id, user_name, email FROM users </select> 将数据库列 user_name映射到 Java 属性name。
-  关联查询 - 一对一关联:通过 <association>映射关联对象。
- 一对多关联:通过 <collection>映射集合属性。
 
- 一对一关联:通过 
缓存与事务管理
MyBatis 提供一级缓存(默认开启)和二级缓存(需手动配置):
-  一级缓存 
 基于SqlSession生命周期,相同会话内多次查询相同数据会从缓存取值。
-  二级缓存 
 在mapper.xml中配置<cache/>,可实现跨会话共享缓存。 <cache eviction="LRU" flushInterval="60000" size="512"/> 
-  事务管理 - 手动控制:通过 SqlSession的commit()和rollback()管理事务。
- 集成 Spring 后可通过 @Transactional注解自动管理。
 
- 手动控制:通过 
高级功能
-  延迟加载(Lazy Loading) - 适用于一对一、一对多关联查询,仅在访问关联对象时加载数据。
- 配置:<settings><setting name="lazyLoadingEnabled" value="true"/></settings>。
 
-  逻辑删除 - 通过拦截器或自定义 SQL 实现“假删除”(如更新状态字段而非物理删除)。
- 示例: <update id="logicDelete"> UPDATE users SET status = 'DELETED' WHERE id = #{id} </update>
 
相关问答 FAQs
问题1:如何实现插入后获取自增主键?
答:在 <insert> 标签中设置 useGeneratedKeys="true" 并指定 keyProperty(对应实体类的主键字段),MyBatis 会自动将数据库生成的主键值赋给该字段。
问题2:动态 SQL 如何防止 SQL 注入?
答:MyBatis 使用 #{param} 语法自动进行参数预编译,避免 SQL 注入风险。
<select id="safeQuery">
   SELECT  FROM users WHERE name = #{name}
</select> 
即使 name 参数包含反面字符串,也不会被解析为 SQL 代码。
 
  
			 
			 
			 
			 
			 
			 
			 
			