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

Mybatis持久层框架入门详解

标签:
Java SSM 数据库
概述

Mybatis是一个优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。本文将详细介绍Mybatis的基础知识、环境搭建、核心概念和高级用法,帮助读者快速掌握Mybatis持久层框架入门。

Mybatis持久层框架入门详解
Mybatis基础知识介绍

Mybatis是什么

Mybatis是一个优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。它通过半自动的对象关系映射(ORM)简化了数据库操作,使得开发者可以更专注于SQL语句的编写和业务逻辑的实现,而不是数据访问细节。

Mybatis的主要特点

  • 简单易用:Mybatis使用简单,配置方便,通过XML或注解方式进行配置。
  • 灵活性强:支持自定义SQL,支持存储过程,可以灵活地进行数据库操作。
  • 性能高:通过使用灵活的映射规则,可以将数据库的查询结果映射到Java对象,性能优于一些ORM框架。
  • 轻量级:Mybatis没有太重的依赖,启动速度快,易于集成到各种项目中。
  • 高可用性:支持多数据库,支持数据库迁移,具有良好的扩展性。

Mybatis的优势和应用场景

  • 简化数据库访问:Mybatis简化了数据库访问的复杂性,使得数据库操作变得更加简单和直观。
  • 减少开发时间:通过减少数据库访问的代码量,提高了开发效率。
  • 支持多种数据库:Mybatis支持多种数据库,如MySQL、Oracle、SQL Server、DB2等。
  • 易于维护:Mybatis的配置和SQL语句相对独立,使得数据库的操作和维护变得简单。
  • 适用场景:Mybatis适用于需要高效、灵活地进行数据库操作的场景,尤其适合复杂查询和数据操作的项目。
Mybatis环境搭建

开发环境准备

  • Java环境:确保已经安装Java开发环境,如JDK 8及以上版本。
  • IDE:推荐使用IntelliJ IDEA或Eclipse。
  • 数据库:本教程以MySQL为例,安装并启动MySQL数据库。
  • Maven:Mybatis项目通常使用Maven进行依赖管理,需要安装Maven。

创建Maven项目

  1. 创建一个新的Maven项目,选择Java SE项目。
  2. 修改 pom.xml 文件,添加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.23</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.14.0</version>
    </dependency>
</dependencies>
  1. 在项目中创建 mybatis-config.xml 文件,配置Mybatis核心设置。

配置Mybatis核心配置文件

Mybatis的核心配置文件通常包含数据库连接信息、类型别名、映射文件位置等。

<?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="com/mybatis/UserMapper.xml"/>
    </mappers>
</configuration>

数据库连接代码示例

通过SqlSessionFactorySqlSession来连接数据库并执行SQL语句。

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

// 获取SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
Mybatis核心概念

SqlSessionFactory和SqlSession

SqlSessionFactory是生成SqlSession的工厂,它是线程不安全的,因此通常在应用中创建一个SqlSessionFactory的实例来生成SqlSession。SqlSession提供了一系列的数据库操作方法,如增删改查等。

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

// 获取SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();

Mapper接口和XML映射文件

Mapper接口是Mybatis中用于定义数据库操作的方法,方法名和参数对应于XML映射文件中的SQL语句。XML映射文件中定义了SQL语句及其返回值类型。

public interface UserMapper {
    List<User> selectAllUsers();
}
<mapper namespace="com.mybatis.UserMapper">
    <select id="selectAllUsers" resultType="com.mybatis.User">
        SELECT * FROM user
    </select>
</mapper>

{}和${}的区别

{}是预编译参数,用于防止SQL注入,${}是直接拼接字符串,存在SQL注入风险。
<select id="getUserById" resultType="com.mybatis.User">
    SELECT * FROM user WHERE id = #{id}
</select>

<select id="getUserByIdWithSqlInjection" resultType="com.mybatis.User">
    SELECT * FROM user WHERE id = ${id}
</select>
Mybatis的CRUD操作

增加记录

在Mybatis中,插入记录通常使用insert标签来定义SQL语句,并在Mapper接口中定义相应的方法。

public interface UserMapper {
    int insertUser(User user);
}
<insert id="insertUser">
    INSERT INTO user (name, age) VALUES (#{name}, #{age})
</insert>
User user = new User();
user.setName("张三");
user.setAge(20);
int result = userMapper.insertUser(user);
System.out.println("插入记录数:" + result);

修改记录

更新记录使用update标签来定义SQL语句,并在Mapper接口中定义相应的方法。

public interface UserMapper {
    int updateUser(User user);
}
<update id="updateUser">
    UPDATE user SET name=#{name}, age=#{age} WHERE id=#{id}
</update>
User user = new User();
user.setId(1);
user.setName("李四");
user.setAge(22);
int result = userMapper.updateUser(user);
System.out.println("更新记录数:" + result);

删除记录

删除记录使用delete标签来定义SQL语句,并在Mapper接口中定义相应的方法。

public interface UserMapper {
    int deleteUser(int id);
}
<delete id="deleteUser">
    DELETE FROM user WHERE id=#{id}
</delete>
int result = userMapper.deleteUser(1);
System.out.println("删除记录数:" + result);

查询记录

查询记录使用select标签来定义SQL语句,并在Mapper接口中定义相应的方法。

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

<select id="getAllUsers" resultType="com.mybatis.User">
    SELECT * FROM user
</select>
User user = userMapper.getUserById(1);
System.out.println(user);

List<User> users = userMapper.getAllUsers();
System.out.println(users);
Mybatis动态SQL

Mybatis提供了多种动态SQL标签,如ifchoosewheresetforeach等,可以根据条件生成不同的SQL语句。

if标签

if标签可以用于条件判断,当条件满足时,SQL语句中的内容会被包含进去。

<select id="getUserByCondition" resultType="com.mybatis.User">
    SELECT * FROM user WHERE 1=1
    <if test="name != null">
        AND name=#{name}
    </if>
    <if test="age != null">
        AND age=#{age}
    </if>
</select>

choose标签

choose标签类似于Java中的switch语句,当第一个when条件满足时,该标签下的内容会被包含,其余则不会。

<select id="getUserByCondition" resultType="com.mybatis.User">
    SELECT * FROM user WHERE 1=1
    <choose>
        <when test="name != null">
            AND name=#{name}
        </when>
        <when test="age != null">
            AND age=#{age}
        </when>
        <otherwise>
            AND id=1
        </otherwise>
    </choose>
</select>

where标签

where标签用于自动处理SQL语句中的WHERE子句,当有多个条件时,会自动去掉多余的AND

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

set标签

set标签用于自动处理SQL语句中的SET子句,当有多个SET时,会自动去掉多余的,

<update id="updateUser">
    UPDATE user
    <set>
        <if test="name != null">
            name=#{name},
        </if>
        <if test="age != null">
            age=#{age}
        </if>
    </set>
    WHERE id=#{id}
</update>

foreach标签

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

<select id="getUserByIds" resultType="com.mybatis.User">
    SELECT * FROM user WHERE id IN
    <foreach item="item" index="index" collection="list" open="(" separator="," close=")">
        #{item}
    </foreach>
</select>
Mybatis的高级用法

分页查询

分页查询可以通过Mybatis的插件机制来实现,使用PageHelper插件可以简化分页查询的代码。

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.1.3</version>
</dependency>
// PageHelper分页插件使用
PageHelper.startPage(1, 10); // 第1页,每页10条记录
List<User> users = userMapper.getAllUsers();
System.out.println(users);

结果集的延迟加载

延迟加载可以在需要时才加载数据,减少了不必要的数据库访问。

<settings>
    <setting name="lazyLoadingEnabled" value="true"/>
    <setting name="aggressiveLazyLoading" value="false"/>
</settings>
// 延迟加载示例
User user = userMapper.getUserById(1);
System.out.println(user.getName()); // 马上加载name
System.out.println(user.getAddress()); // 需要时加载address

一级、二级缓存

缓存可以提高数据库查询性能,减少数据库访问次数。Mybatis支持一级缓存和二级缓存。

一级缓存

一级缓存是SqlSession级别的缓存,每个SqlSession都有独立的一级缓存,当SqlSession执行查询操作后,会将结果保存到一级缓存中,下次相同查询时直接从缓存中读取。

SqlSession sqlSession1 = sqlSessionFactory.openSession();
User user1 = sqlSession1.selectOne("getUserById", 1);
sqlSession1.commit();
sqlSession1.close();

SqlSession sqlSession2 = sqlSessionFactory.openSession();
User user2 = sqlSession2.selectOne("getUserById", 1);
System.out.println(user1 == user2); // true

二级缓存

二级缓存是基于每个命名空间的缓存,当多个SqlSession操作同一个命名空间的Mapper时,可以共享二级缓存,提高查询效率。

<cache/>

SqlSession sqlSession1 = sqlSessionFactory.openSession();
User user1 = sqlSession1.selectOne("getUserById", 1);
sqlSession1.commit();
sqlSession1.close();

SqlSession sqlSession2 = sqlSessionFactory.openSession();
User user2 = sqlSession2.selectOne("getUserById", 1);
System.out.println(user1 == user2); // false
``

通过以上介绍,我们可以看到Mybatis框架提供了丰富的功能和灵活性,能够满足复杂的数据操作需求。希望这篇入门详解能帮助大家更好地理解和使用Mybatis框架。
点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

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

举报

0/150
提交
取消