为了账号安全,请及时绑定邮箱和手机立即绑定

Mybatis持久层框架入门教程

标签:
Java SSM 数据库
概述

Mybatis持久层框架是一种强大的数据库操作工具,它简化了Java程序员的数据库交互过程,通过配置文件或注解管理SQL语句。Mybatis框架支持灵活的SQL映射和强大的对象关系映射,显著提高查询效率并提供轻量级的数据库操作体验。

Mybatis持久层框架入门教程
Mybatis简介

Mybatis是什么

Mybatis是一个强大的持久层框架,简化了数据库操作,使得Java程序员可以方便地访问数据库,避免了传统JDBC编程中大量重复的代码。Mybatis通过配置文件(通常是XML配置文件)或注解来管理数据库的交互,实现了SQL语句与程序代码的分离。

Mybatis与JDBC的区别

Mybatis与JDBC的主要区别在于处理数据库操作的方式不同:

  • JDBC
    • JDBC是一种用于执行SQL语句的Java API,提供了与数据库交互的基本功能。
    • 开发人员需要手动管理数据库连接、SQL语句的执行、结果集的处理等。
    • 示例代码如下:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class JdbcExample {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;

        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "username", "password");
            String sql = "SELECT * FROM users WHERE id = ?";
            ps = conn.prepareStatement(sql);
            ps.setInt(1, 1);
            rs = ps.executeQuery();

            while (rs.next()) {
                System.out.println(rs.getInt("id") + " " + rs.getString("name"));
            }
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (rs != null) rs.close();
                if (ps != null) ps.close();
                if (conn != null) conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
  • Mybatis
    • Mybatis封装了JDBC代码,通过XML配置文件或注解来管理SQL语句,使开发人员只需关注业务逻辑。
    • 提供了强大的映射功能,可以将Java对象与数据库记录进行自动映射。
    • 示例代码如下:
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class MybatisExample {
    public static void main(String[] args) {
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("MybatisConfig.xml"));
        SqlSession session = factory.openSession();
        User user = session.selectOne("getUserById", 1);
        System.out.println(user);
        session.close();
    }
}

Mybatis的特点和优势

Mybatis具有以下特点和优势:

  • 灵活的SQL映射:可以通过XML配置文件或注解来定义SQL语句,支持动态SQL。
  • 强大的对象关系映射:可以将Java对象与数据库记录进行自动映射。
  • 性能优异:Mybatis避免了JDBC中的频繁类型转换,提高了查询效率。
  • 轻量级框架:Mybatis没有侵入性,不影响原有数据库的使用,可以与多种数据库进行交互。
Mybatis环境搭建

开发环境准备

Mybatis的开发环境通常需要以下组件:

  • Java开发环境:需要安装JDK。
  • 数据库:Mybatis支持多种数据库,如MySQL、Oracle、SQL Server等。
  • 构建工具:如Maven或Gradle。

Mybatis的下载与配置

  1. 下载Mybatis

  2. 配置Mybatis
    • 配置Mybatis需要两个主要的文件:mybatis-config.xml和数据映射文件(通常是XML文件)。
    • mybatis-config.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>
    <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/mydb"/>
                <property name="username" value="root"/>
                <property name="password" value="password"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="UserMapper.xml"/>
    </mappers>
</configuration>
  • 数据映射文件示例(如UserMapper.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">
    <select id="getUserById" resultType="com.example.model.User">
        SELECT * FROM users WHERE id = #{id}
    </select>
</mapper>

Maven项目的集成

  1. 添加Maven依赖
    • pom.xml文件中添加Mybatis的依赖:
<dependencies>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.7</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.26</version>
    </dependency>
</dependencies>
  1. 配置Maven项目

    • 确保项目的构建工具是Maven,并且已经正确配置了pom.xml文件。
  2. 编写测试代码
    • 创建一个Java类来测试Mybatis的配置是否正确。
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class MybatisTest {
    public static void main(String[] args) {
        String resource = "mybatis-config.xml";
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader(resource));
        SqlSession session = factory.openSession();
        User user = session.selectOne("com.example.mapper.UserMapper.getUserById", 1);
        System.out.println(user);
        session.close();
    }
}
Mybatis核心概念

SqlSessionFactory和SqlSession

  • SqlSessionFactory
    • SqlSessionFactory是创建SqlSession的工厂对象。
    • SqlSessionFactory通过解析mybatis-config.xml文件来创建。
    • 示例代码如下:
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class SqlSessionFactoryExample {
    public static void main(String[] args) {
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
    }
}
  • SqlSession
    • SqlSession是执行数据库操作的核心对象。
    • 通过SqlSessionFactory获取SqlSession对象。
    • 示例代码如下:
import org.apache.ibatis.session.SqlSession;

public class SqlSessionExample {
    public static void main(String[] args) {
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
        SqlSession session = factory.openSession();
    }
}

Mapper接口与XML配置

  • Mapper接口
    • Mapper接口定义了数据库操作的接口方法。
    • 每个Mapper接口方法对应一个SQL语句。
    • 示例代码如下:
public interface UserMapper {
    User getUserById(int id);
}
  • XML配置
    • XML配置文件定义了SQL语句及其对应的Java方法。
    • 示例代码如下:
<mapper namespace="com.example.mapper.UserMapper">
    <select id="getUserById" resultType="com.example.model.User">
        SELECT * FROM users WHERE id = #{id}
    </select>
</mapper>

{}和${}的区别与使用

  • #{}`
    • 用于预编译SQL语句中的参数。
    • Mybatis会自动处理类型转换。
    • 示例代码如下:
<insert id="insertUser" parameterType="com.example.model.User">
    INSERT INTO users (id, name, age) VALUES (#{id}, #{name}, #{age})
</insert>
  • ${}`
    • 用于拼接SQL语句,不会进行类型转换。
    • 使用时需谨慎,容易引起SQL注入。
    • 示例代码如下:
<insert id="insertUser" parameterType="com.example.model.User">
    INSERT INTO users (id, name, age) VALUES (#{id}, #{name}, ${age})
</insert>
Mybatis的基本使用

增删改查操作

  • 查询操作
    • 通过select标签定义查询SQL语句。
    • 示例代码如下:
<select id="getUserById" resultType="com.example.model.User">
    SELECT * FROM users WHERE id = #{id}
</select>
  • 插入操作
    • 通过insert标签定义插入SQL语句。
    • 示例代码如下:
<insert id="insertUser" parameterType="com.example.model.User">
    INSERT INTO users (id, name, age) VALUES (#{id}, #{name}, #{age})
</insert>
  • 更新操作
    • 通过update标签定义更新SQL语句。
    • 示例代码如下:
<update id="updateUser" parameterType="com.example.model.User">
    UPDATE users SET name = #{name}, age = #{age} WHERE id = #{id}
</update>
  • 删除操作
    • 通过delete标签定义删除SQL语句。
    • 示例代码如下:
<delete id="deleteUser" parameterType="int">
    DELETE FROM users WHERE id = #{id}
</delete>

结果集映射

  • 基本映射
    • 结果集映射可以将数据库查询结果映射到Java对象。
    • 示例代码如下:
<select id="getUserById" resultType="com.example.model.User">
    SELECT * FROM users WHERE id = #{id}
</select>
  • 复杂映射
    • 可以通过<resultMap>标签定义复杂的映射关系。
    • 示例代码如下:
<resultMap id="userResultMap" type="com.example.model.User">
    <id column="user_id" property="id"/>
    <result column="user_name" property="name"/>
    <result column="user_age" property="age"/>
</resultMap>

<select id="getUserById" resultMap="userResultMap">
    SELECT user_id AS user_id, user_name AS user_name, user_age AS user_age FROM users WHERE id = #{id}
</select>

批量操作

  • 批量插入
    • 可以通过<foreach>标签实现批量插入。
    • 示例代码如下:
<insert id="batchInsertUser" parameterType="java.util.List">
    INSERT INTO users (id, name, age) VALUES
    <foreach item="item" index="index" collection="list" separator=",">
        (#{item.id}, #{item.name}, #{item.age})
    </foreach>
</insert>
  • 批量更新
    • 可以通过<foreach>标签实现批量更新。
    • 示例代码如下:
<update id="batchUpdateUser" parameterType="java.util.List">
    UPDATE users SET name = #{item.name}, age = #{item.age}
    WHERE id = #{item.id}
    <foreach item="item" index="index" collection="list" separator=";">
    </foreach>
</update>
Mybatis的动态SQL

if标签

  • if标签
    • 用于条件判断,根据条件决定SQL语句中的部分是否添加。
    • 示例代码如下:
<update id="updateUser" parameterType="com.example.model.User">
    UPDATE users SET
    <if test="name != null">name = #{name},</if>
    <if test="age != null">age = #{age},</if>
    WHERE id = #{id}
</update>

choose标签

  • choose标签
    • 类似于Java中的switch语句,用于多条件判断。
    • 示例代码如下:
<update id="updateUser" parameterType="com.example.model.User">
    UPDATE users SET
    <choose>
        <when test="name != null">name = #{name},</when>
        <when test="age != null">age = #{age},</when>
        <otherwise>status = 'unknown',</otherwise>
    </choose>
    WHERE id = #{id}
</update>

set和foreach标签

  • set标签
    • 用于处理更新操作时的SQL语句。
    • 示例代码如下:
<update id="updateUser" parameterType="com.example.model.User">
    UPDATE users SET
    <set>
        <if test="name != null">name = #{name},</if>
        <if test="age != null">age = #{age},</if>
    </set>
    WHERE id = #{id}
</update>
  • foreach标签
    • 用于循环遍历集合。
    • 示例代码如下:
<insert id="batchInsertUser" parameterType="java.util.List">
    INSERT INTO users (id, name, age) VALUES
    <foreach item="item" index="index" collection="list" separator=",">
        (#{item.id}, #{item.name}, #{item.age})
    </foreach>
</insert>
Mybatis的高级特性

分页查询

  • 分页查询
    • Mybatis通过插件实现分页查询。
    • 示例代码如下:
<select id="getUserList" resultType="com.example.model.User">
    SELECT * FROM users LIMIT #{offset}, #{limit}
</select>
  • 插件配置
    • mybatis-config.xml中配置分页插件。
<plugins>
    <plugin interceptor="com.github.pagehelper.PageInterceptor">
        <property name="helperDialect" value="mysql"/>
        <property name="reasonable" value="true"/>
    </plugin>
</plugins>

二级缓存

  • 二级缓存
    • Mybatis支持一级和二级缓存。
    • 二级缓存在所有Mapper之间共享。
    • 示例代码如下:
<cache/>
  • 配置缓存
    • 在Mapper XML文件中启用缓存。
<mapper namespace="com.example.mapper.UserMapper">
    <cache/>
    <select id="getUserById" resultType="com.example.model.User">
        SELECT * FROM users WHERE id = #{id}
    </select>
</mapper>

插件开发

  • 插件开发
    • Mybatis支持自定义插件,可以通过拦截SqlSession方法来实现。
    • 示例代码如下:
import org.apache.ibatis.plugin.*;

public class MybatisPlugin implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        System.out.println("Before method execution");
        Object result = invocation.proceed();
        System.out.println("After method execution");
        return result;
    }

    @Override
    public Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }

    @Override
    public void setProperties(Properties properties) {
    }
}
  • 插件配置
    • mybatis-config.xml中配置插件。
<plugins>
    <plugin interceptor="com.example.plugin.MybatisPlugin">
        <property name="propertyName" value="propertyValue"/>
    </plugin>
</plugins>

通过以上各个部分的介绍与示例代码,相信你已经对Mybatis持久层框架有了全面的了解和掌握。希望这篇文章能帮助你在实际项目中更好地应用Mybatis。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消