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);
}
相关推荐
AI人工智能+电脑小能手13 小时前
大白话说Java设计模式-26-策略模式(业务实战篇)
java·spring·设计模式·策略模式·支付系统·算法切换
不是光头 强14 小时前
Java 后端 AI 技术选型与学习路线
java·人工智能·学习
paopaokaka_luck14 小时前
基于springboot3+vue3的文山民族文化资源展示与推广平台(协同过滤算法、Echarts 图形化分析)
java·前端·spring boot·学习·echarts
eralong15 小时前
Java IO 与 NIO
java·后端
Jesse_EC15 小时前
我给消息推送加了 Publisher Confirm,然后亲手引入了一个竞态
java
S3rein15 小时前
JAVA多线程手撕
java·多线程
用户81818706274615 小时前
第7章 死锁排查实录:jstack定位死锁的完整流程
java·后端
刀锋000115 小时前
Java 工程师转 AI Agent 最短路径:用 Spring 的思维理解 Spring AI 2.0(附 LangChain4j 对照)
java·人工智能·spring boot·spring·ai agent
喵同志不止步于码农15 小时前
Java Caffeine 快速入门
java·开发语言·后端·并发·缓存一致性
Java成神之路-15 小时前
Java 并发灵魂拷问:notify/signal 唤醒顺序是规范还是实现?
java