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

MyBatis入门:快速掌握MyBatis基础教程

标签:
Java SSM 数据库
概述

本文介绍了MyBatis入门的相关内容,包括MyBatis的基本概念、优势和应用场景。文章还详细讲解了MyBatis的环境搭建、核心概念以及常用操作。此外,还涉及了MyBatis与Spring的集成和高级特性。

MyBatis简介
MyBatis是什么

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

MyBatis的核心接口是SqlSession,它提供了所有持久层操作的方法,如增删改查等。SqlSession的实例可以通过SqlSessionFactory的实例来获得,而SqlSessionFactory的实例又可以通过SqlSessionFactoryBuilder的实例来创建。

MyBatis的优势和应用场景

MyBatis的优势包括:

  1. 灵活的SQL控制:允许使用原始SQL进行查询,可以直接编写SQL语句,也可以使用XML进行配置。
  2. 高性能:MyBatis在处理大量数据时性能很高,因为它没有过多的封装和对象转换。
  3. 易于维护:配置文件和SQL语句分离,使得系统维护更加简单。
  4. 简单易用:MyBatis学习曲线平缓,易于理解和使用。

应用场景包括:

  1. 数据访问层:直接操作数据库,进行数据的增删改查。
  2. 持久化层:将对象持久化到数据库中,实现对象与数据库表之间的映射。
  3. 大数据处理:在需要频繁操作数据库的情况下,MyBatis的高性能可以满足需求。
  4. 复杂查询:支持动态SQL,可以编写复杂的查询语句,适用于业务逻辑复杂的系统。
MyBatis与其他ORM框架的区别

MyBatis与Hibernate等ORM框架的区别在于:

  1. SQL控制:Hibernate自动将对象映射为SQL,而MyBatis则需要手动编写SQL语句。
  2. 性能:MyBatis在性能上通常优于Hibernate,因为它没有Hibernate那样的对象-关系映射开销。
  3. 灵活性:MyBatis相对更加灵活,可以根据需要编写SQL语句,而Hibernate则更加面向对象,操作更加抽象。
  4. 缓存机制:MyBatis默认情况下没有缓存机制,而Hibernate内置了一级缓存。
MyBatis环境搭建
下载MyBatis

可以通过MyBatis的官方网站下载MyBatis的最新版本。也可以使用Maven仓库自动管理依赖。

下面是一个具体的Maven依赖配置示例:

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.6</version>
</dependency>
数据库连接配置

MyBatis需要一个数据库连接配置文件,通常在resources目录下创建一个db-config.properties文件,内容如下:

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydb
username=root
password=root

在代码中读取和使用这个配置文件,可以通过Java代码如下:

Properties props = new Properties();
props.load(new FileInputStream(new File("src/main/resources/db-config.properties")));
DataSource dataSource = BasicDataSourceFactory.createDataSource(props);
MyBatis核心概念
SqlSessionFactory和SqlSession

SqlSessionFactory是创建SqlSession的工厂。SqlSessionFactory的实例是线程不安全的,因此通常使用SqlSessionFactoryBuilder来创建。

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("MyBatisConfig.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();

SqlSession是MyBatis工作的主要接口,它负责执行SQL语句,管理事务等。SqlSession的实例也是线程不安全的,每次需要时,都应该从SqlSessionFactory获取。

SqlSession sqlSession = sqlSessionFactory.openSession();
List<User> users = sqlSession.selectList("selectUsers");
Mapper接口和XML映射文件

Mapper接口是MyBatis中用于执行数据库操作的接口,每一个Mapper接口对应一个XML映射文件。例如,有一个UserMapper接口:

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

对应的XML映射文件UserMapper.xml如下:

<mapper namespace="com.example.mapper.UserMapper">
    <select id="selectAllUsers" resultType="com.example.model.User">
        SELECT * FROM users
    </select>
</mapper>
MyBatis配置文件详解

MyBatis的核心配置文件MyBatisConfig.xml,通常位于项目的resources目录下。配置文件主要包括环境配置、类型别名、映射器等。

<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/example/mapper/UserMapper.xml"/>
    </mappers>
</configuration>
MyBatis常用操作
CRUD操作(增删改查)

增加(Insert)

在UserMapper接口中定义插入方法:

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

对应的XML映射文件:

<insert id="insertUser" parameterType="com.example.model.User">
    INSERT INTO users (id, name, age)
    VALUES (#{id}, #{name}, #{age})
</insert>

查询(Select)

在UserMapper接口中定义查询方法:

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

对应的XML映射文件:

<select id="selectUsers" resultType="com.example.model.User">
    SELECT * FROM users
</select>

更新(Update)

在UserMapper接口中定义更新方法:

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

对应的XML映射文件:

<update id="updateUser" parameterType="com.example.model.User">
    UPDATE users
    SET name = #{name}, age = #{age}
    WHERE id = #{id}
</update>

删除(Delete)

在UserMapper接口中定义删除方法:

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

对应的XML映射文件:

<delete id="deleteUser" parameterType="int">
    DELETE FROM users WHERE id = #{id}
</delete>
参数传递和结果映射

参数传递

参数可以通过多种方式传递到SQL语句中,例如:

<select id="getUserById" parameterType="int" resultType="com.example.model.User">
    SELECT * FROM users WHERE id = #{id}
</select>

结果映射

结果映射可以用来处理复杂的查询结果,例如:

<resultMap id="userResultMap" type="com.example.model.User">
    <id column="id" property="id"/>
    <result column="name" property="name"/>
    <result column="age" property="age"/>
</resultMap>

<select id="selectUser" resultMap="userResultMap">
    SELECT * FROM users WHERE name = #{name}
</select>
动态SQL的使用

MyBatis提供了多种动态SQL标签,例如:

<select id="selectUser" parameterType="map" resultType="com.example.model.User">
    SELECT * FROM users
    <where>
        <if test="name != null">
            AND name = #{name}
        </if>
        <if test="age != null">
            AND age = #{age}
        </if>
    </where>
</select>
MyBatis与Spring集成
MyBatis与Spring整合的原因

MyBatis与Spring整合的原因在于:

  1. 依赖注入:Spring的依赖注入可以简化MyBatis的配置,减少硬编码的配置。
  2. 事务管理:Spring的事务管理可以简化MyBatis的事务处理。
  3. 统一配置:将MyBatis配置和Spring配置统一管理,提高维护性。
MyBatis-Spring工具类介绍

MyBatis-Spring提供了一些工具类,例如SqlSessionFactoryBeanSqlSessionTemplate,这些工具类可以简化MyBatis与Spring的整合。

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

<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
    <constructor-arg>
        <ref bean="sqlSessionFactory"/>
    </constructor-arg>
</bean>
配置和使用Mapper接口

在Spring配置文件中定义Mapper接口:

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

然后可以在Spring bean中使用Mapper接口:

@Autowired
private UserMapper userMapper;

public void getUserById(int id) {
    User user = userMapper.selectUserById(id);
    // 处理user
}
MyBatis与Spring的完整整合示例

一个完整的Spring配置文件示例:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${driver}"/>
    <property name="url" value="${url}"/>
    <property name="username" value="${username}"/>
    <property name="password" value="${password}"/>
</bean>

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="configLocation" value="classpath:MyBatisConfig.xml"/>
</bean>

<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
    <constructor-arg>
        <ref bean="sqlSessionFactory"/>
    </constructor-arg>
</bean>

<bean id="userMapper" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.example.mapper"/>
</bean>
MyBatis高级特性
分页查询

分页查询可以通过SQL的LIMIT子句实现,例如:

<select id="selectUserPage" parameterType="map" resultType="com.example.model.User">
    SELECT * FROM users
    LIMIT #{offset}, #{limit}
</select>

也可以使用MyBatis的PageHelper插件实现分页:

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.1.2</version>
</dependency>

在Mapper接口中定义分页方法:

public interface UserMapper {
    List<User> selectUserPage(int offset, int limit);
}

使用PageHelper插件:

PageHelper.startPage(pageNum, pageSize);
List<User> users = userMapper.selectUserPage();
Page<User> userPage = (Page<User>) users;
一对一和一对多关联查询

在一对一关联查询中,例如查询用户及其对应的账号信息:

<resultMap id="userAccountMap" type="com.example.model.User">
    <id column="id" property="id"/>
    <result column="name" property="name"/>
    <result column="age" property="age"/>
    <association property="account" javaType="com.example.model.Account">
        <id column="account_id" property="id"/>
        <result column="account_name" property="name"/>
    </association>
</resultMap>

<select id="selectUserAccount" resultMap="userAccountMap">
    SELECT u.id, u.name, u.age, a.id as account_id, a.name as account_name
    FROM users u
    LEFT JOIN accounts a ON u.id = a.user_id
</select>

在一对多关联查询中,例如查询用户及其所有订单信息:

<resultMap id="userOrderMap" type="com.example.model.User">
    <id column="id" property="id"/>
    <result column="name" property="name"/>
    <result column="age" property="age"/>
    <collection property="orders" javaType="java.util.List" ofType="com.example.model.Order">
        <id column="order_id" property="id"/>
        <result column="order_name" property="name"/>
    </collection>
</resultMap>

<select id="selectUserOrders" resultMap="userOrderMap">
    SELECT u.id, u.name, u.age, o.id as order_id, o.name as order_name
    FROM users u
    LEFT JOIN orders o ON u.id = o.user_id
</select>
延迟加载和缓存机制

延迟加载

延迟加载可以通过fetchType="lazy"属性设置:

<association property="account" javaType="com.example.model.Account" fetchType="lazy">
    <id column="account_id" property="id"/>
    <result column="account_name" property="name"/>
</association>

缓存机制

MyBatis支持一级缓存和二级缓存。一级缓存是SqlSession级别的缓存,二级缓存是Mapper级别的缓存。

<cache/>

在Mapper配置文件中开启二级缓存:

<mapper namespace="com.example.mapper.UserMapper">
    <cache/>
    <select id="selectUser" resultType="com.example.model.User">
        SELECT * FROM users WHERE id = #{id}
    </select>
</mapper>

通过缓存可以提高查询性能,减少数据库访问次数。

点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

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

举报

0/150
提交
取消