目录
一、什么是 MyBatis?为什么要用它?
二、MyBatis 核心概念(通俗理解)
1.SqlSessionFactory
2.SqlSession
3.Mapper接口
4.映射文件(XML)
三、手把手搭建第一个 MyBatis 项目
1. 准备工作
2. 核心配置文件(mybatis-config.xml)
3. 编写实体类(User.java)
4. 编写 Mapper 接口(UserMapper.java)
5. 编写映射文件(UserMapper.xml)
6. 编写测试类(MyBatisTest.java)
四、核心知识点总结
1.参数传递
2.结果映射
一、什么是 MyBatis?为什么要用它?
MyBatis 是一款 Java 半自动化映射框架,核心作用是简化数据库操作。
对比传统 JDBC:
- 无需手动写 Connection、Statement、ResultSet 等重复代码 SQL 语句,减少了50%以上的代码量。
- 与 Java 代码分离,便于维护和优化 自动完成数据库字段与 Java 实体类的映射。
- 提供映射标签,支持对象与数据库的 ORM 字段关系映射。
简单说:用 MyBatis 写数据库操作,更简单、更灵活
二、MyBatis 核心概念(通俗理解)
1.SqlSessionFactory
- 数据库连接的 “工厂”,通过核心配置文件创建
- 作用:生产SqlSession(类似生产 “数据库连接”,同样也需要关闭资源)
2.SqlSession
- 数据库会话对象,相当于“数据库连接”
- 作用:获取Mapper接口,执行SQL操作
3.Mapper接口
- 定义数据库操作方法(如 selectUserById、insertUser)
- 无需实现类,MyBatis 会自动生成代理对象
4.映射文件(XML)
- 存放 SQL 语句,与 Mapper 接口一一对应
- 通过标签(select/insert 等)绑定接口方法
三、手把手搭建第一个 MyBatis 项目
1. 准备工作
数据库:MySQL,创建 user 表(附建表 SQL):
CREATE TABLE `user` (
`id` int(11) PRIMARY KEY AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`age` int(3) DEFAULT NULL,
`create_time` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
项目:Maven 工程,引入依赖(pom.xml):
<!– MyBatis 核心包 –>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.10</version>
</dependency>
<!– MySQL 驱动 –>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
2. 核心配置文件(mybatis-config.xml)
放在 resources 目录下,配置数据库连接和映射文件路径:
<?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">
<!– 事务管理:JDBC 方式 –>
<transactionManager type="JDBC"/>
<!– 数据源:连接池方式 –>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis_demo?useSSL=false"/>
<property name="username" value="root"/> <!– 你的数据库用户名 –>
<property name="password" value="123456"/> <!– 你的数据库密码 –>
</dataSource>
</environment>
</environments>
<!– 映射文件路径:指定 Mapper XML 位置 –>
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>
3. 编写实体类(User.java)
属性与表字段对应(建议用驼峰命名,如 createTime 对应表 create_time):
public class User {
private Integer id;
private String username;
private Integer age;
private LocalDateTime createTime;
// 省略 getter、setter、toString 方法
}
4. 编写 Mapper 接口(UserMapper.java)
定义数据库操作方法:
public interface UserMapper {
//查询所有用户
List<User> selectAllUser();
// 根据 ID 查询用户
User selectById(Integer id);
// 新增用户
int insert(User user);
// 根据 ID 修改用户
int updateById(User user);
// 根据 ID 删除用户
int deleteById(Integer id);
}
5. 编写映射文件(UserMapper.xml)
放在 resources/mapper 目录下,绑定 Mapper 接口并写 SQL:
<?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">
<!– namespace 必须与 Mapper 接口全类名一致 –>
<mapper namespace="com.example.mapper.UserMapper">
<!– 查询:id 与接口方法名一致,resultType 是返回类型 –>
<select id="selectById" resultType="com.example.pojo.User">
select * from user where id = #{id}
</select>
<!– 新增:useGeneratedKeys 获取自增主键,keyProperty 绑定实体类属性 –>
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
insert into user(username, age, create_time)
values(#{username}, #{age}, #{createTime})
</insert>
<!– 修改 –>
<update id="updateById">
update user set
username = #{username},
age = #{age}
where id = #{id}
</update>
<!– 删除 –>
<delete id="deleteById">
delete from user where id = #{id}
</delete>
</mapper>
#{}是一种常见的占位符语法, 用于将变量或表达式的结果嵌入到双引号/单引号字符串中,自动转换为字符串类型。(能够有效防止sql注入问题)
6. 编写测试类(MyBatisTest.java)
通过SqlSession执行操作:
public class MyBatisTest {
public static void main(String[] args) throws IOException {
// 1. 读取核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
// 2. 创建 SqlSessionFactory
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
// 3. 获取 SqlSession(true 表示自动提交事务)
SqlSession session = factory.openSession(true);
// 4. 获取 Mapper 接口代理对象
UserMapper userMapper = session.getMapper(UserMapper.class);
// 5. 执行 SQL 操作
// 新增用户
User user = new User();
user.setUsername("张三");
user.setAge(20);
user.setCreateTime(LocalDateTime.now());
int insert = userMapper.insert(user);
System.out.println("新增成功,影响行数:" + insert);
System.out.println("新增的用户 ID:" + user.getId()); // 自增 ID 会回显
// 查询用户(用上面新增的 ID)
User queryUser = userMapper.selectById(user.getId());
System.out.println("查询结果:" + queryUser);
// 修改用户
queryUser.setAge(21);
int update = userMapper.updateById(queryUser);
System.out.println("修改成功,影响行数:" + update);
// 删除用户
int delete = userMapper.deleteById(user.getId());
System.out.println("删除成功,影响行数:" + delete);
// 6. 关闭会话
session.close();
}
}
四、核心知识点总结
1.参数传递
- 单个参数:直接用 #{参数名}(如 #{id})
- 多个参数:有两种方法:(1)传入参数时放入Map键值对,通过键名访问值,达到传入多个参数的目的;(2)传入参数时将要传入的值封装到实体类中,通过访问实体类属性名传入多个参数
- 实体类参数:用 #{属性名}(如 #{username} 对应 user.getUsername())
2.结果映射
- 表字段与实体属性名一致:用 resultType 直接指定实体类
- 符合Mybatis定义映射规则:用 resultType 直接指定实体类,并且在mybatis-config.xml里面配置驼峰映射
- 不一致:用 resultMap 手动映射
<settings>
<!–将数据库中的下划线映射为驼峰–>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
位置放于mybatis-config.xml中<environments>前
<resultMap id="userMap" type="com.example.pojo.User">
<id column="id" property="id"/> <!– 主键 –>
<result column="username" property="username"/>
<result column="age" property="age"/>
<result column="create_time" property="createTime"/> <!– 字段与属性映射 –>
</resultMap>
评论前必须登录!
注册