MyBatis 如何使用

发布于:2025-04-17 ⋅ 阅读:(79) ⋅ 点赞:(0)
1. 环境准备
  1. 添加依赖(Maven)
    在 pom.xml 中添加 MyBatis 和数据库驱动依赖:

    <dependencies>
        <!-- MyBatis 核心库 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.13</version>
        </dependency>
        <!-- MySQL 驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.33</version>
        </dependency>
    </dependencies>

      2.创建数据库表
        示例用户表 user: 

CREATE TABLE user (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50),
    age INT,
    email VARCHAR(100)
);

2. 配置文件

  mybatis-config.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?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>
</configuration>

3. 实体类和Mapper接口
  1. 实体类 User.java

    public class User {
        private Integer id;
        private String name;
        private Integer age;
        private String email;
        // Getter和Setter方法省略
    }

      2.Mapper接口 UserMapper.java 

public interface UserMapper {
    User selectUserById(Integer id);
    void insertUser(User user);
    void updateUser(User user);
    void deleteUser(Integer id);
    List<User> selectUsersByCondition(User user);
}

4. XML映射文件

  UserMapper.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">
    <!-- 结果映射 -->
    <resultMap id="userResultMap" type="User">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="age" column="age"/>
        <result property="email" column="email"/>
    </resultMap>

    <!-- 查询用户 -->
    <select id="selectUserById" resultMap="userResultMap">
        SELECT * FROM user WHERE id = #{id}
    </select>

    <!-- 插入用户 -->
    <insert id="insertUser" parameterType="User">
        INSERT INTO user (name, age, email)
        VALUES (#{name}, #{age}, #{email})
    </insert>

    <!-- 更新用户 -->
    <update id="updateUser" parameterType="User">
        UPDATE user
        SET name = #{name}, age = #{age}, email = #{email}
        WHERE id = #{id}
    </update>

    <!-- 删除用户 -->
    <delete id="deleteUser">
        DELETE FROM user WHERE id = #{id}
    </delete>

    <!-- 动态SQL查询 -->
    <select id="selectUsersByCondition" resultMap="userResultMap">
        SELECT * FROM user
        <where>
            <if test="name != null and name != ''">
                AND name LIKE CONCAT('%', #{name}, '%')
            </if>
            <if test="age != null">
                AND age = #{age}
            </if>
        </where>
    </select>
</mapper>

5. 使用MyBatis API执行操作
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;
import java.util.List;

public class MyBatisDemo {
    public static void main(String[] args) throws Exception {
        // 加载配置文件
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        // 获取SqlSession
        try (SqlSession session = sqlSessionFactory.openSession()) {
            // 获取Mapper接口实例
            UserMapper mapper = session.getMapper(UserMapper.class);

            // 插入用户
            User newUser = new User();
            newUser.setName("张三");
            newUser.setAge(25);
            newUser.setEmail("zhangsan@example.com");
            mapper.insertUser(newUser);
            session.commit(); // 提交事务

            // 查询用户
            User user = mapper.selectUserById(1);
            System.out.println("查询结果:" + user);

            // 动态查询
            User condition = new User();
            condition.setName("张");
            List<User> users = mapper.selectUsersByCondition(condition);
            System.out.println("动态查询结果:" + users);

            // 更新用户
            user.setEmail("new_email@example.com");
            mapper.updateUser(user);
            session.commit();

            // 删除用户
            mapper.deleteUser(2);
            session.commit();
        }
    }
}

6. 动态SQL示例解析
  • <where> 标签:自动处理条件前的 AND 或 OR,避免语法错误。

  • <if> 标签:根据条件动态拼接 SQL 片段。

    <select id="selectUsersByCondition" resultMap="userResultMap">
        SELECT * FROM user
        <where>
            <if test="name != null and name != ''">
                AND name LIKE CONCAT('%', #{name}, '%')
            </if>
            <if test="age != null">
                AND age = #{age}
            </if>
        </where>
    </select>


7. 缓存配置
  1. 开启二级缓存
    在 UserMapper.xml 中添加 <cache/> 标签:

    <mapper namespace="com.example.mapper.UserMapper">
        <cache/>
        <!-- 其他SQL配置 -->
    </mapper>

    2.实体类序列化
       确保 User 类实现 Serializable 接口: 

public class User implements Serializable {
    // 属性和方法
}

8. 与Spring集成
  1. 添加MyBatis-Spring依赖

    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.3.0</version>
    </dependency>

     2.配置数据源
       在 application.properties 中配置: 

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=123456

     3.Mapper扫描
        在启动类添加 @MapperScan

@SpringBootApplication
@MapperScan("com.example.mapper")
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

9. 常见问题解决

    1.SQL注入风险

  • 使用 #{} 占位符代替字符串拼接(${})。

    2.字段名与属性名不一致

  • 使用 <resultMap> 显式映射字段和属性。

   3.事务管理

  • 在需要事务的方法上添加 @Transactional 注解。


总结

通过以上步骤,可以掌握MyBatis的基本使用,包括配置、CRUD操作、动态SQL、缓存及与Spring集成。实际开发中应结合具体需求,合理利用MyBatis的灵活性和强大功能,提升数据库操作效率和代码可维护性。


网站公告

今日签到

点亮在社区的每一天
去签到