MyBatis基础实战笔记一
一、前言
本次练习基于MyBatis框架实现了User和Person两个实体的CRUD(增删改查)操作,核心围绕MyBatis的核心配置、映射文件、DAO接口设计展开。本文将梳理练习中的核心代码和关键知识点,帮助理解MyBatis的基础使用逻辑。
二、MyBatis核心配置文件(SqlMapConfig.xml)
MyBatis的核心配置文件是整个框架的入口,用于配置环境(数据库连接)、映射器等核心信息,文件名一般约定为SqlMapConfig.xml。
1. 核心配置结构
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>
<!-- 环境配置:配置数据库连接信息,可配置多环境,default指定默认环境 -->
<environments default="mysql">
<environment id="mysql">
<!-- 事务管理器:JDBC类型(使用JDBC原生事务管理) -->
<transactionManager type="JDBC"></transactionManager>
<!-- 数据源:POOLED(使用连接池,性能更优);UNPOOLED(不使用连接池) -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis_demo?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 映射器:配置Mapper.xml文件的路径,MyBatis会加载这些映射文件 -->
<mappers>
<mapper resource="mapper/UserMapper.xml"></mapper>
<mapper resource="mapper/PersonMapper.xml"></mapper>
</mappers>
</configuration>
2. 关键知识点
- DTD约束 :开头的
DOCTYPE声明指定MyBatis配置文件的DTD约束,保证配置格式合法; - 环境(environments) :
default属性指定默认使用的环境ID(如mysql);transactionManager:事务管理器类型,JDBC表示使用JDBC的事务提交/回滚机制;dataSource:数据源类型,POOLED是MyBatis自带的连接池,推荐使用;
- 映射器(mappers) :通过
resource属性指定Mapper.xml文件的类路径(注意路径格式,使用/分隔)。
三、实体类(POJO)编写
实体类对应数据库中的表,字段需与表字段一一对应,同时提供getter/setter方法和toString()方法(方便打印调试)。
1. User实体类示例
java
package com.qcby.entity;
import java.util.Date;
public class User {
// 字段与user表列名对应
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
// getter/setter方法(必须提供,MyBatis通过反射赋值)
public Integer getId() { return id; }
public void setId(Integer id) { this.id = id; }
// 其他字段的getter/setter省略...
// toString():方便控制台打印对象信息
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", birthday=" + birthday +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
'}';
}
}
2. 关键知识点
- 实体类字段名建议与数据库表列名一致(若不一致需配置结果映射);
- 必须提供
getter/setter方法:MyBatis通过反射封装数据时需要; toString()方法:非必需,但便于调试时查看对象内容;- 字段类型建议使用包装类(如
Integer),避免基本类型默认值问题(如int默认0,可能与业务冲突)。
四、DAO层接口设计
DAO(Data Access Object)接口定义数据操作的方法,MyBatis通过「接口+映射文件」的方式实现接口,无需编写实现类。
1. UserDao接口示例
java
package com.qcby.dao;
import com.qcby.entity.User;
import java.util.List;
public interface UserDao {
// 查询所有用户
public List<User> findAll();
// 根据ID查询单个用户
public User findById(Integer id);
// 根据用户名模糊查询
public List<User> findByUsername(String username);
// 新增用户
int insert(User user);
// 修改用户
int update(User user);
// 删除用户
int delete(Integer id);
}
2. 关键知识点
- 接口方法名需与Mapper.xml中标签的
id属性一致; - 返回值类型:
- 查询单个对象返回实体类(如
findById返回User); - 查询多个对象返回
List<实体类>(如findAll); - 增/删/改返回
int:表示受影响的行数;
- 查询单个对象返回实体类(如
- 参数类型:方法参数需与Mapper.xml中标签的
parameterType属性对应。
五、Mapper映射文件编写
Mapper.xml是MyBatis的核心,用于编写SQL语句,建立接口方法与SQL的映射关系,文件名一般与DAO接口对应(如UserDao对应UserMapper.xml)。
1. 核心结构(以UserMapper.xml为例)
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">
<!-- namespace:绑定对应的DAO接口全类名 -->
<mapper namespace="com.qcby.dao.UserDao">
<!-- 查询所有:id对应接口方法名,resultType指定返回值类型(实体类全类名) -->
<select id="findAll" resultType="com.qcby.entity.User">
select * from user order by id desc
</select>
<!-- 根据ID查询:parameterType指定参数类型 -->
<select id="findById" resultType="com.qcby.entity.User" parameterType="java.lang.Integer">
select * from user where id = #{id};
</select>
<!-- 模糊查询:concat拼接%实现模糊匹配 -->
<select id="findByUsername" resultType="com.qcby.entity.User" parameterType="java.lang.String">
select * from user where username like concat('%',#{username},'%');
</select>
<!-- 新增:parameterType指定入参为User实体 -->
<insert id="insert" parameterType="com.qcby.entity.User">
insert into user(username, birthday, sex, address)
values(#{username}, #{birthday}, #{sex}, #{address});
</insert>
<!-- 修改 -->
<update id="update" parameterType="com.qcby.entity.User">
update user set username = #{username}, birthday = #{birthday}, sex = #{sex}, address = #{address}
where id = #{id};
</update>
<!-- 删除 -->
<delete id="delete" parameterType="java.lang.Integer">
delete from user where id = #{id};
</delete>
</mapper>
2. 关键知识点
- namespace:必须是对应DAO接口的全类名,MyBatis通过该属性绑定接口与映射文件;
- 标签类型 :
<select>:查询语句,必须指定resultType(返回值类型);<insert>/<update>/<delete>:增/改/删语句,可选parameterType(参数类型);
- 参数占位符 :
#{参数名}:MyBatis会自动处理参数类型,防止SQL注入; - 模糊查询 :MySQL中使用
concat('%', #{参数}, '%')拼接通配符(避免直接写%#{参数}%,可能引发SQL注入); - 参数类型(parameterType) :
- 基本类型/字符串:可写全类名(如
java.lang.Integer)或别名(如int); - 实体类:写实体类全类名,MyBatis会通过
getter方法获取属性值;
- 基本类型/字符串:可写全类名(如
- 返回类型(resultType):查询语句必须指定,值为实体类全类名,MyBatis会自动将查询结果封装为实体对象。
六、常见问题与注意事项
- Mapper.xml文件路径 :SqlMapConfig.xml中
mapper resource的路径是类路径(resources下),如mapper/UserMapper.xml表示resources/mapper/UserMapper.xml; - 字段名与实体类属性名不一致 :需使用
<resultMap>配置结果映射(本次练习未涉及,后续可补充); - 数据库连接参数 :注意MySQL驱动版本(8.x版本驱动类是
com.mysql.cj.jdbc.Driver,5.x是com.mysql.jdbc.Driver),URL需指定serverTimezone(时区); - 方法名与id不一致:MyBatis会抛出「绑定异常」,需保证接口方法名 = Mapper标签id;
- 模糊查询的写法 :不要直接写
like '%${username}%',${}是字符串拼接,有SQL注入风险,优先使用concat。
七、总结
本次练习通过User和Person两个实体的CRUD实现,覆盖了MyBatis的核心使用流程:
- 编写核心配置文件(数据库连接、映射器);
- 定义实体类(与数据库表对应);
- 设计DAO接口(定义数据操作方法);
- 编写Mapper.xml(绑定接口、编写SQL)。
MyBatis的核心思想是「ORM(对象关系映射)」+「SQL解耦」,通过映射文件将SQL与Java代码分离,既保留了SQL的灵活性,又简化了数据操作的代码编写。后续可进一步学习结果映射、动态SQL、分页、注解开发等进阶知识点。