spring 依赖 mybatis使用流程
什么是mybatis
java生态中得半自动ORM框架,设计理念:sql与代码分离,开发者手动写sql并保持对查询的完全控制,框架负责繁琐的jdbc查询和结果映射
核心组件:
sqlSessionFactory:全局唯一,解析配置文件(数据源,mapper,插件),创建sqlSession
sqlSession:线程不安全,代表一次数据库会话,执行sql的入口
Mapperj接口:定义方法,与xml注解sql绑定,由jdk动态代理生成实现类
Configuration:全局配置对象,缓存所有的Mapper语句,类处理器,插件链
Exceutor:sql执行器,封装jdbc操作,支持简单/宠用/批量三种模式
TypeHandler:类型转换器,处理java类型与jdbc类型的映射
使用方式:在mapper.xml里手动编写sql查询语句,然后在service层里调用userMapper进行数据操作
第一步:引入依赖
<!-- Spring Boot 项目 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
<!-- 数据库驱动 -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
<!-- 连接池(Spring Boot 默认已集成 HikariCP,无需额外引入) -->
第二步:在xml里配置数据源(mybatis支持多数据源,可以自己写一个配置类实现数据库源的切换)也可以自己编写mybatis-confige.xml,springboot默认从yml读取,如果使用mybatis-plus则需要修改对应的mybatis-confige.xml去执行一些事情(比如使用插件的时候是否生成对象)
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
hikari:
maximum-pool-size: 10
minimum-idle: 5
# MyBatis 专属配置
mybatis:
mapper-locations: classpath:mapper/*.xml # XML 映射文件路径
type-aliases-package: com.example.entity # 实体类别名包(可选,简化 XML 中全限定名)
configuration:
map-underscore-to-camel-case: true # 自动驼峰转换(下划线列名 → 驼峰字段)
cache-enabled: true # 二级缓存开关
lazy-loading-enabled: true # 延迟加载
根据数据库表的字段信息创建java实体类
@Data
public class User {
private Long id;
private String userName; // 对应数据库 user_name(配合 map-underscore-to-camel-case)
private String email;
private LocalDateTime createTime;
}
创建好对应的mapper接口和对应的mapper.xml映射文件(后序的sql查询语句都是在这里写的
@Mapper // Spring Boot 需标记,或在启动类加 @MapperScan("com.example.mapper")
public interface UserMapper {
// 注解方式(简单 SQL)
@Select("SELECT * FROM t_user WHERE id = #{id}")
User selectById(Long id);
// XML 方式(复杂 SQL,需在 XML 中实现同名方法)
List<User> selectByCondition(@Param("userName") String userName,
@Param("status") Integer status);
int insert(User user);
int update(User user);
int deleteById(Long id);
}
对应的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="com.example.entity.User">
<id property="id" column="id"/>
<result property="userName" column="user_name"/>
</resultMap>
<!-- 动态 SQL 查询 -->
<select id="selectByCondition" resultMap="userResultMap">
SELECT * FROM t_user
<where>
<if test="userName != null and userName != ''">
AND user_name LIKE CONCAT('%', #{userName}, '%')
</if>
<if test="status != null">
AND status = #{status}
</if>
</where>
</select>
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
INSERT INTO t_user (user_name, email, create_time)
VALUES (#{userName}, #{email}, #{createTime})
</insert>
</mapper>
在启动配置类里要加上注解MapperScan("对应的xml映射文件")
然后在service层进行使用
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
@Transactional
public User getUser(Long id) {
return userMapper.selectById(id);
}
}
注意:上述是基于spring boot的配置,如果采用原生spring框架进行开发,需要对手动创建mybatis-confige.xml,并且要额外增加config配置类实现数据源的读取和sqlfacotry的基本配置
需要分页操作的时候也需要进行额外config配置类实现
{} 和 ${} 是 MyBatis 中两种完全不同的占位符,核心区别在于预编译处理 vs 字符串拼接,这直接决定了安全性、性能和适用场景
一般采用 #{} 可以防止sql注入,
除了使用xml配置查询以外也可以使用使用注解进行查询,具体查询规则直接看官网/博客学习
执行流程:
业务层调用
↓
userMapper.findById(1L)
↓
【JDK 动态代理】MapperProxy.invoke()
↓
构造 statementId = "com.example.mapper.UserMapper.findById"
↓
【Configuration】查找 MappedStatement(解析时从 XML 加载)
↓
【参数处理】ParamNameResolver 解析 @Param("id") → 封装为 Map{id=1L}
↓
【SqlSession】selectOne(statementId, {id=1L})
↓
【Executor】执行 JDBC:SELECT ... FROM t_user WHERE id = ?
↓
【ResultSetHandler】按 BaseResultMap 映射列到对象属性
↓
返回 UserDO 实例
浙公网安备 33010602011771号