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

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

Mybatis持久層框架資料入門教程

標簽:
Java SSM 數據庫
概述

Mybatis是一个优秀的持久层框架,支持自定义SQL、存储过程以及高级映射,简化了数据库的持久层操作。本文将详细介绍Mybatis的配置、核心概念、常用操作和高级特性。Mybatis持久层框架资料包括环境搭建、Mapper接口使用、动态SQL编写等内容,帮助开发者更好地理解和使用Mybatis。

Mybatis与JDBC相比,提供了更强大的映射能力和动态SQL支持,简化了数据库操作,同时减少了手动编写SQL语句和处理结果集的复杂性。Mybatis允许开发者通过XML配置文件或注解来配置数据库映射关系,并将接口和Java的POJO对象映射到数据库的表结构中,提供了一组强大的动态SQL工具来处理复杂的查询逻辑。

Mybatis概述

Mybatis简介

Mybatis是一个优秀的持久层框架,支持自定义SQL、存储过程以及高级映射。Mybatis的设计目标是降低使用门槛,让开发者以最小的代价与最简洁的代码完成数据库的持久层操作。Mybatis可以通过XML配置文件或注解来配置数据库映射关系,它将接口和Java的POJO对象映射到数据库的表结构中,提供了一组强大的动态SQL工具来处理复杂的查询逻辑。

Mybatis的特点和优势

  • 轻量级框架:Mybatis不需要复杂的配置,易于学习和使用。
  • 灵活的SQL支持:支持自定义SQL,存储过程调用,灵活的动态SQL。
  • 强大的映射能力:支持基本的Java数据类型和复杂对象的映射。
  • 支持插件:Mybatis的插件机制可以方便地进行扩展,允许在运行时拦截Mybatis的任何一个调用。
  • 与数据库无关:Mybatis支持多种数据库,如MySQL、Oracle、SQL Server、DB2等。

Mybatis与JDBC的区别

Mybatis与JDBC之间存在诸多区别,具体如下:

特征 JDBC Mybatis
数据操作 需要手动编写SQL语句和处理结果集 自动映射SQL结果集到Java对象
SQL生成 手动编写SQL语句 使用XML或注解定义SQL语句
结果集处理 手动解析结果集,处理类型转换等 自动解析结果集,提供类型转换支持
代码复杂度 代码冗长,调试困难 代码简洁,易于维护和调试
性能优化 手动管理连接池、事务等 内置连接池、事务管理,性能优化更高
扩展性 通过编写更多Java代码来实现扩展 通过插件机制实现扩展,易于维护
Mybatis环境搭建

Java开发环境准备

首先,需要确保JDK已经安装并配置好环境变量。可以通过以下命令检查JDK是否安装成功:

java -version

如果环境配置正确,将显示JDK的版本信息。

Mybatis依赖的引入

接下来,在Maven项目中引入Mybatis的依赖。编辑pom.xml文件,添加以下依赖:

<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>
</dependencies>

Mybatis配置文件的编写

Mybatis的配置文件mybatis-config.xml需要包含数据库连接信息和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/mydb"/>
                <property name="username" value="root"/>
                <property name="password" value="password"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/example/mapper/UserMapper.xml"/>
    </mappers>
</configuration>

配置文件中的<mappers>标签用于指定映射器文件的位置,这里假设UserMapper.xml文件位于com/example/mapper包中。

Mybatis核心概念

SqlSessionFactory和SqlSession

SqlSessionFactory是Mybatis中的工厂类,用于创建SqlSession对象。SqlSession是Mybatis的核心接口,提供了执行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接口和Mapper XML文件

Mapper接口定义了与数据库交互的接口方法。Mapper XML文件中定义了SQL语句和与接口方法对应的映射关系。例如,定义一个UserMapper接口:

import com.example.model.User;

import java.util.List;

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

对应的UserMapper.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="getAllUsers" resultType="com.example.model.User">
        SELECT * FROM user
    </select>
    <select id="getUserById" resultType="com.example.model.User">
        SELECT * FROM user WHERE id = #{id}
    </select>
    <insert id="insertUser">
        INSERT INTO user (name, age) VALUES (#{name}, #{age})
    </insert>
    <update id="updateUser">
        UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}
    </update>
    <delete id="deleteUser">
        DELETE FROM user WHERE id = #{id}
    </delete>
</mapper>

Mybatis的执行流程

  1. 创建SqlSessionFactory对象。
  2. 使用SqlSessionFactory创建SqlSession对象。
  3. 通过SqlSession对象执行数据库操作。
  4. 使用SqlSession提交事务。
  5. 关闭SqlSession

示例代码:

import org.apache.ibatis.session.SqlSession;

public class MainApp {
    public static void main(String[] args) {
        SqlSession sqlSession = MybatisUtil.getSqlSessionFactory().openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

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

        sqlSession.close();
    }
}
Mybatis常用操作

CRUD操作示例

CRUD操作包括Create(创建)、Read(读取)、Update(更新)和Delete(删除)。

创建用户

import com.example.model.User;

public static void createUser() {
    SqlSession sqlSession = MybatisUtil.getSqlSessionFactory().openSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);

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

    mapper.insertUser(user);
    sqlSession.commit();
    sqlSession.close();
}

读取用户

public static void readUser() {
    SqlSession sqlSession = MybatisUtil.getSqlSessionFactory().openSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);

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

    sqlSession.close();
}

更新用户

public static void updateUser() {
    SqlSession sqlSession = MybatisUtil.getSqlSessionFactory().openSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);

    User user = new User();
    user.setId(1);
    user.setName("Jane Doe");
    user.setAge(32);

    mapper.updateUser(user);
    sqlSession.commit();
    sqlSession.close();
}

删除用户

public static void deleteUser() {
    SqlSession sqlSession = MybatisUtil.getSqlSessionFactory().openSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);

    mapper.deleteUser(1);
    sqlSession.commit();
    sqlSession.close();
}

使用Mapper接口进行数据库操作

上面的示例已经展示了如何使用Mapper接口进行数据库操作。Mapper接口提供了一种简洁的方法来执行数据库操作,而不需要直接编写SQL语句。

动态SQL的使用

动态SQL可以根据条件自动生成SQL语句。例如,根据条件生成不同的SQL语句:

<if test="name != null">
    AND name = #{name}
</if>
<if test="age != null">
    AND age = #{age}
</if>

在Mapper接口中定义一个方法:

List<User> queryUser(User user);

对应的XML文件中定义动态SQL:

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

示例代码:

public static void queryUser() {
    SqlSession sqlSession = MybatisUtil.getSqlSessionFactory().openSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);

    User user = new User();
    user.setName("John Doe");

    List<User> users = mapper.queryUser(user);
    for (User u : users) {
        System.out.println(u);
    }

    sqlSession.close();
}
Mybatis的高级特性

结果集的映射与关联

Mybatis可以处理复杂的嵌套查询,例如一对多、多对一等关联关系。例如,假设有一个Post表和一个Comment表,每个Post可以有多个Comment

定义PostComment类:

public class Post {
    private int id;
    private String title;
    private List<Comment> comments;
}

public class Comment {
    private int id;
    private int postId;
    private String content;
}

PostMapper.xml中配置关联查询:

<mapper namespace="com.example.mapper.PostMapper">
    <resultMap id="postResultMap" type="com.example.model.Post">
        <id property="id" column="post_id"/>
        <result property="title" column="title"/>
        <collection property="comments" javaType="ArrayList" ofType="com.example.model.Comment" select="getCommentsByPostId"/>
    </resultMap>

    <select id="getPostById" resultMap="postResultMap">
        SELECT * FROM post WHERE id = #{id}
    </select>

    <select id="getCommentsByPostId" resultType="com.example.model.Comment">
        SELECT * FROM comment WHERE post_id = #{postId}
    </select>
</mapper>

示例代码:

public static void getPostWithComments() {
    SqlSession sqlSession = MybatisUtil.getSqlSessionFactory().openSession();
    PostMapper mapper = sqlSession.getMapper(PostMapper.class);

    Post post = mapper.getPostById(1);
    System.out.println(post.getTitle());
    for (Comment comment : post.getComments()) {
        System.out.println(comment.getContent());
    }

    sqlSession.close();
}

参数和结果的类型转换

Mybatis支持自定义类型处理器,可以实现自定义的类型转换。例如,可以定义一个类型处理器来处理Date类型:

import org.apache.ibatis.type.TypeHandler;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;

public class CustomDateTypeHandler implements TypeHandler<Date> {
    @Override
    public void setParameter(PreparedStatement ps, int i, Date parameter, JdbcType jdbcType) throws SQLException {
        ps.setTimestamp(i, new java.sql.Timestamp(parameter.getTime()));
    }

    @Override
    public Date getResult(ResultSet rs, String columnName) throws SQLException {
        return rs.getTimestamp(columnName);
    }

    @Override
    public Date getResult(ResultSet rs, int columnIndex) throws SQLException {
        return rs.getTimestamp(columnIndex);
    }

    @Override
    public Date getResult(CallableStatement cs, int columnIndex) throws SQLException {
        return cs.getTimestamp(columnIndex);
    }
}

mybatis-config.xml中配置类型处理器:

<typeHandlers>
    <typeHandler handler="com.example.typehandler.CustomDateTypeHandler" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
</typeHandlers>

批量操作和缓存机制

批量操作

Mybatis支持批量插入操作,通过useGeneratedKeys属性和useCache属性可以提高批量操作的性能。

<insert id="insertUsers" useGeneratedKeys="true" keyProperty="id" parameterType="com.example.model.User">
    INSERT INTO user (name, age) VALUES (#{name}, #{age})
</insert>

示例代码:

public static void insertUsers() {
    SqlSession sqlSession = MybatisUtil.getSqlSessionFactory().openSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);

    List<User> users = new ArrayList<>();
    users.add(new User("Alice", 25));
    users.add(new User("Bob", 30));

    for (User user : users) {
        mapper.insertUser(user);
    }
    sqlSession.commit();
    sqlSession.close();
}

缓存机制

Mybatis提供了一级缓存和二级缓存。

一级缓存:SqlSession级别的缓存,每个SqlSession都有一个缓存,当一个SqlSession执行一个SQL语句后,会将结果存入缓存,下次执行相同SQL语句时直接从缓存中获取结果。

二级缓存:全局缓存,可以配置多个SqlSession共享一个缓存。配置二级缓存需要在mapper配置文件中开启:

<cache/>

示例代码:

public static void enableSecondLevelCache() {
    SqlSession sqlSession1 = MybatisUtil.getSqlSessionFactory().openSession();
    UserMapper mapper1 = sqlSession1.getMapper(UserMapper.class);

    User user1 = mapper1.getUserById(1);
    System.out.println(user1.getName());

    SqlSession sqlSession2 = MybatisUtil.getSqlSessionFactory().openSession();
    UserMapper mapper2 = sqlSession2.getMapper(UserMapper.class);

    User user2 = mapper2.getUserById(1);
    System.out.println(user2.getName());

    sqlSession1.close();
    sqlSession2.close();
}
Mybatis与Spring集成

Mybatis与Spring的整合步骤

  1. 引入依赖:在pom.xml文件中引入Mybatis和Spring的相关依赖。
<dependency>
    <groupId>org.mybatis.spring</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>2.0.6</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.3.10</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.3.10</version>
</dependency>
  1. 配置数据源:在Spring配置文件中配置数据源。
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
    <property name="username" value="root"/>
    <property name="password" value="password"/>
</bean>
  1. 创建SqlSessionFactory Bean:配置SqlSessionFactory Bean来生成SqlSession。
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="mapperLocations" value="classpath*:mapper/*.xml"/>
</bean>
  1. 配置Mapper扫描器:使用Mapper扫描器自动扫描Mapper接口。
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.example.mapper"/>
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>

使用Spring管理Mybatis的SqlSessionFactory

在Spring配置文件中定义SqlSessionFactory Bean,并将其注入到需要使用的地方。

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

Spring注解方式配置Mapper接口

可以使用@Mapper注解来标记Mapper接口,让Spring自动扫描注册这些接口。

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

在Mapper接口中使用@Mapper注解:

import org.apache.ibatis.annotations.Mapper;

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

示例代码:


import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringMybatisApp {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserMapper mapper = context.getBean(UserMapper.class);

        List<User> users = mapper.getAllUsers();
        for (User user : users) {
            System.out.println(user);
        }
    }
}
``

通过以上步骤,可以将Mybatis与Spring集成,利用Spring的依赖注入和事务管理功能,从而简化Mybatis的配置和使用。
點擊查看更多內容
TA 點贊

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

評論

作者其他優質文章

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

100積分直接送

付費專欄免費學

大額優惠券免費領

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

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

幫助反饋 APP下載

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

公眾號

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

舉報

0/150
提交
取消