后端方向进阶——Mybatis框架

各位帅哥美女,编辑不易,动动发财小手,来个三连加关注,后续会有更加优秀的推文推出~

学会编写基本的mapper对数据进行CRUD操作,掌握一对多和多对一的关系,会编写动态SQL(工作中编写mapper对数据的查询操作较多,特别是对多表进行查询操作能极大的提高效率,一定要掌握)

目录

1. 介绍MyBatis

2. MyBatis核心概念

2.1 映射文件(Mapper XML)

2.2 数据模型(Model)

2.3 映射接口(Mapper Interface)

2.4 配置文件

3. MyBatis基本用法

3.1 配置文件加载

3.2映射文件

3.3. 数据模型

3.4. 配置文件加载

3.5 获取Mapper对象

3.6 执行SQL语句

3.7 提交事务

3.8 关闭SqlSession

4. 参数传递与结果映射

4.1 参数传递

4.2 结果映射

5. 动态SQL

6. MyBatis插件

7. MyBatis与Spring集成

8. 缓存机制

9. 动态代理

10. 总结


1. 介绍MyBatis

MyBatis 是一个开源的持久层框架,它简化了数据库操作和SQL语句的处理。相较于传统的JDBC,MyBatis更加灵活,并提供了一种将Java对象和数据库中的数据进行映射的方式。

2. MyBatis核心概念

2.1 映射文件(Mapper XML)

MyBatis通过映射文件定义了SQL语句以及将数据库字段映射到Java对象的规则。一个典型的Mapper XML文件包含了数据库表的各种操作,如查询、插入、更新、删除等。

<!-- UserMapper.xml -->
<mapper namespace="com.example.mapper.UserMapper">
    <select id="getUserById" parameterType="int" resultType="com.example.model.User">
        SELECT * FROM users WHERE id = #{id}
    </select>
</mapper>

2.2 数据模型(Model)

数据模型是Java对象,用于映射数据库表中的数据。在MyBatis中,模型对象的字段和数据库表的列一一对应。

// User.java
public class User {
    private int id;
    private String username;
    private String email;
    // 省略getter和setter方法
}

2.3 映射接口(Mapper Interface)

映射接口定义了数据库操作的方法,通过注解或XML方式指定SQL语句。MyBatis会动态生成接口的实现类。

// UserMapper.java
public interface UserMapper {
    User getUserById(int id);
}

2.4 配置文件

MyBatis的配置文件包含了框架的全局配置信息,如数据库连接、映射文件的位置、插件等。

<!-- mybatis-config.xml -->
<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/mydatabase"/>
                <property name="username" value="username"/>
                <property name="password" value="password"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/example/mapper/UserMapper.xml"/>
    </mappers>
</configuration>

3. MyBatis基本用法

3.1 配置文件加载

首先,需要创建 MyBatis 的配置文件,通常是一个 XML 文件,其中包含数据库连接信息、映射文件的位置等配置。

InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

3.2映射文件

映射文件定义了 SQL 语句和 Java 对象之间的映射关系。每个映射文件对应一个数据模型(Java 对象)。

<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.example.mapper.UserMapper">
    <!-- 查询用户信息 -->
    <select id="getUserById" parameterType="int" resultType="com.example.model.User">
        SELECT * FROM users WHERE id = #{id}
    </select>
</mapper>

3.3. 数据模型

数据模型是 Java 对象,用于映射数据库表中的数据。

public class User {
    private int id;
    private String username;
    private String email;
    // 省略 getter 和 setter 方法
}

3.4. 配置文件加载

在代码中加载 MyBatis 的配置文件,构建 SqlSessionFactory

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

public class MyBatisExample {
    public static void main(String[] args) {
        try {
            // 加载 MyBatis 配置文件
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);

            // 构建 SqlSessionFactory
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

            // 使用 SqlSessionFactory 创建 SqlSession
            // TODO: 进行数据库操作...

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3.5 获取Mapper对象

SqlSession 中获取映射器(Mapper)对象,用于执行 SQL 语句。

UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

3.6 执行SQL语句

通过映射器对象执行 SQL 语句。

User user = userMapper.getUserById(1);

3.7 提交事务

在进行数据库操作后,需要提交事务并关闭 SqlSession

sqlSession.commit();

3.8 关闭SqlSession

sqlSession.close();

4. 参数传递与结果映射

4.1 参数传递

MyBatis支持多种参数传递方式,包括基本类型、POJO对象、Map等。

<!-- UserMapper.xml -->
<select id="getUserByUsernameAndEmail" parameterType="map" resultType="com.example.model.User">
    SELECT * FROM users WHERE username = #{username} AND email = #{email}
</select>

4.2 结果映射

MyBatis可以将查询结果映射到Java对象,支持自动映射和手动映射。

<!-- UserMapper.xml -->
<select id="getUserById" parameterType="int" resultType="com.example.model.User">
    SELECT * FROM users WHERE id = #{id}
</select>

5. 动态SQL

MyBatis提供了强大的动态SQL功能,可以根据条件动态生成SQL语句。

<!-- UserMapper.xml -->
<select id="getUserByCondition" parameterType="map" resultType="com.example.model.User">
    SELECT * FROM users
    <where>
        <if test="username != null">AND username = #{username}</if>
        <if test="email != null">AND email = #{email}</if>
    </where>
</select>
// UserMapper.java
User getUserByCondition(Map<String, String> condition);

6. MyBatis插件

MyBatis允许通过插件方式扩展其功能,例如自定义拦截器。

// MyPlugin.java
@Intercepts({
    @Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})
})
public class MyPlugin implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        // 在方法执行前进行拦截处理
        return invocation.proceed();
    }

    @Override
    public Object plugin(Object target) {
        // 包装目标对象,返回一个代理对象
        return Plugin.wrap(target, this);
    }

    @Override
    public void setProperties(Properties properties) {
        // 设置插件的属性
    }
}

7. MyBatis与Spring集成

MyBatis可以与Spring框架集成,通过Spring提供的事务管理等功能简化开发流程。

<!-- applicationContext.xml -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/mydatabase"/>
    <property name="username" value="username"/>
    <property name="password" value="password"/>
</bean>

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>

<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
    <constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>

<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
    <property name="mapperInterface" value="com.example.mapper.UserMapper"/>
    <property name="sqlSessionTemplate" ref="sqlSessionTemplate"/>
</bean>

8. 缓存机制

MyBatis提供了一级缓存和二级缓存机制,可以提高查询性能。

<!-- UserMapper.xml -->
<select id="getUserById" parameterType="int" resultType="com.example.model.User" useCache="true">
    SELECT * FROM users WHERE id = #{id}
</select>

9. 动态代理

MyBatis使用动态代理技术生成Mapper接口的实现类。

// UserMapperProxy.java
public class UserMapperProxy implements InvocationHandler {
    private SqlSession sqlSession;

    public UserMapperProxy(SqlSession sqlSession) {
        this.sqlSession = sqlSession;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 通过动态代理调用SqlSession的方法
        return sqlSession.selectOne(method.getDeclaringClass().getName() + "." + method.getName(), args[0]);
    }
}

10. 总结

MyBatis作为一款优秀的持久层框架,提供了丰富的功能和灵活的配置,使得Java开发者能够更轻松地与数据库进行交互。从基本的配置、映射到高级的动态SQL、插件和缓存机制,本篇博客对MyBatis的技术全面介绍。希望读者通过学习MyBatis,能够更加高效地进行数据库访问,提升项目的开发效率。

  • 20
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小羊一定要努力变强

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值