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

Mybatis持久层框架学习入门教程

标签:
Java 数据库
概述

本文介绍了Mybatis持久层框架的学习,包括其基本概念、环境搭建方法以及与Spring框架的集成方式。通过详细讲解,帮助读者掌握Mybatis的配置和使用,从而更加灵活高效地进行数据库操作。从基础环境配置到复杂SQL查询,Mybatis持久层框架的学习涵盖了全面的内容。

Mybatis简介
Mybatis是什么

Mybatis是一个优秀的持久层框架,它支持自定义SQL查询、存储过程以及高级映射。Mybatis基于Java的持久化框架,能够将Java对象与数据库记录进行映射。通过Mybatis,可以更加灵活地处理数据库操作,从而简化开发过程。

Mybatis的主要特点

Mybatis的主要特点包括:

  1. 动态SQL支持:Mybatis支持动态SQL,可以根据条件生成不同的SQL语句。
  2. 插件机制:Mybatis具有强大的插件扩展机制,可以扩展框架的功能。
  3. 二级缓存:Mybatis支持二级缓存,能够提高系统的性能。
  4. 简化了数据库操作:通过配置文件生成复杂SQL语句,简化了Java代码的书写。
  5. 支持自定义SQL:允许用户编写自定义的SQL语句,以满足不同的业务需求。
  6. 支持存储过程:支持存储过程的调用,可以处理复杂的数据库操作。
  7. 支持高级映射:支持一对一、一对多和多对多的关联映射,可以满足复杂的数据模型。
Mybatis与JDBC的区别
  • 编程模型:JDBC需要手动编写SQL语句、处理结果集等,而Mybatis通过配置文件或注解简化这些操作。
  • 灵活性:JDBC是面向过程的,而Mybatis是面向对象的,因此Mybatis更加灵活。
  • 性能:JDBC操作数据库时需要频繁创建和销毁数据库连接,而Mybatis通过SqlSession管理数据库连接,提高了性能。
  • 扩展性:JDBC扩展性较差,而Mybatis可以使用插件扩展功能。
Mybatis环境搭建
开发环境配置

为了在本地环境中搭建Mybatis,首先确保已安装Java环境,并配置了环境变量。推荐使用IntelliJ IDEA或Eclipse作为IDE。

  1. 打开IDE,创建一个新的Java项目。
  2. 配置项目依赖,例如添加Maven或Gradle依赖管理。
  3. 创建数据库连接,并在项目的配置文件中配置数据库连接信息。例如,配置文件application.properties中的内容如下:
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  1. 在Maven项目中,通过在pom.xml文件中添加Mybatis依赖来引入Mybatis库。示例如下:
<dependencies>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.6</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.22</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>5.3.6</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
        <version>5.3.6</version>
    </dependency>
</dependencies>
  1. 在数据库管理工具中(例如MySQL Workbench或phpMyAdmin),创建一个新的数据库,并在该数据库中创建数据表。例如,创建一个名为mybatis的数据库,并在其中创建一个名为user的数据表:
CREATE DATABASE mybatis;
USE mybatis;

CREATE TABLE user (
  id INT PRIMARY KEY AUTO_INCREMENT,
  username VARCHAR(255) NOT NULL,
  email VARCHAR(255) NOT NULL
);
Mybatis核心概念
SqlSessionFactory和SqlSession

SqlSessionFactory是Mybatis框架的核心接口之一,负责创建SqlSession对象。SqlSession是执行数据库操作的入口,可以执行增删改查等操作,并提供了事务管理的功能。

创建SqlSessionFactory

String resource = "mybatis-config.xml";
Reader reader = Resources.getResourceAsReader(resource);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);

使用SqlSession

SqlSession session = factory.openSession();
User user = session.selectOne("com.example.mapper.UserMapper.selectUser", 1);
session.close();
Mapper接口和XML映射文件

Mapper接口定义了数据库操作方法,XML映射文件定义了SQL语句。Mapper接口和XML映射文件之间通过命名空间和方法名进行关联。

Mapper接口示例

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

XML映射文件示例

<mapper namespace="com.example.mapper.UserMapper">
    <select id="selectUser" resultType="com.example.model.User">
        SELECT * FROM user WHERE id = #{id}
    </select>
</mapper>
{}与${}的区别

{}占位符

{}是一个预编译参数,Mybatis会将其替换为实际值,并使用PreparedStatement执行SQL语句,这种方式可以防止SQL注入攻击。
<select id="selectUser" parameterType="int" resultType="com.example.model.User">
    SELECT * FROM user WHERE id = #{id}
</select>

${}字符串替换

${}会直接将值替换到SQL语句中,这种方式容易受到SQL注入攻击,因此不推荐使用。

<select id="selectUser" parameterType="int" resultType="com.example.model.User">
    SELECT * FROM user WHERE id = ${id}
</select>
Mybatis持久化操作
增加数据

使用Mybatis插入数据的方法如下:

插入数据

public void insertUser(User user) {
    SqlSession session = factory.openSession();
    try {
        session.insert("com.example.mapper.UserMapper.insertUser", user);
        session.commit();
    } finally {
        session.close();
    }
}

XML映射文件

<insert id="insertUser" parameterType="com.example.model.User">
    INSERT INTO user(username, email) VALUES(#{username}, #{email})
</insert>
查询数据

使用Mybatis查询数据的方法如下:

查询数据

public User selectUser(int id) {
    SqlSession session = factory.openSession();
    try {
        User user = session.selectOne("com.example.mapper.UserMapper.selectUser", id);
        return user;
    } finally {
        session.close();
    }
}

XML映射文件

<select id="selectUser" parameterType="int" resultType="com.example.model.User">
    SELECT * FROM user WHERE id = #{id}
</select>
更新数据

使用Mybatis更新数据的方法如下:

更新数据

public void updateUser(User user) {
    SqlSession session = factory.openSession();
    try {
        session.update("com.example.mapper.UserMapper.updateUser", user);
        session.commit();
    } finally {
        session.close();
    }
}

XML映射文件

<update id="updateUser" parameterType="com.example.model.User">
    UPDATE user SET username = #{username}, email = #{email} WHERE id = #{id}
</update>
删除数据

使用Mybatis删除数据的方法如下:

删除数据

public void deleteUser(int id) {
    SqlSession session = factory.openSession();
    try {
        session.delete("com.example.mapper.UserMapper.deleteUser", id);
        session.commit();
    } finally {
        session.close();
    }
}

XML映射文件

<delete id="deleteUser" parameterType="int">
    DELETE FROM user WHERE id = #{id}
</delete>
Mybatis动态SQL使用
if

if标签用于条件分支,可以控制是否执行某个SQL片段。

if标签示例

<select id="selectUser" parameterType="map" resultType="com.example.model.User">
    SELECT * FROM user
    <where>
        <if test="id != null">
            AND id = #{id}
        </if>
        <if test="username != null">
            AND username = #{username}
        </if>
    </where>
</select>
choose (when, otherwise)

choose标签用于多条件分支判断。当第一个when标签的test属性为true时,执行该标签内的SQL片段,后续的when标签将不再被检查;如果所有的when标签都不满足条件,则执行otherwise标签。

choose标签示例

<select id="selectUser" parameterType="map" resultType="com.example.model.User">
    SELECT * FROM user
    <where>
        <choose>
            <when test="id != null">
                AND id = #{id}
            </when>
            <when test="username != null">
                AND username = #{username}
            </when>
            <otherwise>
                AND 1=0
            </otherwise>
        </choose>
    </where>
</select>
where

where标签用于生成SQL的WHERE子句,可以自动处理SQL语句中的ANDOR关键字。

where标签示例

<select id="selectUser" parameterType="map" resultType="com.example.model.User">
    SELECT * FROM user
    <where>
        <if test="id != null">
            id = #{id}
        </if>
        <if test="username != null">
            username = #{username}
        </if>
    </where>
</select>
set

set标签用于生成SQL的SET子句,可以自动处理SQL语句中的SET关键字。

set标签示例

<update id="updateUser" parameterType="com.example.model.User">
    UPDATE user
    <set>
        <if test="username != null">username = #{username},</if>
        <if test="email != null">email = #{email},</if>
    </set>
    WHERE id = #{id}
</update>
foreach

foreach标签用于遍历集合,常用于生成IN子句。

foreach标签示例

<select id="selectUsersByIds" parameterType="java.util.List" resultType="com.example.model.User">
    SELECT * FROM user WHERE id IN
    <foreach item="item" index="index" collection="list" open="(" separator="," close=")">
        #{item}
    </foreach>
</select>
批量操作

Mybatis还提供了批量插入和更新的功能,可以显著提高性能。例如,批量插入数据:

public void batchInsertUser(List<User> users) {
    SqlSession session = factory.openSession();
    try {
        session.insert("com.example.mapper.UserMapper.batchInsertUser", users);
        session.commit();
    } finally {
        session.close();
    }
}
<insert id="batchInsertUser" parameterType="java.util.List">
    INSERT INTO user(username, email) VALUES
    <foreach item="item" index="index" collection="users" separator=",">
        (#{item.username}, #{item.email})
    </foreach>
</insert>
事务处理

Mybatis支持事务管理,可以通过SqlSessioncommit()rollback()方法进行操作。例如:

public void transactionExample() {
    SqlSession session = factory.openSession();
    try {
        session.insert("com.example.mapper.UserMapper.insertUser", new User());
        session.update("com.example.mapper.UserMapper.updateUser", new User());
        session.commit();
    } catch (Exception e) {
        session.rollback();
    } finally {
        session.close();
    }
}
Mybatis与Spring集成
Mybatis-Spring简介

Mybatis-Spring提供了Spring与Mybatis集成的解决方案,使得Mybatis可以更好地与Spring框架集成。通过Mybatis-Spring,可以使用Spring的事务管理功能,并且可以使用Mapper接口来替代传统的XML配置方式。

配置Mybatis与Spring集成

为了将Mybatis与Spring集成,需要在Spring配置文件中配置SqlSessionFactoryMapperScannerConfigurer

SqlSessionFactory配置

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

MapperScannerConfigurer配置

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.example.mapper" />
    <property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
使用Mapper接口

在Spring项目中,可以通过Mapper接口来调用Mybatis方法,而不需要编写XML配置文件。

Mapper接口示例

public interface UserMapper {
    User selectUser(int id);
    void insertUser(User user);
    void updateUser(User user);
    void deleteUser(int id);
}

使用Mapper接口

@Autowired
private UserMapper userMapper;

public User selectUser(int id) {
    return userMapper.selectUser(id);
}

public void insertUser(User user) {
    userMapper.insertUser(user);
}

public void updateUser(User user) {
    userMapper.updateUser(user);
}

public void deleteUser(int id) {
    userMapper.deleteUser(id);
}

通过以上配置,Mybatis与Spring集成后,可以更加方便地进行数据库操作,并且可以更好地管理事务。

以上是Mybatis框架的入门教程,从环境搭建到持久化操作,再到动态SQL和与Spring集成的介绍,希望对你的学习有所帮助。

点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

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

举报

0/150
提交
取消