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

Mybatis持久层框架入门教程

标签:
Java SSM 数据库
概述

Mybatis是一款优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射,避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。本文详细介绍了Mybatis的工作原理、优势以及如何搭建开发环境。此外,还涵盖了Mybatis的基本操作、高级特性和与Spring框架的集成。

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

Mybatis是什么

Mybatis是一款优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。Mybatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。Mybatis可以使用XML或注解进行配置和原始映射,将接口和Java的POJOs(普通的Java对象)映射成数据库中的记录。

Mybatis的工作原理

Mybatis的工作原理可以归纳为以下步骤:

  1. 加载配置文件:Mybatis会加载用户提供的配置文件,该文件通常包含数据库连接信息、映射器等配置。
  2. 构建SqlSessionFactory:通过配置文件构建SqlSessionFactory,这是创建SqlSession的工厂。
  3. 创建SqlSession:使用SqlSessionFactory创建SqlSession,SqlSession是Mybatis中最重要的接口,它允许执行预定义的SQL映射语句。
  4. 执行SQL映射语句:SqlSession执行映射语句,并返回结果。这些映射语句可以是预定义的SQL语句或动态SQL语句。
  5. 处理结果集:结果集由Mybatis处理并映射为Java对象,然后返回给用户。
  6. 关闭SqlSession:当完成数据库操作后,关闭SqlSession以释放资源。

Mybatis的优势

  • 灵活的SQL映射:Mybatis支持自定义SQL语句,允许使用存储过程和高级映射。
  • 轻量级:Mybatis没有侵入式的框架结构,代码简洁,避免了ORM框架的复杂性。
  • 与数据库兼容性好:Mybatis可以灵活地与多种数据库进行交互。
  • 支持动态SQL:Mybatis允许在运行时动态生成SQL语句,增强了灵活性。
  • 强大的社区支持:Mybatis拥有活跃的社区,提供了大量的文档和示例。
Mybatis环境搭建

开发环境准备

在搭建Mybatis环境之前,需要准备以下开发环境:

  • Java环境:确保已经安装了JDK。
  • IDE:建议使用IntelliJ IDEA或Eclipse。
  • 数据库:MySQL或其他关系型数据库。
  • 构建工具:Maven或Gradle。

创建Maven项目并引入Mybatis依赖

创建一个Maven项目,并在pom.xml文件中引入Mybatis依赖。下面是一个基本的pom.xml配置示例:

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>mybatis-example</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <!-- Mybatis依赖 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.6</version>
        </dependency>
        <!-- MySQL数据库驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.23</version>
        </dependency>
        <!-- JUnit测试依赖 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

Mybatis的基本配置

Mybatis的基本配置包括配置数据库连接信息、映射文件等。下面是一个基本的Mybatis配置文件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.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mydatabase"/>
                <property name="username" value="root"/>
                <property name="password" value="password"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/example/mapper/UserMapper.xml"/>
    </mappers>
</configuration>
Mybatis核心概念解析

SqlSessionFactory和SqlSession

SqlSessionFactory:SqlSessionFactory是创建SqlSession的工厂。它是线程不安全的,但可以安全地在全局范围内访问。以下是创建SqlSessionFactory的代码示例:

// 创建SqlSessionFactory
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);

SqlSession:SqlSession提供了执行SQL语句的接口,它允许我们执行预定义的映射语句,也可以执行自定义的SQL语句。SqlSession是线程不安全的,因此在使用时应尽量避免重复创建。以下是使用SqlSession执行SQL语句的代码示例:

// 打开SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();

// 使用SqlSession执行SQL语句
List<User> users = sqlSession.selectList("com.example.mapper.UserMapper.selectAllUsers");

Mapper接口和Mapper XML文件

Mapper接口:Mapper接口是定义了实际映射的方法接口。这些接口通常与映射器XML文件中的映射语句相对应。下面是一个简单的Mapper接口示例:

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

Mapper XML文件:映射器XML文件定义了SQL映射语句,这些语句与Mapper接口中的方法相对应。下面是一个简单的Mapper XML文件示例:

<mapper namespace="com.example.mapper.UserMapper">
    <select id="selectAllUsers" resultType="com.example.User">
        SELECT * FROM users
    </select>
</mapper>

{}和${}的区别

在SQL映射语句中,#$有不同的用途:

  • #{}`:用于预编译参数,避免SQL注入攻击。
  • ${}`:用于字符串拼接,直接替换占位符。

示例:

<select id="getUserById" resultType="com.example.User">
    SELECT * FROM users WHERE id = #{id}
</select>
<select id="getUserById" resultType="com.example.User">
    SELECT * FROM users WHERE id = ${id}
</select>
Mybatis基本操作

CRUD操作详解

CRUD操作指的是数据库中的基本操作,即创建(Create)、读取(Retrieve)、更新(Update)和删除(Delete)。下面是一个简单的CRUD示例:

创建(create)用户

public interface UserMapper {
    int insertUser(User user);
}
<insert id="insertUser">
    INSERT INTO users (name, email) VALUES (#{name}, #{email})
</insert>

读取(retrieve)用户

public interface UserMapper {
    User getUserById(int id);
}
<select id="getUserById" resultType="com.example.User">
    SELECT * FROM users WHERE id = #{id}
</select>

更新(update)用户

public interface UserMapper {
    int updateUser(User user);
}
<update id="updateUser">
    UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}
</update>

删除(delete)用户

public interface UserMapper {
    int deleteUser(int id);
}
<delete id="deleteUser">
    DELETE FROM users WHERE id = #{id}
</delete>

ResultMap的使用

ResultMap用于定义列名到Java对象属性的映射关系。它允许我们更灵活地处理复杂的映射关系。下面是一个简单的ResultMap示例:

<resultMap id="userResultMap" type="com.example.User">
    <id column="user_id" property="id"/>
    <result column="user_name" property="name"/>
    <result column="user_email" property="email"/>
</resultMap>

使用ResultMap进行复杂查询

<select id="getUserByIdWithResultMap" resultMap="userResultMap">
    SELECT user_id, user_name, user_email FROM users WHERE id = #{id}
</select>

一对多和多对多关联查询

一对多关联查询

一对多关联查询用于处理一个父对象与多个子对象的关系。下面是一个简单的例子:

public class User {
    private int id;
    private String name;
    private String email;
    private List<Address> addresses;
}
<resultMap id="userWithAddressResultMap" type="com.example.User">
    <id column="user_id" property="id"/>
    <result column="user_name" property="name"/>
    <result column="user_email" property="email"/>
    <collection property="addresses" ofType="com.example.Address">
        <id column="address_id" property="id"/>
        <result column="address_name" property="name"/>
    </collection>
</resultMap>

多对多关联查询

多对多关联查询用于处理多个父对象与多个子对象的关系。下面是一个简单的例子:

public class User {
    private int id;
    private String name;
    private String email;
    private List<Role> roles;
}
<resultMap id="userWithRolesResultMap" type="com.example.User">
    <id column="user_id" property="id"/>
    <result column="user_name" property="name"/>
    <result column="user_email" property="email"/>
    <collection property="roles" ofType="com.example.Role">
        <id column="role_id" property="id"/>
        <result column="role_name" property="name"/>
    </collection>
</resultMap>
Mybatis高级特性

分页查询

分页查询允许我们分批次地获取数据,而不是一次性加载所有数据。Mybatis提供了rowBounds参数来进行分页查询。

public interface UserMapper {
    List<User> getUsersByRowBounds(RowBounds rowBounds);
}
<select id="getUsersByRowBounds" resultType="com.example.User"
       parameterType="com.example.RowBounds">
    SELECT * FROM users
</select>

使用RowBounds进行分页

RowBounds rowBounds = new RowBounds(page * pageSize, pageSize);
List<User> users = sqlSession.selectList("com.example.mapper.UserMapper.getUsersByRowBounds", rowBounds);

动态SQL

动态SQL允许在运行时根据条件生成SQL语句。Mybatis提供了多种动态SQL标签,如ifchoosewhenotherwise等。以下是一个动态生成SQL的示例:

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

插入、更新时的主键回写

插入时的主键回写

<insert id="insertUser" keyProperty="id" useGeneratedKeys="true">
    INSERT INTO users (name, email) VALUES (#{name}, #{email})
</insert>

更新时的主键回写

<update id="updateUser" useGeneratedKeys="true" keyProperty="id">
    UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}
</update>
Mybatis与Spring集成

Spring和Mybatis集成的必要性

Spring框架提供了一种管理和配置Mybatis的方式,使得Mybatis的操作更加简洁和灵活。通过Spring管理SqlSessionFactory和SqlSession,可以简化Mybatis的集成,并提供事务管理等高级功能。

使用Spring管理SqlSessionFactory

在Spring配置文件中配置SqlSessionFactory。

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
</bean>

数据源配置

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/mydatabase"/>
    <property name="username" value="root"/>
    <property name="password" value="password"/>
</bean>

使用注解驱动的Mapper

通过Spring的MapperScannerConfigurer自动扫描并配置Mapper接口。

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

使用Mapper接口

@Autowired
private UserMapper userMapper;

示例代码

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

public class UserService {
    @Autowired
    private UserMapper userMapper;

    public List<User> getAllUsers() {
        return userMapper.selectAllUsers();
    }
}
点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

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

举报

0/150
提交
取消