Mybatis快速入门大全(详细版)

MyBatis是一款流行的持久层框架,简化了JDBC操作。以下是其基础入门语法:

1. 核心配置文件(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.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/test"/>
        <property name="username" value="root"/>
        <property name="password" value="password"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="UserMapper.xml"/>
  </mappers>
</configuration>

2. SQL映射文件(UserMapper.xml)

定义SQL语句与Java方法的映射关系。

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="selectUser" parameterType="int" resultType="com.example.entity.User">
    SELECT * FROM users WHERE id = #{id}
  </select>
  
  <!-- 插入用户 -->
  <insert id="insertUser" parameterType="com.example.entity.User">
    INSERT INTO users (name, age) VALUES (#{name}, #{age})
    <!-- 获取自增主键 -->
    <selectKey keyProperty="id" resultType="int" order="AFTER">
      SELECT LAST_INSERT_ID()
    </selectKey>
  </insert>
</mapper>

3. Java实体类(User.java)

对应数据库表结构。

java 复制代码
public class User {
    private Integer id;
    private String name;
    private Integer age;
    
    // getters/setters
}

4. Mapper接口(UserMapper.java)

定义操作数据库的方法。

java 复制代码
public interface UserMapper {
    User selectUser(int id);
    int insertUser(User user);
}

5. 获取SqlSession并执行操作

java 复制代码
// 加载配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

// 执行查询
try (SqlSession session = sqlSessionFactory.openSession()) {
    UserMapper mapper = session.getMapper(UserMapper.class);
    User user = mapper.selectUser(1);
    System.out.println(user.getName());
}

6. 动态SQL

根据条件动态生成SQL语句。

xml 复制代码
<select id="findUsers" resultType="User">
  SELECT * FROM users
  <where>
    <if test="name != null">
      AND name = #{name}
    </if>
    <if test="age != null">
      AND age &gt; #{age}
    </if>
  </where>
</select>

7. 参数处理

  • #{}:预编译处理(防止SQL注入)
  • ${}:直接替换(用于表名、列名等)
xml 复制代码
<select id="selectUsers" resultType="User">
  SELECT * FROM ${tableName} WHERE age > #{minAge}
</select>

8. 结果映射

处理列名与属性名不一致的情况。

xml 复制代码
<resultMap id="userResultMap" type="User">
  <id property="id" column="user_id"/>
  <result property="name" column="user_name"/>
</resultMap>

<select id="selectUser" resultMap="userResultMap">
  SELECT user_id, user_name FROM users WHERE id = #{id}
</select>

9. 事务管理

java 复制代码
SqlSession session = sqlSessionFactory.openSession(false); // 手动提交
try {
    UserMapper mapper = session.getMapper(UserMapper.class);
    mapper.insertUser(user1);
    mapper.insertUser(user2);
    session.commit(); // 提交事务
} catch (Exception e) {
    session.rollback(); // 回滚事务
    throw e;
} finally {
    session.close();
}

10. 注解方式(替代XML)

java 复制代码
public interface UserMapper {
    @Select("SELECT * FROM users WHERE id = #{id}")
    User selectUser(int id);
    
    @Insert("INSERT INTO users (name, age) VALUES (#{name}, #{age})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    int insertUser(User user);
}
相关推荐
wuminyu2 分钟前
JVM规范学习总结-JVM规范基本概念
java·linux·c语言·jvm·c++
时间静止不是简史4 小时前
生产事故排查:Redis 宕机导致补偿队列消费线程死亡,通话录音未上送业务平台
java·redis
2301_32241428047 小时前
基于SpringBoot+Vue的休闲零食超市管理系统的设计与实现59004-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·vue.js·spring boot·redis·mysql·决策树·推荐算法
金銀銅鐵9 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(上)
java·后端·ai编程
福建佰胜张工10 小时前
SMC 薄型气爪 MHF2-16D1 深度解析:平行开闭、低剖面结构在自动化装配中的选型与落地
java·服务器·安全·自动化
catoop10 小时前
API Key 设计与安全生成方案:结构拆解、数据库设计与 Java 实现
java·数据库·安全
system_error_x10 小时前
SpringBoot 集成 Thymeleaf 简洁入门
java·spring boot·后端
驭渊的小故事11 小时前
Spring AI Alibaba 实战:从maven依赖治理到声明式工具调用
java·人工智能·spring
Elastic 中国社区官方博客11 小时前
我们如何通过 70 多个拉取请求,将 OpenTelemetry Java agent 迁移到 invokedynamic
java·大数据·开发语言·elasticsearch·搜索引擎·全文检索·es
tyn18811 小时前
记录本地安装nacos服务的方法及异常
java·开发语言