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

Mybatis持久层框架资料详解与入门教程

标签:
Java SSM 数据库
概述

Mybatis是一个优秀的持久层框架,支持自定义SQL和存储过程,简化了数据库操作。本文将详细介绍Mybatis的环境搭建、核心概念、常用操作、动态SQL使用及与Spring框架的集成方法,提供全面的Mybatis持久层框架资料。

Mybatis持久层框架资料详解与入门教程
Mybatis简介

Mybatis是什么

Mybatis是一个优秀的持久层框架,支持自定义SQL、存储过程以及高级映射。它避免了几乎所有的JDBC代码和手动设置参数以及获取结果集的繁琐操作,可以通过简单的XML或注解进行配置和原始映射,将接口和Java的POJO(Plain Old Java Object,普通的Java对象)映射成数据库中的记录。Mybatis是Apache2.0开源项目,能够与各种数据库兼容,包括MySQL、Oracle、SQL Server等,非常适合于需要灵活查询和高效率的项目。

Mybatis的优势和特点

Mybatis具有以下优势和特点:

  1. 简化数据库操作:Mybatis简化了数据库操作,提供了简洁的API,使开发者可以专注于业务逻辑,而不必关心底层的数据库操作细节。
  2. 支持自定义SQL:Mybatis允许开发者编写复杂的SQL语句,支持几乎所有的数据库特性如存储过程、动态SQL等。
  3. 良好的灵活性:Mybatis提供了灵活的配置和映射规则,使开发者可以在不改动接口和业务逻辑的情况下,对数据库的表结构进行扩展或修改。
  4. 简单的结果映射:Mybatis通过简单的配置或注解即可完成数据库映射到Java对象的转换,极大简化了开发者的操作。
  5. 更好的与Spring框架集成:Mybatis可以很容易地与Spring框架集成,支持Spring的事务管理,使业务逻辑更加清晰、灵活。
  6. 支持动态SQL:Mybatis支持动态SQL,可以根据不同的条件生成不同的SQL语句,使得SQL语句的生成更加灵活和强大。

Mybatis的适用场景

Mybatis适合以下场景:

  1. 项目中对SQL性能要求高:Mybatis允许编写复杂的SQL语句,可以优化SQL性能,适合性能敏感的应用。
  2. 业务逻辑复杂,需要灵活的SQL支持:Mybatis支持自定义SQL,可以根据业务需求编写灵活的SQL语句,适合业务逻辑复杂的项目。
  3. 需要支持多种数据库:Mybatis支持几乎所有的主流数据库,可以方便地在不同的数据库间切换。
  4. 需要灵活的数据库表结构扩展:Mybatis提供了灵活的配置和映射规则,可以在不改动接口和业务逻辑的情况下,对数据库表结构进行扩展或修改。
Mybatis环境搭建

Java开发环境配置

在搭建Mybatis环境之前,需要确保已经配置好Java开发环境。以下是配置Java开发环境的基本步骤:

  1. 安装Java:确保已安装Java开发工具包(JDK)。可以从Oracle官网下载并安装JDK。安装完成后,需要将JDK的bin目录添加到系统的环境变量PATH中。
  2. 配置环境变量:确保系统环境变量中设置好JAVA_HOMEJRE_HOMEJAVA_HOME指向JDK的安装目录,JRE_HOME指向JDK安装目录中的jre目录。设置PATH环境变量,使其包含JAVA_HOME/bin

示例代码:查看Java版本

public class JavaVersionCheck {
    public static void main(String[] args) {
        System.out.println("Java version: " + System.getProperty("java.version"));
    }
}

Mybatis的下载与引入

下载Mybatis

  1. 访问Mybatis的GitHub主页,下载最新版本的Mybatis压缩包。
  2. 解压缩下载的压缩包,将解压缩后的文件夹复制到项目的lib目录下。

引入Mybatis依赖

在项目中引入Mybatis的依赖,可以通过手动导入jar包或Maven依赖管理等方式实现。使用Maven管理依赖是较为推荐的方式。

示例代码:Maven依赖配置

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.7</version>
</dependency>

Mybatis的基本配置

Mybatis的基本配置主要包括数据库的连接配置和Mybatis的核心配置文件mybatis-config.xml

数据库连接配置

通常将数据库连接信息配置在jdbc.properties文件中,便于修改和维护。
示例代码:jdbc.properties

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mydb
jdbc.username=root
jdbc.password=password
Mybatis核心配置文件mybatis-config.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>
    <properties resource="jdbc.properties"/>
    <typeAliases>
        <typeAlias type="com.example.entity.User" alias="User"/>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/example/mapper/UserMapper.xml"/>
    </mappers>
</configuration>
Mybatis核心概念

SqlSession和SqlSessionFactory

SqlSession

SqlSession是Mybatis中执行数据库操作的核心接口,它负责执行预编译的SQL语句并返回相应的结果。SqlSession可以获取到Mapper接口的代理对象,通过这些代理对象调用方法时,SqlSession会根据配置的映射信息执行相应的SQL语句。

示例代码:获取SqlSession并执行SQL语句

SqlSession session = sqlSessionFactory.openSession();
List<User> users = session.selectList("com.example.mapper.UserMapper.selectUsers");
session.close();

SqlSessionFactory

SqlSessionFactory是一个工厂类,它负责创建SqlSession实例。SqlSessionFactory是线程安全的,可以安全地被多个线程共享。

示例代码:创建SqlSessionFactory

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

Mapper接口与XML映射文件

Mapper接口

Mapper接口是Mybatis中用于定义SQL映射的接口,每个方法对应一个SQL语句。Mapper接口中的方法签名将映射到配置文件中的SQL语句。

示例代码:Mapper接口定义

public interface UserMapper {
    List<User> selectUsers();
    User selectUserById(int id);
    int insertUser(User user);
    int updateUser(User user);
    int deleteUser(int id);
}

XML映射文件

XML映射文件与Mapper接口配合使用,用于定义接口方法与SQL语句的对应关系。XML映射文件通常位于resources目录下,并通过mybatis-config.xml文件引入。

示例代码:XML映射文件UserMapper.xml

<mapper namespace="com.example.mapper.UserMapper">
    <select id="selectUsers" resultType="com.example.entity.User">
        SELECT * FROM users
    </select>
    <select id="selectUserById" resultType="com.example.entity.User">
        SELECT * FROM users WHERE id = #{id}
    </select>
    <insert id="insertUser">
        INSERT INTO users (name, age) VALUES (#{name}, #{age})
    </insert>
    <update id="updateUser">
        UPDATE users SET name = #{name}, age = #{age} WHERE id = #{id}
    </update>
    <delete id="deleteUser">
        DELETE FROM users WHERE id = #{id}
    </delete>
</mapper>

{}与${}的区别

{}

#{}是Mybatis提供的占位符,用于预编译SQL中的参数。在执行SQL语句时,Mybatis会将#{}中的变量替换为实际的参数值。这种方式可以有效防止SQL注入攻击。

示例代码:使用#{}占位符

<select id="selectUserById" resultType="com.example.entity.User">
    SELECT * FROM users WHERE id = #{id}
</select>

${}

${}是字符串替换占位符,用于拼接SQL语句。这种方式直接将${}中的变量值替换成SQL语句的一部分,存在SQL注入的风险。

示例代码:使用${}占位符

<select id="selectUserById" resultType="com.example.entity.User">
    SELECT * FROM users WHERE id = ${id}
</select>
Mybatis常用操作

CRUD操作详解

查询操作

Mybatis提供了多种查询方式,包括单个查询和批量查询,可以通过Mapper接口的方法调用来实现。

示例代码:单个查询

public interface UserMapper {
    User selectUserById(int id);
}

示例代码:批量查询

public interface UserMapper {
    List<User> selectUsers();
}

增删改操作

Mybatis提供了多种增删改操作,可以通过Mapper接口的方法调用来实现。

示例代码:插入操作

public interface UserMapper {
    int insertUser(User user);
}

示例代码:更新操作

public interface UserMapper {
    int updateUser(User user);
}

示例代码:删除操作

public interface UserMapper {
    int deleteUser(int id);
}

查询操作的参数传递

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

基本类型参数

示例代码:传递基本类型参数

public interface UserMapper {
    User selectUserById(int id);
}

Map参数

示例代码:传递Map参数

public interface UserMapper {
    User selectUserByMap(Map<String, Object> params);
}

示例代码:XML映射文件中的Map参数

<select id="selectUserByMap" resultType="com.example.entity.User">
    SELECT * FROM users WHERE id = #{id}
</select>

POJO参数

示例代码:传递POJO参数

public interface UserMapper {
    User selectUserByUser(User user);
}

示例代码:XML映射文件中的POJO参数

<select id="selectUserByUser" resultType="com.example.entity.User">
    SELECT * FROM users WHERE id = #{id} AND name = #{name}
</select>

结果集处理

Mybatis支持多种结果集处理方式,包括对象映射、集合映射、嵌套结果集映射等。

对象映射

示例代码:对象映射

public interface UserMapper {
    User selectUserById(int id);
}

集合映射

示例代码:集合映射

public interface UserMapper {
    List<User> selectUsers();
}

嵌套结果集映射

示例代码:嵌套结果集映射

public interface UserMapper {
    User selectUserWithAddress(int id);
}

示例代码:XML映射文件中的嵌套结果集映射

<resultMap id="userWithAddressResultMap" type="com.example.entity.User">
    <id column="id" property="id"/>
    <result column="name" property="name"/>
    <result column="age" property="age"/>
    <association property="address" javaType="com.example.entity.Address">
        <id column="address_id" property="id"/>
        <result column="address_name" property="name"/>
    </association>
</resultMap>

<select id="selectUserWithAddress" resultMap="userWithAddressResultMap">
    SELECT u.id AS id, u.name AS name, u.age AS age, a.id AS address_id, a.name AS address_name
    FROM users u
    LEFT JOIN addresses a ON u.address_id = a.id
    WHERE u.id = #{id}
</select>
Mybatis动态SQL使用

if, choose, when, otherwise标签

Mybatis提供了ifchoosewhenotherwise等标签,用于构建动态SQL语句。

if标签

if标签用于条件判断,只有当表达式的值为true时,才会包含在最终生成的SQL语句中。

示例代码:使用if标签

<select id="selectUsersByCondition" resultType="com.example.entity.User">
    SELECT * FROM users
    <where>
        <if test="name != null">
            AND name = #{name}
        </if>
        <if test="age != null">
            AND age = #{age}
        </if>
    </where>
</select>

choose, when, otherwise标签

choosewhenotherwise标签用于多条件选择,类似于Java中的switch语句。choose标签相当于switch语句的主体部分,when标签相当于case语句,otherwise标签相当于default语句。

示例代码:使用choose, when, otherwise标签

<select id="selectUsersByCondition" resultType="com.example.entity.User">
    SELECT * FROM users
    <where>
        <choose>
            <when test="name != null">
                AND name = #{name}
            </when>
            <when test="age != null">
                AND age = #{age}
            </when>
            <otherwise>
                AND id = #{id}
            </otherwise>
        </choose>
    </where>
</select>

set, trim, foreach标签的应用

set标签

set标签用于更新操作时,处理SQL中的SET部分,可以自动去除多余的逗号。

示例代码:使用set标签

<update id="updateUser" parameterType="com.example.entity.User">
    UPDATE users
    <set>
        <if test="name != null">name = #{name},</if>
        <if test="age != null">age = #{age}</if>
    </set>
    WHERE id = #{id}
</update>

trim标签

trim标签用于处理包含前缀、后缀或前缀和后缀的SQL语句片段。

示例代码:使用trim标签

<select id="selectUsersByCondition" resultType="com.example.entity.User">
    SELECT * FROM users
    <trim prefix="WHERE" prefixOverrides="AND |OR ">
        <if test="name != null">
            AND name = #{name}
        </if>
        <if test="age != null">
            AND age = #{age}
        </if>
    </trim>
</select>

foreach标签

foreach标签用于遍历集合或数组,生成循环的SQL语句片段。

示例代码:使用foreach标签

<select id="selectUsersByIds" resultType="com.example.entity.User">
    SELECT * FROM users
    WHERE id IN
    <foreach item="item" index="index" collection="ids" open="(" separator="," close=")">
        #{item}
    </foreach>
</select>

动态SQL的常见场景

条件查询

使用if标签实现条件查询。

示例代码:条件查询

<select id="selectUsersByCondition" resultType="com.example.entity.User">
    SELECT * FROM users
    <where>
        <if test="name != null">
            AND name = #{name}
        </if>
        <if test="age != null">
            AND age = #{age}
        </if>
    </where>
</select>

更新操作

使用set标签实现更新操作。

示例代码:更新操作

<update id="updateUser" parameterType="com.example.entity.User">
    UPDATE users
    <set>
        <if test="name != null">name = #{name},</if>
        <if test="age != null">age = #{age}</if>
    </set>
    WHERE id = #{id}
</update>

遍历集合

使用foreach标签实现遍历集合。

示例代码:遍历集合

<select id="selectUsersByIds" resultType="com.example.entity.User">
    SELECT * FROM users
    WHERE id IN
    <foreach item="item" index="index" collection="ids" open="(" separator="," close=")">
        #{item}
    </foreach>
</select>
Mybatis与Spring集成

Spring整合Mybatis的方法

Mybatis与Spring的集成主要通过SqlSessionFactoryBeanMapperScannerConfigurer两个类来实现。

SqlSessionFactoryBean

SqlSessionFactoryBean是Mybatis的工厂类,用于创建SqlSessionFactory实例。SqlSessionFactoryBean可以注入DataSource,并且支持加载Mybatis的核心配置文件。

示例代码:使用SqlSessionFactoryBean

@Configuration
public class MybatisConfig {
    @Autowired
    private DataSource dataSource;

    @Bean
    public SqlSessionFactoryBean sqlSessionFactoryBean() {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSource);
        try {
            factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:com/example/mapper/*.xml"));
            return factoryBean.getObject();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

MapperScannerConfigurer

MapperScannerConfigurer用于自动扫描指定包下的Mapper接口,并自动注册为Spring的Bean。

示例代码:使用MapperScannerConfigurer

@Configuration
public class MybatisConfig {
    @Autowired
    private SqlSessionFactoryBean sqlSessionFactoryBean;

    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer() {
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        mapperScannerConfigurer.setBasePackage("com.example.mapper");
        mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactoryBean");
        return mapperScannerConfigurer;
    }
}

Mybatis-Spring的简单使用

Mybatis-Spring提供了一系列的辅助类,使得Mybatis与Spring的集成更加简便。@Autowired注解可以自动注入SqlSessionFactorySqlSessionTemplate

示例代码:使用@Autowired注解

@Service
public class UserService {
    @Autowired
    private SqlSessionTemplate sqlSessionTemplate;

    public List<User> getUsers() {
        return sqlSessionTemplate.selectList("com.example.mapper.UserMapper.selectUsers");
    }
}

Spring配置文件中Mybatis的配置

在Spring配置文件中,可以配置SqlSessionFactoryBeanMapperScannerConfigurer来实现Mybatis与Spring的集成。

示例代码:Spring配置文件applicationContext.xml

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
    <property name="username" value="root"/>
    <property name="password" value="password"/>
</bean>

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="mapperLocations" value="classpath*:com/example/mapper/*.xml"/>
</bean>

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.example.mapper"/>
</bean>
总结

本文详细介绍了Mybatis的环境搭建、核心概念、常用操作、动态SQL使用以及与Spring的集成,帮助读者深入了解Mybatis的工作原理和使用方法。希望通过本文的介绍,读者能够为实际项目中的使用打下坚实的基础。如果您在学习或使用Mybatis过程中有任何疑问,欢迎在评论区留言交流。

点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消