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);
}
相关推荐
风中芦苇啊15 小时前
Java EasyExcel 导入通用工具类:自定义注解映射字段 + 反射机制
java·开发语言
家有娇妻张兔兔15 小时前
Java 对接 PLC 主流型号最合适的方案:Apache PLC4X 实战指南
java·开发语言·plc·modbus·数据缓存·西门子s7·apache plc4x
摇滚侠16 小时前
Codebuddy 官网 Codebuddy IntelliJ IDEA 插件 阅读笔记 2
java·笔记·intellij-idea
snow@li16 小时前
MyBatis:动态 SQL 全景梳理
数据库·sql·mybatis
gugucoding16 小时前
24. 【Java】枚举:更安全的常量
java·开发语言
Kyrie_kk17 小时前
Java--BigInteger 超大整数计算
java·算法
开发者联盟league17 小时前
Java 通过 JNA 调用 C++ DLL:关键流程总结
java·c++·jna
z落落17 小时前
T-SQL 事务(Transaction)
java·数据库·sql
库克克18 小时前
【C++】智能指针
java·开发语言·c++
lemon_sjdk18 小时前
Spring WebFlux 响应式编程深度解析:从架构选型到核心抽象
java·spring·架构