手记

Mybatis入门教程:新手必读指南

概述

本文将详细介绍Mybatis入门的相关知识,包括Mybatis的基本概念、优势与应用场景。通过本文,读者将了解Mybatis与传统JDBC的区别,并掌握Mybatis环境搭建、核心概念及用法。此外,文章还将讲解Mybatis的高级特性和与Spring的集成方法。mybatis入门对于初学者来说非常重要。

Mybatis入门教程:新手必读指南
Mybatis简介

Mybatis的基本概念

Mybatis是一个优秀的持久层框架,它支持自定义SQL语句、存储过程以及高级映射。Mybatis避免了大部分的数据库厂商锁定,其设计目标是降低SQL映射到对象的复杂性。Mybatis使用简单的XML或注解进行配置和原始映射,将接口和Java的POJO(Plain Old Java Object,普通的Java对象)映射成数据库中的记录。

Mybatis的优势与应用场景

Mybatis的主要优势是通过半自动化的方式将Java对象和数据库记录之间进行映射,这种方式提供了很大的灵活性和性能。Mybatis在以下场景中表现突出:

  • 复杂的SQL查询
  • 高性能要求的应用
  • 需要精细控制SQL的场景

Mybatis适用于以下场景:

  • 需要进行复杂SQL查询的场景
  • 需要高性能处理大量数据的场景
  • 需要在应用中灵活控制SQL的场景
  • 需要进行存储过程调用的场景

Mybatis与传统JDBC的区别

Mybatis和JDBC的主要区别在于,Mybatis通过配置文件或注解来映射SQL语句,而JDBC需要手动编写SQL语句和处理结果集。例如,JDBC代码通常需要手动处理ResultSet,而Mybatis通过XML配置文件或注解将SQL语句与Java代码解耦,降低了SQL语句变更对Java代码的影响。

Mybatis环境搭建

开发环境准备

开发Mybatis应用的环境包括:

  1. JDK安装
  2. IDE安装(如Eclipse、IntelliJ IDEA等)
  3. Maven或Gradle安装(用于管理依赖)
  4. 数据库的安装与配置(如MySQL)
  5. Mybatis的jar包依赖

创建第一个Mybatis项目

以下步骤将展示如何创建一个简单的Mybatis项目。

使用Maven创建项目

  1. 创建一个新的Maven项目。
  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.25</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>5.3.10</version>
    </dependency>
</dependencies>
  1. 创建一个数据库连接配置文件(如db.properties):
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatisdb
username=root
password=root
  1. 创建数据库和表:
    CREATE DATABASE mybatisdb;
    USE mybatisdb;
    CREATE TABLE User (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50),
    password VARCHAR(50)
    );

配置Mybatis核心配置文件

Mybatis的核心配置文件(如mybatis-config.xml)用于配置数据库连接信息、映射文件位置等信息。例如,可以配置数据库连接池、事务管理器等。

<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/UserMapper.xml"/>
    </mappers>
</configuration>
Mybatis核心概念与用法

SqlSessionFactory与SqlSession

SqlSessionFactory是Mybatis的核心接口,它负责创建SqlSession。SqlSession是Mybatis中的一个会话对象,它负责执行SQL语句并返回结果。

创建SqlSessionFactory

String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

获取SqlSession

SqlSession session = sqlSessionFactory.openSession();

Mapper接口与XML映射文件

Mapper接口与XML映射文件用于定义SQL语句及其对应的Java方法。

Mapper接口定义

public interface UserMapper {
    User getUserById(int id);
    List<User> getAllUsers();
    void addUser(User user);
    void updateUser(User user);
    void deleteUser(int id);
}

XML映射文件

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

    <select id="getAllUsers" resultType="User">
        SELECT * FROM User
    </select>

    <insert id="addUser">
        INSERT INTO User(name, password) VALUES(#{name}, #{password})
    </insert>

    <update id="updateUser">
        UPDATE User SET name = #{name}, password = #{password} WHERE id = #{id}
    </update>

    <delete id="deleteUser">
        DELETE FROM User WHERE id = #{id}
    </delete>
</mapper>

{}和${}的区别和使用

  • #{}用于预编译SQL语句的占位符,可以防止SQL注入攻击。
  • ${}用于拼接SQL语句,需要注意SQL注入的风险。

示例:

<select id="getUserById" resultType="User">
    SELECT * FROM User WHERE id = #{id}
</select>
<select id="getUserByName" resultType="User">
    SELECT * FROM User WHERE name = '${name}'
</select>
CRUD操作详解

增加数据

以下代码展示了如何使用Mybatis增加一条数据。

实现UserMapper接口

public interface UserMapper {
    void addUser(User user);
}

XML映射文件

<insert id="addUser">
    INSERT INTO User(name, password) VALUES(#{name}, #{password})
</insert>

调用实现

User user = new User();
user.setName("John");
user.setPassword("123456");
SqlSession session = sqlSessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
mapper.addUser(user);
session.commit();
session.close();

查询数据

以下代码展示了如何使用Mybatis查询数据。

实现UserMapper接口

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

XML映射文件

<select id="getUserById" resultType="User">
    SELECT * FROM User WHERE id = #{id}
</select>

调用实现

SqlSession session = sqlSessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.getUserById(1);
session.close();
System.out.println(user.getName());

更新数据

以下代码展示了如何使用Mybatis更新数据。

实现UserMapper接口

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

XML映射文件

<update id="updateUser">
    UPDATE User SET name = #{name}, password = #{password} WHERE id = #{id}
</update>

调用实现

User user = new User();
user.setId(1);
user.setName("John Updated");
user.setPassword("654321");
SqlSession session = sqlSessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
mapper.updateUser(user);
session.commit();
session.close();

删除数据

以下代码展示了如何使用Mybatis删除数据。

实现UserMapper接口

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

XML映射文件

<delete id="deleteUser">
    DELETE FROM User WHERE id = #{id}
</delete>

调用实现

SqlSession session = sqlSessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
mapper.deleteUser(1);
session.commit();
session.close();
Mybatis高级特性

动态SQL

动态SQL允许根据不同的条件生成不同的SQL语句。

使用if标签

<select id="getUserByName" resultType="User">
    SELECT * FROM User
    <where>
        <if test="name != null">
            AND name = #{name}
        </if>
        <if test="password != null">
            AND password = #{password}
        </if>
    </where>
</select>

使用foreach标签

<delete id="deleteUsersByIds">
    DELETE FROM User WHERE id IN
    <foreach item="item" index="index" collection="ids" open="(" separator="," close=")">
        #{item}
    </foreach>
</delete>

分页查询

Mybatis提供了RowBounds类来实现分页查询。

使用RowBounds

SqlSession session = sqlSessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> users = mapper.getAllUsers(new RowBounds(0, 10));
session.close();

一级与二级缓存

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

启用二级缓存

mybatis-config.xml中配置:

<cache/>

在Mapper XML文件中配置:

<cache/>
Mybatis与Spring集成

Mybatis与Spring整合的基本步骤

  1. 使用Spring的SqlSessionFactoryBean创建SqlSessionFactory对象。
  2. 使用MapperScannerConfigurer扫描Mapper接口并生成Mapper对象。
  3. 在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"/>
</bean>

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

使用注解简化Mybatis开发

Mybatis支持使用注解来配置SQL语句,减少了XML文件的使用。

使用注解

@Select("SELECT * FROM User WHERE id = #{id}")
User getUserById(@Param("id") int id);

Mybatis与Spring的事务管理

Spring提供了声明式事务管理机制,可以与Mybatis无缝结合。

配置事务管理器

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

配置事务属性

<aop:config>
    <aop:pointcut id="txPointcut" expression="execution(* com.example.service.*.*(..))"/>
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="*" isolation="READ_COMMITTED" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
</aop:config>
0人推荐
随时随地看视频
慕课网APP