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

Mybatis持久层框架资料入门教程

标签:
Java SSM 数据库
概述

Mybatis是一个优秀的持久层框架,支持自定义SQL和存储过程,避免了手动设置参数和获取结果集的繁琐操作。本文详细介绍了Mybatis的基本概念、优势、应用场景以及安装与环境配置等,旨在帮助读者全面了解Mybatis持久层框架资料。

Mybatis简介

Mybatis是一个优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。Mybatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。Mybatis可以使用XML或注解作为配置和原始映射。Mybatis能够与各种数据库进行交互,包括MySQL、Oracle、SQL Server、DB2、SQLite等。

Mybatis的基本概念

Mybatis的核心部分是一个名为SqlSession的接口,它是执行Mybatis所有功能的入口。SqlSession负责执行预定义的SQL语句,并返回对应的数据。它提供了查询、插入、更新和删除语句的操作方法。SqlSession的实现依赖于SqlSessionFactory,SqlSessionFactory通过SqlSessionFactoryBuilder的build方法来创建。SqlSessionFactory是一个工厂接口,它负责创建SqlSession。SqlSession提供了执行SQL语句的方法,如:select、insert、update和delete。

SqlSessionFactory的创建

SqlSessionFactory的创建依赖于一个配置文件,该配置文件包含了数据库连接信息和映射文件的路径。SqlSessionFactoryBuilder通过解析该配置文件创建SqlSessionFactory。

// 创建SqlSessionFactory
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("SqlMapConfig.xml"));

// 通过SqlSessionFactory创建SqlSession
SqlSession session = factory.openSession();

SqlSession的使用

SqlSession是一个代表Mybatis会话的接口,它能够执行各种SQL语句,并提供相应的方法来获取查询结果。SqlSession还提供了一些工具方法来获得映射器接口的实例。

// 通过SqlSession执行查询
List<User> users = session.selectList("com.example.mapper.UserMapper.selectUsers");

// 使用映射器接口进行操作
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.getUserById(1);
Mybatis的优势和应用场景

Mybatis的优势

  1. 轻量级框架:Mybatis是轻量级的持久层框架,只需要很少的配置就可以完成数据库的操作。
  2. 灵活的SQL:Mybatis允许使用原始的SQL来查询数据库,提供了强大的灵活性。
  3. 易于扩展:Mybatis的插件机制允许在运行时插件任何第三方的数据库中间件。
  4. 与数据库无关:Mybatis可以运行在任何支持JDBC的数据库上。
  5. 性能优越:Mybatis的性能优于大部分ORM框架,因为它没有中间层的封装,直接操作数据库。

Mybatis的应用场景

  1. 需要灵活性:当应用需要灵活的SQL查询时,Mybatis是一个很好的选择。
  2. 数据库操作频繁:对于频繁的数据库操作,Mybatis的性能优于其他ORM框架。
  3. 需要高性能:当性能成为系统的重要指标时,Mybatis是非常合适的。
  4. 需要与数据库紧密集成:当应用需要直接操作数据库,并且对数据库有深入了解时,Mybatis是一个不错的选择。
Mybatis的安装与环境配置

安装步骤

  1. 下载Mybatis:可以从Mybatis官网下载Mybatis的jar包。
  2. 配置数据库连接:需要在Mybatis的配置文件中配置数据库连接信息。
  3. 编写映射文件:定义SQL语句和Java对象之间的映射关系。
  4. 编写Java代码:通过Mybatis提供的API进行数据库的操作。

配置文件

Mybatis的配置文件主要用于配置数据库连接信息、环境配置、映射文件路径等。配置文件是一个XML文件,通常命名为SqlMapConfig.xml

<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/example/mapper/UserMapper.xml"/>
  </mappers>
</configuration>

Java环境配置

Mybatis需要Java环境的支持,需要设置Java的环境变量,并在IDE中配置好相应的库。

// 设置环境变量
System.setProperty("java.library.path", "path/to/mysql/jdbc/lib");

运行环境

  1. JDK:需要安装JDK,并配置环境变量。
  2. IDE:推荐使用IntelliJ IDEA或Eclipse。
  3. 数据库:需要安装并配置好数据库。
Mybatis的基本使用
Mybatis的配置文件详解

核心配置文件

Mybatis的核心配置文件通常命名为SqlMapConfig.xml,主要包含以下几个部分:

  1. 环境配置:配置数据库连接信息。
  2. 映射文件:定义SQL语句和Java对象之间的映射关系。
  3. 类型别名:定义Java对象和字符串之间的映射关系。
  4. 插件配置:配置Mybatis的插件。
    <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/example/mapper/UserMapper.xml"/>
    </mappers>
    <typeAliases>
    <typeAlias type="com.example.model.User" alias="User"/>
    </typeAliases>
    </configuration>

映射文件

映射文件主要用于定义SQL语句和Java对象之间的映射关系,通常命名为UserMapper.xml

<mapper namespace="com.example.mapper.UserMapper">
  <select id="selectUserById" resultType="User">
    SELECT * FROM user WHERE id = #{id}
  </select>
</mapper>
Mybatis的映射文件编写

映射文件主要包含以下几个部分:

  1. 映射器接口:定义映射器接口,用于执行SQL语句。
  2. SQL语句:定义SQL语句,包括查询、插入、更新和删除语句。
  3. 结果映射:定义结果映射,用于将查询结果映射到Java对象。
    <insert id="insertUser" parameterType="com.example.model.User">
    INSERT INTO user (id, name, age) VALUES (#{id}, #{name}, #{age})
    </insert>

映射器接口

映射器接口是映射文件的核心部分,定义了SQL语句的ID和返回类型。

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

SQL语句

SQL语句定义了具体的SQL语句,包括查询、插入、更新和删除语句。

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

结果映射

结果映射定义了查询结果和Java对象之间的映射关系。

<resultMap id="UserResultMap" type="User">
  <id property="id" column="id"/>
  <result property="name" column="name"/>
  <result property="age" column="age"/>
</resultMap>
Mybatis的增删改查操作

查询操作

查询操作是最基本的操作之一,可以通过映射器接口或SQL语句来执行查询操作。

// 通过映射器接口执行查询
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.selectUserById(1);

// 通过SqlSession执行查询
List<User> users = session.selectList("com.example.mapper.UserMapper.selectUserById", 1);

插入操作

插入操作用于将数据插入到数据库中,可以通过映射器接口或SQL语句来执行插入操作。

// 通过映射器接口执行插入
UserMapper mapper = session.getMapper(UserMapper.class);
User user = new User();
user.setId(1);
user.setName("John");
user.setAge(25);
mapper.insertUser(user);

// 通过SqlSession执行插入
User user = new User();
user.setId(1);
user.setName("John");
user.setAge(25);
session.insert("com.example.mapper.UserMapper.insertUser", user);

更新操作

更新操作用于更新数据库中的数据,可以通过映射器接口或SQL语句来执行更新操作。

// 通过映射器接口执行更新
UserMapper mapper = session.getMapper(UserMapper.class);
User user = new User();
user.setId(1);
user.setName("John");
user.setAge(26);
mapper.updateUser(user);

// 通过SqlSession执行更新
User user = new User();
user.setId(1);
user.setName("John");
user.setAge(26);
session.update("com.example.mapper.UserMapper.updateUser", user);

删除操作

删除操作用于从数据库中删除数据,可以通过映射器接口或SQL语句来执行删除操作。

// 通过映射器接口执行删除
UserMapper mapper = session.getMapper(UserMapper.class);
mapper.deleteUserById(1);

// 通过SqlSession执行删除
session.delete("com.example.mapper.UserMapper.deleteUserById", 1);
Mybatis与数据库交互
Mybatis的动态SQL使用

Mybatis支持动态SQL的使用,可以通过<if><choose><when><otherwise>等标签来实现动态SQL的构建。

示例

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

Java代码

// 通过映射器接口执行查询
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> users = mapper.selectUserByCondition("John", 25);
Mybatis的关联查询

Mybatis支持关联查询,可以将多个表的数据关联起来进行查询。

示例

<select id="selectUserWithAddress" resultType="User">
  SELECT u.id, u.name, u.age, a.street, a.city, a.country
  FROM user u
  LEFT JOIN address a ON u.id = a.user_id
</select>

Java代码

// 通过映射器接口执行关联查询
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> users = mapper.selectUserWithAddress();
Mybatis的分页查询

Mybatis支持分页查询,可以通过<select>标签的limit属性来实现分页查询。

示例

<select id="selectUserWithPagination" resultType="User">
  SELECT * FROM user
  LIMIT #{offset}, #{limit}
</select>

Java代码

// 通过映射器接口执行分页查询
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> users = mapper.selectUserWithPagination(0, 10);
Mybatis的高级用法
Mybatis的缓存机制

Mybatis支持两种级别的缓存:一级缓存和二级缓存。

一级缓存

一级缓存是SqlSession级别的缓存,每个SqlSession都有自己的缓存。当执行查询时,Mybatis会先从缓存中查找数据,如果缓存中有数据,则直接返回缓存中的数据;否则,从数据库中查询数据并放入缓存中。

二级缓存

二级缓存是SqlSessionFactory级别的缓存,所有SqlSession共享同一个二级缓存。二级缓存需要在映射文件中开启。

<cache />

示例

// 开启二级缓存
<cache />
Mybatis的插件开发

Mybatis支持插件开发,可以通过插件来扩展Mybatis的功能。

@Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})})
public class MyPlugin implements Interceptor {
  @Override
  public Object intercept(Invocation invocation) throws Throwable {
    // 执行插件逻辑
    return invocation.proceed();
  }
}
Mybatis的延迟加载

Mybatis支持延迟加载,可以通过<resultMap>标签的lazyLoadingEnabled属性来启用延迟加载。

<resultMap type="User" lazyLoadingEnabled="true">
  <id property="id" column="id"/>
  <result property="name" column="name"/>
  <result property="age" column="age"/>
  <association property="address" column="address_id" select="selectAddressById" />
</resultMap>

Java代码

// 通过映射器接口执行查询
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.selectUserWithAddress();
Mybatis与其他框架的集成
Mybatis与Spring的集成

Mybatis可以与Spring框架进行集成,通过Spring的DataSourceSqlSessionFactory来管理数据库连接。

示例

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
  <property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
  <property name="username" value="root"/>
  <property name="password" value="password"/>
</bean>

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

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

Java代码

@Autowired
private UserMapper userMapper;

public void test() {
  List<User> users = userMapper.selectUserById(1);
}
Mybatis与Spring Boot的集成

Mybatis可以与Spring Boot进行集成,通过Spring Boot的DataSourceSqlSessionFactory来管理数据库连接。

示例

spring:
  application:
    name: mybatis-demo
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: password
    driver-class-name: com.mysql.jdbc.Driver

mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.example.model

Java代码

@SpringBootApplication
public class MybatisDemoApplication {
  public static void main(String[] args) {
    SpringApplication.run(MybatisDemoApplication.class, args);
  }
}
Mybatis与Mybatis Plus的结合使用

Mybatis Plus是对Mybatis的一个增强,提供了许多便捷的方法来操作数据库。

示例

<dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>mybatis-plus-boot-starter</artifactId>
  <version>3.4.3</version>
</dependency>

Java代码

@Autowired
private UserMapper userMapper;

public void test() {
  User user = new User();
  user.setId(1);
  user.setName("John");
  user.setAge(25);
  userMapper.insert(user);
}
Mybatis的常见问题与解决方案
Mybatis运行时的常见错误及解决方法

错误一:SQL语法错误

org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: java.sql.SQLException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select * from user where id = ?' at line 1

解决方法:检查SQL语法是否正确。

错误二:找不到映射文件

org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: org.apache.ibatis.builder.BuilderException: Error trying to decide between cacheEnabled and lazyLoadingEnabled. Cause: org.apache.ibatis.builder.BuilderException: Error resolving a reference. Cause: org.apache.ibatis.builder.BuilderException: Can not find a Mapper with specified namespace 'com.example.mapper.UserMapper'.

解决方法:检查映射文件路径是否正确。

错误三:找不到数据库驱动

org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

解决方法:检查数据库驱动是否添加到项目中。

Mybatis性能优化技巧
  1. 使用缓存:开启Mybatis的缓存可以大大提高性能。
  2. 使用批量操作:通过<batch>标签可以实现批量操作。
  3. 使用连接池:使用连接池可以提高数据库连接的效率。
  4. 使用动态SQL:通过动态SQL可以减少不必要的SQL执行。
Mybatis的调试与日志记录

调试

Mybatis可以通过log.isDebugEnabled()来判断是否开启调试模式。

<configuration>
  <settings>
    <setting name="logImpl" value="STDOUT_LOGGING"/>
  </settings>
</configuration>

日志记录

Mybatis可以通过设置logImpl属性来启用日志记录。

<configuration>
  <settings>
    <setting name="logImpl" value="STDOUT_LOGGING"/>
  </settings>
</configuration>

示例

<configuration>
  <settings>
    <setting name="logImpl" value="SLF4J"/>
  </settings>
</configuration>

以上是关于Mybatis的一个全面的入门教程,涵盖了Mybatis的基本使用、高级用法以及与其他框架的集成,希望对你有所帮助。如果你有任何疑问或问题,可以在慕课网的社区中寻求帮助。

点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

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

举报

0/150
提交
取消