MyBatis 快速开始
本节用"原生方式"跑通第一个 MyBatis 程序:不借助 Spring,直接用 SqlSessionFactoryBuilder 构建 SqlSessionFactory,再用 SqlSession 对一张 user 表做增删改查,先看清 MyBatis 最底层的运行链路。
1. 添加依赖
在 pom.xml 引入 mybatis(主线 3.5.x,要求 Java 8+,小版本以官方文档为准)与数据库驱动(MySQL 用 com.mysql:mysql-connector-j):
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.x</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.x</version>
</dependency>
2. 建表与实体类
准备 user 表和对应 POJO(getter/setter 省略,IDE 可生成):
CREATE TABLE `user` (
`id` INT PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL,
`age` INT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
public class User {
private Integer id;
private String name;
private Integer age;
// 省略 getter/setter(IDE 可自动生成)
}
3. 全局配置 mybatis-config.xml
放在 classpath 根目录(src/main/resources/mybatis-config.xml):environments 定义连接环境,mappers 注册映射文件。
<configuration>
<environments default="dev">
<environment id="dev">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/demo"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>
4. 编写 Mapper XML
每条语句用对应标签声明,namespace 唯一命名整组语句;#{id} 是预编译占位符,按参数属性取值(详见第 5 章)。
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectById" resultType="com.example.entity.User">
SELECT id, name, age FROM user WHERE id = #{id}
</select>
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
INSERT INTO user(name, age) VALUES(#{name}, #{age})
</insert>
<update id="update">UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}</update>
<delete id="delete">DELETE FROM user WHERE id = #{id}</delete>
</mapper>
5. 用 Java 代码执行 CRUD
下面是一个完整类(User 放在 com.example.entity 包;运行前补上 import:org.apache.ibatis.io.Resources、org.apache.ibatis.session.*):
public class QuickStart {
public static void main(String[] args) throws Exception {
// 1) 构建 SqlSessionFactory:整个应用只建一次,应做成单例
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
// 2) 每次"一批操作"开一个 SqlSession;true 表示自动提交
try (SqlSession session = factory.openSession(true)) {
// 查询:语句全名 = namespace + "." + id
User u = session.selectOne("com.example.mapper.UserMapper.selectById", 1);
System.out.println(u.getName()); // 输出:张三
// 新增:useGeneratedKeys 把自增主键写回对象的 id 字段
User nu = new User();
nu.setName("李四");
nu.setAge(20);
session.insert("com.example.mapper.UserMapper.insert", nu);
System.out.println(nu.getId()); // 输出:2
nu.setName("李四改"); // 修改与删除
session.update("com.example.mapper.UserMapper.update", nu);
session.delete("com.example.mapper.UserMapper.delete", 2);
} // try 结束自动 close,连接归还连接池
}
}
运行 main 即可看到日志中的多次 SQL,增删改查全部生效。
小结
原生方式 = mybatis-config.xml + Mapper XML + SqlSessionFactory + SqlSession,四步跑通 CRUD。执行链路上:Builder 解析 XML 生成语句对象 → openSession 拿连接 → 语句执行时预编译 SQL、绑定参数、映射结果 → close 归还连接。后续章节逐个深入这些部件。