本文目录导读:

- 项目结构
- Maven依赖(pom.xml)
- 数据库建表(schema.sql)
- MyBatis核心配置文件(mybatis-config.xml)
- 数据库配置文件(db.properties)
- 实体类(User)
- Mapper接口
- Mapper映射文件(UserMapper.xml)
- 测试类
- 运行测试
- 常用配置技巧
我来给你一个完整的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 >= #{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);
}
}
}
运行测试
直接运行 MyBatisDemo 的 main 方法即可看到完整的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的核心概念和使用方式。