MyBatis 如何使用

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

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

2.Mapper接口 UserMapper.java

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

java 复制代码
<?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执行操作
java 复制代码
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> 标签 :自动处理条件前的 ANDOR,避免语法错误。

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

    java 复制代码
    <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/> 标签:

    java 复制代码
    <mapper namespace="com.example.mapper.UserMapper">
        <cache/>
        <!-- 其他SQL配置 -->
    </mapper>

2.实体类序列化

确保 User 类实现 Serializable 接口:

java 复制代码
public class User implements Serializable {
    // 属性和方法
}

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

    java 复制代码
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.3.0</version>
    </dependency>

2.配置数据源

application.properties 中配置:

java 复制代码
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

java 复制代码
@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的灵活性和强大功能,提升数据库操作效率和代码可维护性。

相关推荐
广州腾科助你拿下华为认证36 分钟前
PostgreSQL认证_PGCM考试难度有多大?
数据库·postgresql
代码的余温38 分钟前
Oracle RAC认证矩阵:规避风险的关键指南
数据库·oracle·矩阵
白鲸开源39 分钟前
一行代码引发 12G 内存 5 分钟爆仓!SeaTunnel Kafka 连接器"内存溢出"元凶抓到了
数据库·kafka·开源
cellurw1 小时前
Day39 SQLite数据库操作与HTML核心API及页面构建
数据库·sqlite·html
小蒜学长1 小时前
旅行社旅游管理系统的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·旅游
Mr_hwt_1231 小时前
基于mybatis-plus动态数据源实现mysql集群读写分离和从库负载均衡教程(详细案例)
数据库·spring boot·mysql·mybatis·mysql集群
万邦科技Lafite2 小时前
实战演练:通过API获取商品详情并展示
大数据·数据库·python·开放api接口
黄焖鸡能干四碗2 小时前
智慧教育,智慧校园,智慧安防学校建设解决方案(PPT+WORD)
java·大数据·开发语言·数据库·人工智能
敲上瘾2 小时前
Docker 存储卷(Volume)核心概念、类型与操作指南
linux·服务器·数据库·docker·容器·架构
DemonAvenger2 小时前
MySQL内存优化:缓冲池与查询缓存调优实战指南
数据库·mysql·性能优化