Mybatis基础知识点有哪些

发布时间:2021-11-16 15:25:24 作者:iii
来源:亿速云 阅读:105
# 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);
}

三、MyBatis配置详解

3.1 核心配置文件(mybatis-config.xml)

<?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>

3.2 重要配置项

四、SQL映射文件

4.1 基本结构

<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>

4.2 主要元素

元素 说明
select 查询语句
insert 插入语句
update 更新语句
delete 删除语句
sql 可重用的SQL片段
resultMap 复杂结果集映射

五、动态SQL

5.1 常用动态SQL标签

<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>

5.2 主要标签说明

六、结果映射

6.1 自动映射

当数据库列名与Java属性名一致时(如user_name对应userName),MyBatis会自动完成映射。

6.2 手动映射(resultMap)

<resultMap id="userResultMap" type="User">
    <id property="id" column="user_id"/>
    <result property="username" column="user_name"/>
    <result property="password" column="hashed_password"/>
</resultMap>

6.3 高级映射

<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>

七、MyBatis缓存机制

7.1 一级缓存

7.2 二级缓存

八、MyBatis高级特性

8.1 插件开发

通过拦截器接口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 {
    // 实现拦截逻辑
}

8.2 批量操作

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();
}

九、常见问题解决方案

9.1 常见异常处理

  1. BindingException:检查Mapper接口与XML的namespace是否一致
  2. TooManyResultsException:查询返回了多行但接口声明返回单个对象
  3. TypeException:类型转换错误,检查resultType/resultMap配置

9.2 性能优化建议

  1. 合理使用缓存
  2. 批量操作使用Batch执行器
  3. 复杂查询使用存储过程
  4. 避免N+1查询问题

十、MyBatis-Spring整合

10.1 基本配置

<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>

10.2 事务管理

@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/)一起学习。

推荐阅读:
  1. html基础知识点有哪些
  2. InnoDB基础知识点有哪些

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

mybatis

上一篇:MySQL主从复制的详细过程是怎么样的

下一篇:MySQL reload权限是怎么样的

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》