MyBatis入门案例

wen java案例 2

本文目录导读:

MyBatis入门案例

  1. 项目结构
  2. Maven依赖(pom.xml)
  3. 数据库建表(schema.sql)
  4. MyBatis核心配置文件(mybatis-config.xml)
  5. 数据库配置文件(db.properties)
  6. 实体类(User)
  7. Mapper接口
  8. Mapper映射文件(UserMapper.xml)
  9. 测试类
  10. 运行测试
  11. 常用配置技巧

我来给你一个完整的MyBatis入门案例,从环境搭建到基本CRUD操作,手把手带你上手。

项目结构

mybatis-demo
├── pom.xml
├── src
│   └── main
│       ├── java
│       │   ├── com
│       │   │   └── example
│       │   │       ├── mapper
│       │   │       │   └── UserMapper.java
│       │   │       ├── pojo
│       │   │       │   └── User.java
│       │   │       └── MyBatisDemo.java
│       │   └── resources
│       │       ├── mybatis-config.xml
│       │       └── mapper
│       │           └── UserMapper.xml
│       └── db
│           └── schema.sql

Maven依赖(pom.xml)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
         http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>mybatis-demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <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>
        <!-- JUnit测试 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>
        <!-- Lombok(简化实体类) -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.30</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
</project>

数据库建表(schema.sql)

-- 创建数据库
CREATE DATABASE IF NOT EXISTS mybatis_demo DEFAULT CHARACTER SET utf8mb4;
USE mybatis_demo;
-- 创建用户表
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `username` VARCHAR(50) NOT NULL COMMENT '用户名',
    `password` VARCHAR(100) NOT NULL COMMENT '密码',
    `email` VARCHAR(100) DEFAULT NULL COMMENT '邮箱',
    `age` INT(3) DEFAULT NULL COMMENT '年龄',
    `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
-- 插入测试数据
INSERT INTO `user` (`username`, `password`, `email`, `age`) VALUES
('张三', '123456', 'zhangsan@example.com', 25),
('李四', 'abcdef', 'lisi@example.com', 28),
('王五', 'qwerty', 'wangwu@example.com', 22);

MyBatis核心配置文件(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>
    <!-- 引入外部数据库配置文件 -->
    <properties resource="db.properties"/>
    <!-- 设置日志实现 -->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    <!-- 配置类型别名 -->
    <typeAliases>
        <package name="com.example.pojo"/>
    </typeAliases>
    <!-- 配置数据库连接环境 -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <!-- 注册Mapper映射文件 -->
    <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>
</configuration>

数据库配置文件(db.properties)

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis_demo?useSSL=false&serverTimezone=UTC&characterEncoding=utf8mb4
jdbc.username=root
jdbc.password=root

实体类(User)

package com.example.pojo;
import lombok.Data;
import java.util.Date;
@Data
public class User {
    private Integer id;
    private String username;
    private String password;
    private String email;
    private Integer age;
    private Date createTime;
}

Mapper接口

package com.example.mapper;
import com.example.pojo.User;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface UserMapper {
    // 查询所有用户
    List<User> findAll();
    // 根据ID查询用户
    User findById(@Param("id") Integer id);
    // 插入用户
    int insert(User user);
    // 更新用户
    int update(User user);
    // 删除用户
    int delete(@Param("id") Integer id);
    // 条件查询(动态SQL)
    List<User> findByCondition(User user);
}

Mapper映射文件(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="username" column="username"/>
        <result property="password" column="password"/>
        <result property="email" column="email"/>
        <result property="age" column="age"/>
        <result property="createTime" column="create_time"/>
    </resultMap>
    <!-- 查询所有用户 -->
    <select id="findAll" resultMap="userResultMap">
        SELECT * FROM user
    </select>
    <!-- 根据ID查询用户 -->
    <select id="findById" resultMap="userResultMap" parameterType="int">
        SELECT * FROM user WHERE id = #{id}
    </select>
    <!-- 插入用户 -->
    <insert id="insert" parameterType="User" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO user (username, password, email, age)
        VALUES (#{username}, #{password}, #{email}, #{age})
    </insert>
    <!-- 更新用户 -->
    <update id="update" parameterType="User">
        UPDATE user
        <set>
            <if test="username != null">username = #{username},</if>
            <if test="password != null">password = #{password},</if>
            <if test="email != null">email = #{email},</if>
            <if test="age != null">age = #{age},</if>
        </set>
        WHERE id = #{id}
    </update>
    <!-- 删除用户 -->
    <delete id="delete" parameterType="int">
        DELETE FROM user WHERE id = #{id}
    </delete>
    <!-- 条件查询(动态SQL) -->
    <select id="findByCondition" resultMap="userResultMap" parameterType="User">
        SELECT * FROM user
        <where>
            <if test="username != null and username != ''">
                AND username LIKE CONCAT('%', #{username}, '%')
            </if>
            <if test="age != null">
                AND age &gt;= #{age}
            </if>
            <if test="email != null and email != ''">
                AND email = #{email}
            </if>
        </where>
    </select>
</mapper>

测试类

package com.example;
import com.example.mapper.UserMapper;
import com.example.pojo.User;
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.IOException;
import java.io.InputStream;
import java.util.List;
public class MyBatisDemo {
    private static SqlSessionFactory sqlSessionFactory;
    static {
        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        testFindAll();
        testFindById();
        testInsert();
        testUpdate();
        testDelete();
        testFindByCondition();
    }
    // 查询所有用户
    public static void testFindAll() {
        try (SqlSession session = sqlSessionFactory.openSession()) {
            UserMapper mapper = session.getMapper(UserMapper.class);
            List<User> users = mapper.findAll();
            System.out.println("=== 查询所有用户 ===");
            users.forEach(System.out::println);
        }
    }
    // 根据ID查询用户
    public static void testFindById() {
        try (SqlSession session = sqlSessionFactory.openSession()) {
            UserMapper mapper = session.getMapper(UserMapper.class);
            User user = mapper.findById(1);
            System.out.println("=== 根据ID查询用户 ===");
            System.out.println(user);
        }
    }
    // 插入用户
    public static void testInsert() {
        try (SqlSession session = sqlSessionFactory.openSession(true)) {
            UserMapper mapper = session.getMapper(UserMapper.class);
            User user = new User();
            user.setUsername("赵六");
            user.setPassword("123456");
            user.setEmail("zhaoliu@example.com");
            user.setAge(30);
            int result = mapper.insert(user);
            System.out.println("=== 插入用户 ===");
            System.out.println("影响行数:" + result);
            System.out.println("生成的主键ID:" + user.getId());
        }
    }
    // 更新用户
    public static void testUpdate() {
        try (SqlSession session = sqlSessionFactory.openSession(true)) {
            UserMapper mapper = session.getMapper(UserMapper.class);
            User user = new User();
            user.setId(1);
            user.setAge(26); // 只更新年龄
            int result = mapper.update(user);
            System.out.println("=== 更新用户 ===");
            System.out.println("影响行数:" + result);
            // 查询更新后的数据
            User updatedUser = mapper.findById(1);
            System.out.println("更新后的用户信息:" + updatedUser);
        }
    }
    // 删除用户
    public static void testDelete() {
        try (SqlSession session = sqlSessionFactory.openSession(true)) {
            UserMapper mapper = session.getMapper(UserMapper.class);
            int result = mapper.delete(4);
            System.out.println("=== 删除用户 ===");
            System.out.println("影响行数:" + result);
        }
    }
    // 条件查询(动态SQL)
    public static void testFindByCondition() {
        try (SqlSession session = sqlSessionFactory.openSession()) {
            UserMapper mapper = session.getMapper(UserMapper.class);
            User condition = new User();
            condition.setAge(25); // 查询年龄大于等于25的用户
            List<User> users = mapper.findByCondition(condition);
            System.out.println("=== 条件查询 ===");
            users.forEach(System.out::println);
        }
    }
}

运行测试

直接运行 MyBatisDemomain 方法即可看到完整的CRUD操作效果。

常用配置技巧

分页插件集成(可选)

<!-- 添加依赖 -->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.3.2</version>
</dependency>
<!-- MyBatis配置文件中添加 -->
<plugins>
    <plugin interceptor="com.github.pagehelper.PageInterceptor">
        <property name="helperDialect" value="mysql"/>
        <property name="reasonable" value="true"/>
    </plugin>
</plugins>

使用注解方式(简化配置)

public interface UserMapper {
    @Select("SELECT * FROM user")
    @Results({
        @Result(id = true, property = "id", column = "id"),
        @Result(property = "username", column = "username"),
        @Result(property = "email", column = "email"),
        @Result(property = "age", column = "age"),
        @Result(property = "createTime", column = "create_time")
    })
    List<User> findAllByAnnotation();
    @Insert("INSERT INTO user(username, password, email, age) VALUES(#{username}, #{password}, #{email}, #{age})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    int insertUser(User user);
    @Update("UPDATE user SET age = #{age} WHERE id = #{id}")
    int updateAge(@Param("id") Integer id, @Param("age") Integer age);
    @Delete("DELETE FROM user WHERE id = #{id}")
    int deleteById(@Param("id") Integer id);
}

这就是一个完整的MyBatis入门案例,从环境搭建到基本的CRUD操作都包含了,建议你按照这个流程实际操作一遍,这能帮助你更好地理解MyBatis的核心概念和使用方式。

抱歉,评论功能暂时关闭!