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("[email protected]");
            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("[email protected]");
            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的灵活性和强大功能,提升数据库操作效率和代码可维护性。

相关推荐
小Tomkk8 分钟前
阿里云 RDS mysql 5.7 怎么 添加白名单 并链接数据库
数据库·mysql·阿里云
明月醉窗台1 小时前
qt使用笔记二:main.cpp详解
数据库·笔记·qt
沉到海底去吧Go2 小时前
【图片自动识别改名】识别图片中的文字并批量改名的工具,根据文字对图片批量改名,基于QT和腾讯OCR识别的实现方案
数据库·qt·ocr·图片识别自动改名·图片区域识别改名·pdf识别改名
老纪的技术唠嗑局2 小时前
重剑无锋,大巧不工 —— OceanBase 中的 Nest Loop Join 使用技巧分享
数据库·sql
BillKu2 小时前
Java + Spring Boot + Mybatis 插入数据后,获取自增 id 的方法
java·tomcat·mybatis
未来之窗软件服务2 小时前
JAVASCRIPT 前端数据库-V6--仙盟数据库架构-—-—仙盟创梦IDE
数据库·数据库架构·仙盟创梦ide·东方仙盟·东方仙盟数据库
一只爱撸猫的程序猿4 小时前
构建一个简单的智能文档问答系统实例
数据库·spring boot·aigc
nanzhuhe4 小时前
sql中group by使用场景
数据库·sql·数据挖掘
消失在人海中4 小时前
oracle sql 语句 优化方法
数据库·sql·oracle
Clang's Blog4 小时前
一键搭建 WordPress + MySQL + phpMyAdmin 环境(支持 PHP 版本选择 & 自定义配置)
数据库·mysql·php·wordpr