亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

Mybatis持久層框架教程:初學者入門指南

標簽:
Java SSM 數據庫
概述

Mybatis持久层框架教程介绍了Mybatis的基本概念、优点和应用场景,帮助开发者理解并使用Mybatis进行数据库操作。文章详细讲解了Mybatis的环境搭建、核心概念以及CRUD操作,并深入探讨了动态SQL和分页查询等高级特性。此外,还介绍了Mybatis的缓存机制和配置优化策略,以及如何使用Spring集成Mybatis。

Mybatis持久层框架教程:初学者入门指南
Mybatis简介

Mybatis的基本概念

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

Mybatis的优点和应用场景

Mybatis的优点包括:

  1. 灵活的SQL支持:Mybatis允许开发者直接编写SQL语句,提供了强大的SQL支持。
  2. 与数据库无关:Mybatis可以连接任何数据库,数据库的切换仅需修改配置。
  3. 映射简单:提供简单的Java对象(POJO)与数据库映射关系,易于理解。
  4. 性能更好:Mybatis避免了大部分的JDBC代码,减少了网络传输的数据量。

Mybatis的应用场景包括:

  • 需要频繁修改SQL的项目
  • 需要高灵活性的SQL查询的项目
  • 需要简单的数据操作和数据库交互的项目

Mybatis与JDBC的区别

Mybatis与JDBC的主要区别在于:

  • SQL执行:Mybatis提供了SQL映射文件,可以动态生成SQL语句,而JDBC需要手动编写和执行SQL。
  • 结果映射:Mybatis自动将SQL查询结果映射到Java对象,而JDBC需要手动处理结果集。
  • 配置方式:Mybatis可以通过XML或注解配置,而JDBC配置较为复杂。
Mybatis环境搭建

开发环境准备

首先,准备开发环境,确保安装了Java JDK、IDE(如IntelliJ IDEA或Eclipse)和Maven。以下是安装步骤:

  1. 安装Java JDK:确保安装了Java JDK 8及以上版本。
  2. 安装IDE:选择合适的IDE,本文以IntelliJ IDEA为例。
  3. 安装Maven:Maven是一个强大的项目管理工具,用于构建和依赖管理。

Maven项目的配置

在IDE中创建一个新的Maven项目,并在pom.xml文件中添加Mybatis依赖。以下是一个示例配置:

<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-demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.23</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.6</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

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/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="password"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/example/mapper/UserMapper.xml"/>
    </mappers>
</configuration>
Mybatis的核心概念

SqlSession和SqlSessionFactory

SqlSessionFactory是Mybatis的核心接口之一,用于创建SqlSession对象。SqlSession提供了执行SQL语句和管理事务的方法。以下是创建SqlSessionFactory的示例代码:

import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;

public class MyBatisUtil {
    private static SqlSessionFactory sqlSessionFactory;

    static {
        String resource = "mybatis-config.xml";
        InputStream inputStream = MyBatisUtil.class.getClassLoader().getResourceAsStream(resource);
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    }

    public static SqlSessionFactory getSqlSessionFactory() {
        return sqlSessionFactory;
    }
}

Mapper接口与XML映射文件

Mybatis使用Mapper接口来定义SQL语句,同时使用XML文件来配置SQL语句的映射。以下是一个Mapper接口和对应的XML映射文件示例:

Mapper接口

import java.util.List;
import com.example.model.User;

public interface UserMapper {
    User getUser(int id);
    List<User> getAllUsers();
    int insertUser(User user);
    int updateUser(User user);
    int deleteUser(int id);
}

XML映射文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">
    <select id="getUser" resultType="com.example.model.User">
        SELECT * FROM user WHERE id = #{id}
    </select>
    <select id="getAllUsers" resultType="com.example.model.User">
        SELECT * FROM user
    </select>
    <insert id="insertUser" parameterType="com.example.model.User">
        INSERT INTO user (id, name, age) VALUES (#{id}, #{name}, #{age})
    </insert>
    <update id="updateUser" parameterType="com.example.model.User">
        UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}
    </update>
    <delete id="deleteUser" parameterType="int">
        DELETE FROM user WHERE id = #{id}
    </delete>
</mapper>

Mybatis的缓存机制

Mybatis拥有两种级别的缓存:一级缓存(本地缓存)和二级缓存(共享缓存)。一级缓存是SqlSession级别的,二级缓存是Mapper级别的。

一级缓存

一级缓存默认开启,每个SqlSession都有自己的缓存,当SqlSession执行查询时,会先检查缓存中是否有数据,如果有则直接返回。

二级缓存

二级缓存需要手动开启,可以在mybatis-config.xml中配置:

<cache-refresher class="com.example.cache.CacheRefresher"/>
<cache>
    <type>LRU</type>
    <size>1000</size>
    <flushInterval>60</flushInterval>
    <implementation>com.example.cache.LocalCache</implementation>
</cache>

在Mapper接口中开启二级缓存:

<mapper namespace="com.example.mapper.UserMapper">
    <cache/>
</mapper>
Mybatis的CRUD操作

增删改查的基本用法

Mybatis支持基本的CRUD操作,以下是一个完整的示例:

User实体类

public class User {
    private int id;
    private String name;
    private int age;

    // Getter and Setter...
}

Mapper接口

public interface UserMapper {
    User getUser(int id);
    List<User> getAllUsers();
    int insertUser(User user);
    int updateUser(User user);
    int deleteUser(int id);
}

XML映射文件

<mapper namespace="com.example.mapper.UserMapper">
    <select id="getUser" resultType="com.example.model.User">
        SELECT * FROM user WHERE id = #{id}
    </select>
    <select id="getAllUsers" resultType="com.example.model.User">
        SELECT * FROM user
    </select>
    <insert id="insertUser" parameterType="com.example.model.User">
        INSERT INTO user (id, name, age) VALUES (#{id}, #{name}, #{age})
    </insert>
    <update id="updateUser" parameterType="com.example.model.User">
        UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}
    </update>
    <delete id="deleteUser" parameterType="int">
        DELETE FROM user WHERE id = #{id}
    </delete>
</mapper>

测试代码

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import java.util.List;

public class Test {
    private SqlSessionFactory sqlSessionFactory = MyBatisUtil.getSqlSessionFactory();

    public void testCRUD() {
        try (SqlSession session = sqlSessionFactory.openSession(true)) {
            UserMapper mapper = session.getMapper(UserMapper.class);

            User user = new User();
            user.setId(1);
            user.setName("John");
            user.setAge(30);

            mapper.insertUser(user);

            user.setId(2);
            user.setName("Jane");
            user.setAge(25);
            mapper.updateUser(user);

            mapper.deleteUser(1);

            User foundUser = mapper.getUser(2);
            System.out.println(foundUser);

            List<User> users = mapper.getAllUsers();
            System.out.println(users);
        }
    }
}

动态SQL的使用

动态SQL允许根据不同的条件生成不同的SQL语句。Mybatis提供了多种标签来实现动态SQL,如<if><choose><when><otherwise>等。

示例:使用动态SQL查询用户

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

测试代码

public void testDynamicSQL() {
    try (SqlSession session = sqlSessionFactory.openSession(true)) {
        UserMapper mapper = session.getMapper(UserMapper.class);

        List<User> users = mapper.getUserByConditions(null, "John", null);
        System.out.println(users);

        users = mapper.getUserByConditions(1, null, 25);
        System.out.println(users);
    }
}

分页查询的实现

Mybatis提供了两种分页方式:使用RowBoundsPageHelper插件。

使用RowBounds

import org.apache.ibatis.session.RowBounds;

public void testPagination() {
    try (SqlSession session = sqlSessionFactory.openSession(true)) {
        UserMapper mapper = session.getMapper(UserMapper.class);

        User user = new User();
        user.setId(1);
        user.setName("John");
        user.setAge(30);

        mapper.insertUser(user);

        List<User> users = mapper.getAllUsers(new RowBounds(0, 10));
        System.out.println(users);
    }
}

使用PageHelper插件

首先在pom.xml中添加PageHelper依赖:

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

mybatis-config.xml中配置PageHelper:

<plugins>
    <plugin interceptor="com.github.pagehelper.PageInterceptor">
        <property name="helperDialect" value="mysql"/>
        <property name="reasonable" value="true"/>
    </plugin>
</plugins>

修改Mapper接口方法:

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

在代码中使用PageHelper:

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;

public void testPageHelper() {
    try (SqlSession session = sqlSessionFactory.openSession(true)) {
        UserMapper mapper = session.getMapper(UserMapper.class);

        PageHelper.startPage(1, 10);
        List<User> users = mapper.getAllUsers();
        PageInfo<User> pageInfo = new PageInfo<>(users);
        System.out.println(pageInfo);
    }
}
Mybatis的高级特性

关联查询(一对一和一对多)

Mybatis支持多种关联查询,包括一对一和一对多。以下是一对一查询的示例:

User实体类

public class User {
    private int id;
    private String name;
    private int age;
    private Department department;

    // Getter and Setter...
}

Department实体类

public class Department {
    private int id;
    private String name;
    private String address;

    // Getter and Setter...
}

XML映射文件

<mapper namespace="com.example.mapper.UserMapper">
    <resultMap id="userResultMap" type="com.example.model.User">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="age" column="age"/>
        <association property="department" javaType="com.example.model.Department" select="getDepartment" column="department_id"/>
    </resultMap>

    <select id="getUserById" resultMap="userResultMap">
        SELECT * FROM user WHERE id = #{id}
    </select>

    <select id="getDepartment" resultType="com.example.model.Department">
        SELECT * FROM department WHERE id = #{id}
    </select>
</mapper>

测试代码

public void testOneToOne() {
    try (SqlSession session = sqlSessionFactory.openSession(true)) {
        UserMapper mapper = session.getMapper(UserMapper.class);

        User user = mapper.getUserById(1);
        System.out.println(user);
    }
}

一对多查询的示例:

User实体类

public class User {
    private int id;
    private String name;
    private int age;
    private List<Department> departments;

    // Getter and Setter...
}

XML映射文件

<mapper namespace="com.example.mapper.UserMapper">
    <resultMap id="userResultMap" type="com.example.model.User">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="age" column="age"/>
        <collection property="departments" javaType="java.util.List" ofType="com.example.model.Department" select="getDepartmentByUserId" column="id"/>
    </resultMap>

    <select id="getUserById" resultMap="userResultMap">
        SELECT * FROM user WHERE id = #{id}
    </select>

    <select id="getDepartmentByUserId" resultType="com.example.model.Department">
        SELECT * FROM department WHERE user_id = #{id}
    </select>
</mapper>

测试代码

public void testOneToMany() {
    try (SqlSession session = sqlSessionFactory.openSession(true)) {
        UserMapper mapper = session.getMapper(UserMapper.class);

        User user = mapper.getUserById(1);
        System.out.println(user);
    }
}

继承和联合主键

Mybatis支持继承和联合主键,以下是一个示例:

User实体类

public class User {
    private int id;
    private String name;
    private int age;

    // Getter and Setter...
}

UserMapper接口

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

XML映射文件

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

测试代码

public void testInheritance() {
    try (SqlSession session = sqlSessionFactory.openSession(true)) {
        UserMapper mapper = session.getMapper(UserMapper.class);

        User user = mapper.getUser(1);
        System.out.println(user);
    }
}

插入和更新时的自动主键生成

Mybatis支持在插入和更新操作中自动生成主键。以下是一个示例:

User实体类

public class User {
    private int id;
    private String name;
    private int age;

    // Getter and Setter...
}

UserMapper接口

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

XML映射文件

<mapper namespace="com.example.mapper.UserMapper">
    <insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO user (name, age) VALUES (#{name}, #{age})
    </insert>
    <update id="updateUser" parameterType="com.example.model.User">
        UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}
    </update>
</mapper>

测试代码

public void testAutoKeyGeneration() {
    try (SqlSession session = sqlSessionFactory.openSession(true)) {
        UserMapper mapper = session.getMapper(UserMapper.class);

        User user = new User();
        user.setName("John");
        user.setAge(30);
        mapper.insertUser(user);
        user.setId(mapper.insertUser(user));

        user.setName("Jane");
        mapper.updateUser(user);

        System.out.println(user);
    }
}
Mybatis的事务管理与配置优化

事务控制的方式

Mybatis支持多种事务控制方式,包括编程方式和声明式事务。

编程方式

public void testTransaction() {
    try (SqlSession session = sqlSessionFactory.openSession(true)) {
        UserMapper mapper = session.getMapper(UserMapper.class);

        User user = new User();
        user.setName("John");
        user.setAge(30);
        mapper.insertUser(user);

        session.commit();
    }
}

声明式事务

mybatis-config.xml中配置事务管理器:

<transactionManager type="JDBC"/>

使用Spring集成Mybatis时,可以使用Spring的事务管理器。

Mybatis的配置优化策略

Mybatis的配置优化包括:

  1. 使用缓存:开启一级和二级缓存,提高查询性能。
  2. 使用动态SQL:减少SQL语句的硬编码,提高灵活性。
  3. 使用PageHelper插件:简化分页操作。
  4. 使用Mybatis Generator:自动生成Mapper接口和实体类。

使用Spring集成Mybatis

Spring可以很好地集成Mybatis,提供事务管理和依赖注入功能。以下是一个简单的Spring集成Mybatis的示例:

配置文件

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

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

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
    <property name="username" value="root"/>
    <property name="password" value="password"/>
</bean>

测试代码

@Autowired
private UserMapper userMapper;

public void testSpringMybatis() {
    User user = new User();
    user.setName("John");
    user.setAge(30);
    userMapper.insertUser(user);

    User foundUser = userMapper.getUser(1);
    System.out.println(foundUser);
}
點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消