您好,登录后才能下订单哦!
# MyBatis基础知识点有哪些
## 一、MyBatis概述
### 1.1 什么是MyBatis
MyBatis是一款优秀的**持久层框架**,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集的过程,可以使用简单的XML或注解来配置和映射原生信息,将接口和Java的POJO(Plain Old Java Objects)映射成数据库中的记录。
### 1.2 MyBatis核心特点
- **轻量级**:与Hibernate相比,MyBatis更加轻量,学习成本低
- **SQL可控**:开发者可以直接编写原生SQL,灵活优化
- **结果集自动映射**:自动将查询结果映射到Java对象
- **动态SQL**:支持条件判断、循环等动态SQL语法
- **缓存机制**:提供一级缓存和二级缓存提高性能
## 二、MyBatis核心组件
### 2.1 核心接口和类
| 组件 | 说明 |
|------|------|
| SqlSessionFactory | 全局单例,用于创建SqlSession |
| SqlSession | 代表一次数据库会话,线程不安全 |
| Executor | SQL执行器,负责SQL生成和缓存维护 |
| MappedStatement | 封装SQL语句的输入输出信息 |
| Configuration | 所有配置信息的容器 |
### 2.2 运行流程
1. 加载配置文件创建`SqlSessionFactory`
2. 通过`SqlSessionFactory`创建`SqlSession`
3. 通过`SqlSession`获取Mapper接口代理对象
4. 执行Mapper方法,MyBatis转换为SQL执行
5. 处理结果集并返回
6. 关闭会话
```java
// 典型使用示例
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
try (SqlSession session = sqlSessionFactory.openSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.selectUser(1);
System.out.println(user);
}
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 环境配置 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 映射文件配置 -->
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectUser" resultType="User">
SELECT * FROM user WHERE id = #{id}
</select>
<insert id="insertUser" parameterType="User">
INSERT INTO user(name,age) VALUES(#{name},#{age})
</insert>
</mapper>
元素 | 说明 |
---|---|
select | 查询语句 |
insert | 插入语句 |
update | 更新语句 |
delete | 删除语句 |
sql | 可重用的SQL片段 |
resultMap | 复杂结果集映射 |
<select id="findUsers" parameterType="map" resultType="User">
SELECT * FROM user
<where>
<if test="name != null">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
<foreach item="id" collection="ids" open="AND id IN (" separator="," close=")">
#{id}
</foreach>
</where>
</select>
当数据库列名与Java属性名一致时(如user_name对应userName),MyBatis会自动完成映射。
<resultMap id="userResultMap" type="User">
<id property="id" column="user_id"/>
<result property="username" column="user_name"/>
<result property="password" column="hashed_password"/>
</resultMap>
<resultMap id="blogResultMap" type="Blog">
<association property="author" javaType="Author">
<id property="id" column="author_id"/>
<result property="username" column="author_username"/>
</association>
</resultMap>
<resultMap id="blogWithPosts" type="Blog">
<collection property="posts" ofType="Post">
<id property="id" column="post_id"/>
<result property="title" column="post_title"/>
</collection>
</resultMap>
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
通过拦截器接口Interceptor可以拦截: - Executor (update, query, flushStatements等方法) - ParameterHandler (getParameterObject, setParameters方法) - ResultSetHandler (handleResultSets等方法) - StatementHandler (prepare, parameterize等方法)
@Intercepts({
@Signature(type=Executor.class, method="query",
args={MappedStatement.class,Object.class,RowBounds.class,ResultHandler.class})
})
public class ExamplePlugin implements Interceptor {
// 实现拦截逻辑
}
try(SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH)) {
UserMapper mapper = session.getMapper(UserMapper.class);
for (int i = 0; i < 1000; i++) {
mapper.insertUser(new User(...));
if(i % 500 == 0) {
session.flushStatements();
}
}
session.commit();
}
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath*:mapper/*.xml"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.mapper"/>
</bean>
@Configuration
@MapperScan("com.example.mapper")
public class MyBatisConfig {
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
MyBatis作为半自动化的ORM框架,在SQL可控性和开发效率之间取得了良好平衡。掌握以上基础知识点后,开发者可以: 1. 熟练配置MyBatis环境 2. 编写高效的SQL映射文件 3. 处理复杂对象关系映射 4. 合理使用缓存提升性能 5. 解决常见的开发问题
建议通过实际项目练习来巩固这些知识,并逐步探索MyBatis的更高级特性。 “`
注:本文档约2850字,涵盖了MyBatis的核心知识点。实际使用时可根据需要调整内容深度和示例复杂度。建议配合官方文档(https://mybatis.org/mybatis-3/)一起学习。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。