MyBatis是一种开源的Java持久化框架,它提供了一个简单而强大的方式来将Java对象与数据库之间进行映射。MyBatis在数据库访问层中起到了ORM(对象关系映射)的作用,使开发人员可以通过Java编程而不是SQL来进行数据库的操作。
简单易用:
MyBatis相对于其他ORM框架来说,配置简单、学习曲线较低,使用起来非常方便。
灵活性:
MyBatis并不强制开发人员完全使用对象映射的方式,可以使用原生SQL语句,从而灵活地控 制数据库操作。
高性能:
MyBatis直接使用JDBC执行SQL,没有额外的ORM操作开销,因此在性能上表现优异。
可定制性:
MyBatis提供了许多插件和扩展点,允许开发人员根据需要定制和扩展框架的功能。
动态SQL:
MyBatis支持动态SQL,可以根据条件动态生成SQL语句,避免了硬编码和大量重复代码。
支持存储过程和高级映射:
MyBatis支持存储过程的调用,并且提供了高级映射功能,可以处理复杂的数据库关系。
缓存支持:
MyBatis内置了一级缓存和二级缓存,可以提高查询性能。
注解支持:
除了XML配置外,MyBatis还支持使用注解来配置映射关系和SQL语句,使得代码更加紧凑。
MyBatis是一个功能强大、灵活且高性能的Java持久化框架,适用于各种规模的项目,特别是对于那些需要更多底层数据库操作控制的应用程序。它的使用可以减少大量的JDBC编码,并提供了很好的数据库访问抽象层。
org.mybatis
mybatis
3.5.0
mysql
mysql-connector-java
8.0.28
新建一个mybatis-config.xml文件在resource目录下作为mybatis的核心配置文件。
用于配置外部属性,这些属性可以在整个 MyBatis 配置文件中引用。它允许将一些常用的配置参数抽离出来,使得配置文件更加简洁和易于维护。
上图就是引入了一个jdbc的配置文件,其内容如下(resource属性代表resource资源目录下的某个配置文件):
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test_database?serverTimezone=GMT&useSSL=false
jdbc.username=root
jdbc.password=root
数据库8.0以上需要使用com.mysql.cj.jdbc.Driver,5.0则使用com.mysql.jdbc.Driver。
更多的设置可以参考MyBatis的官方文档MyBatis官方配置
用于为 Java 类型或包起一个别名。使用别名可以简化 MyBatis 配置文件,使得配置更加清晰、简洁,并且方便在映射文件中引用 Java 类型。它允许你为常用的 Java 类型指定别名,包括 Java 基本数据类型、Java 内置对象类型,以及自定义的 Java 类。通过定义别名,你可以在 MyBatis 配置文件和映射文件中使用别名来代替完整的 Java 类名,从而减少了冗余的全限定类名,提高了配置文件的可读性。
下面就是为某个包下的所有实体类统一设置别名
或者通过指定某一个全限定类名来设置别名,具体如下
用于配置插件(Plugins)。插件是一种可以在 MyBatis 执行过程中拦截方法调用,并对其进行自定义处理的组件。通过使用插件,我们可以在不修改原始代码的情况下,增强 MyBatis 的功能或添加自定义的功能。
其允其许你在 MyBatis 配置文件中声明一个或多个插件,并按顺序将它们应用于 SQL 语句执行过程中的不同阶段。每个插件都必须实现 MyBatis 的 Interceptor
接口,该接口包含了 intercept
方法,用于在方法调用前后执行自定义逻辑。
在mybatis配置中常用的插件为分页插件,下面是引入分页插件:
用于定义数据源环境。MyBatis 可以配置多个不同的数据源环境,每个环境对应不同的数据库连接配置,这样在不同的场景下可以切换不同的数据库配置。
其包其含一个或多个 environment
子元素,每个 environment
子元素用于定义一个数据源环境。在每个 environment
子元素中,需要指定一个数据源(DataSource)和一个事务管理器(TransactionManager)。
通常情况下,MyBatis 数据库连接池常用的实现是 POOLED
,它使用了内置的连接池来管理数据库连接。除了 POOLED
,MyBatis 还支持其他数据源实现,比如 UNPOOLED
和 JNDI
。
下面是一个常用环境配置:
这里结合了上面引入的配置文件的标签,从而实现一个动态的数据库配置设置。
用于指定映射器(Mapper)文件的位置。Mapper 文件用于定义 SQL 映射,即将 Java 对象与数据库表之间的映射关系。
其允许你在 MyBatis 配置文件中声明一个或多个映射器文件,这些文件可以是 XML 格式的映射器文件或者是注解方式的映射器接口。
常用的方法有:
指定mapper映射文件所对应的接口。
指定某个mapper映射文件。
上述两种方式在每次新建一个mapper对象时都需要再次指定新的文件,所以一般采用下面的方式一次性指定某个包,所有在这个包下的映射文件都会被映射。
注意:mapper映射文件和其对应的接口应该在同一个路径下且同名。
其他的配置属性不太常用,如果有业务需要可以参考官方文档mybatis官方文档中文版。
还有一个注意点是,所有的配置的属性需要按照一定的顺序进行摆放,否则会报错,顺序如下(从上到下)
在java目录下新建一个名为xxx.xxx.mapper的包,并创建实体类所对应的mapper接口。
接口中定义我们操作数据库所使用到的抽象方法。
在resource目录下同样新建一个xxx.xxx.mapper的包,并摆放mapper接口说对于的xml映射文件。
同理,在接口对应的xml文件中实现接口中的查询方法。
xml映射文件模板如下:
在实现接口上添加注解来实现数据库操作(对于简单的操作使用注解方式开发,复杂操作则通过使用编写mapper映射文件的方式)
在Test目录下创建一个对应的测试类,并测试方法。
使用MyBatis进行数据库操作的前提需要有以下几个步骤:
创建 SqlSessionFactory:在应用程序启动时,通过配置文件创建一个 SqlSessionFactory实例。SqlSessionFactory是 MyBatis 的主要入口,它负责创建 SqlSession
对象。
创建 SqlSession:每次进行数据库操作前,需要从 SqlSessionFactory
中获取一个 SqlSession
实例。SqlSession
提供了执行 SQL 查询、提交事务、关闭资源等操作的方法。
调用 Mapper 方法:在 SqlSession
中,你可以通过调用映射器接口(或者 XML 映射器文件中定义的方法)来执行 SQL 查询。MyBatis 会将方法调用映射到对应的 SQL 语句,并执行数据库操作。
处理结果:根据 Mapper 方法的返回类型,你可以得到数据库查询结果。如果是查询单个对象,可以得到一个 Java 对象;如果是查询多个结果,可以得到一个列表。
提交事务和关闭资源:如果进行了数据库修改操作,需要调用 commit()
方法提交事务。最后,记得调用 close()
方法关闭SqlSession
资源,释放连接池资源。
其具体实现为
工具类代码为:
public class SqlSessionUtil {
public static SqlSession getSqlSession() {
try {
String resource = "mybatis-config.xml";
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream(resource));
return sqlSessionFactory.openSession(true);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
在 MyBatis 的 Mapper 文件中,有一些常用的标签,用于定义 SQL 映射和配置与数据库操作相关的信息。以下是这些标签的详细解释:
1.
namespace
:指定 Mapper 接口或类的完整路径,用于与对应的 Java 接口或类建立映射关系。2.
id
:结果映射的唯一标识。type
:映射结果集的目标 Java 类型。extends
:可选属性,用于继承父 resultMap
,实现结果映射的复用。
:用于定义主键属性与数据库字段的映射关系。
:用于定义非主键属性与数据库字段的映射关系。
:用于定义一对多(或多对多)关联关系的映射。
:用于定义一对一(或多对一)关联关系的映射。
3.
property
:Java 对象的属性名。column
:数据库表中的列名。4.
property
:Java 对象的属性名。column
:数据库表中的列名。5.
property
:Java 对象中表示集合属性的属性名。ofType
:集合元素的类型,可以使用别名或完整类名。select
:可选属性,用于指定关联对象的查询语句。fetchType
:可选属性,用于指定关联对象的加载策略,可以是 lazy 或 eager。
:用于定义主键属性与数据库字段的映射关系。
:用于定义非主键属性与数据库字段的映射关系。
:用于定义一对一(或多对一)关联关系的映射。
6.
标签用于定义一对一关联关系的映射。property
:Java 对象中表示关联属性的属性名。javaType
:关联对象的类型,可以使用别名或完整类名。select
:可选属性,用于指定关联对象的查询语句。fetchType
:可选属性,用于指定关联对象的加载策略,可以是 lazy 或 eager。
:用于定义主键属性与数据库字段的映射关系。
:用于定义非主键属性与数据库字段的映射关系。7.
id
:查询语句的唯一标识。resultType
:查询结果的目标 Java 类型,可以使用别名或完整类名。parameterType
:查询语句的参数类型,可以使用别名或完整类名。8.
id
:插入语句的唯一标识。parameterType
:插入语句的参数类型,可以使用别名或完整类名。9.
id
:更新语句的唯一标识。parameterType
:更新语句的参数类型,可以使用别名或完整类名。10.
id
:删除语句的唯一标识。parameterType
:删除语句的参数类型,可以使用别名或完整类名。11.
12.
、
、
标签用于包含多个
和一个
子元素。
标签用于定义条件判断和 SQL 语句片段,当条件满足时执行。
标签用于定义默认的 SQL 语句片段,当所有条件都不满足时执行。13.
collection
:集合参数的名称。item
:循环变量的名称。open
:循环体的开始字符。close
:循环体的结束字符。separator
:每个循环体之间的分隔符。14.
prefixOverrides
:去除 SQL 语句头部的字符。suffixOverrides
:去除 SQL 语句尾部的字符。以上是 MyBatis Mapper 文件中常用的标签,它们用于定义映射规则和动态生成 SQL 语句,使得数据库操作更加方便和灵活。在实际开发中,根据业务需求,可以灵活运用这些标签来实现各种复杂的数据库操作。
(1)@Select
(2)@Insert
(3)@Update
(4)@Delete
(5)@Results
标签。(6)@Result
和
标签。(7)@MapKey
(8)@Options
(9)@Flush
(10)@ConstructorArgs
(11)@Arg
(12)@Lang
(13)@LangDriver
(14)@SelectKey
@Options(useGeneratedKeys=true)
。(15)@One
(16)@Many
(17)@TypeDiscriminator
标签。(18)@ResultMap
或 @Results
。(19)@ResultType
(20)@Script
(21)@Provider
(22)@Param
//用户的Mapper接口
public interface UserMapper {
/**
* 查询用户和其所对应的日志列表
* 按Id查询一个用户及其对应的所有日志
* 进行一个分步查询
* 首先按用户编号查询一个用户信息,
* 然后通过当前的用户ID去调用日志接口中按用户编号查询日志列表的抽象方法
* 其中@Many注解说明查询结果为一个对象列表
*/
@Select("SELECT * FROM t_user WHERE user_id = #{userId}")
@Results({
@Result(property = "user_id", column = "userId"),
@Result(property = "user_name", column = "userName"),
@Result(property = "user_email", column = "userEmail"),
@Result(property = "logs", column = "user_id", javaType = List.class, many = @Many(select = "LogMapper.getLogsByUserId"))
})
TUser getUserLogsByUserId(@Param("userId") int userId);
/**
* 查询用户和其所对应的日志列表
* 按Id查询一个用户信息
*/
@Select("SELECT * FROM t_user WHERE user_id = #{userId}")
TUser getUserById(@Param("userId") int userId);
}
//日志的Mapper接口
public interface LogMapper {
/**
* 按用户Id查询其对应的所有日志
* 进行一个分步查询
* 首先按用户编号查询所有日志信息
* 然后通过每个日志对应的用户ID去调用用户接口中按用户编号查询用户的抽象方法
* 其中@one注解说明查询结果为一个实体对象
*/
@Select("SELECT * FROM t_log WHERE user_id = #{userId}")
@Results({
@Result(property = "log_id", column = "logId"),
@Result(property = "message", column = "message"),
@Result(property = "userId", column = "user_id"),
@Result(property = "user", column = "user_id", javaType = TUser.class, one = @One(select = "UserMapper.getUserById"))
})
List getLogsByUserId(@Param("userId") int userId);
}
#{}
占位符来引用参数,不要直接拼接参数值,以避免 SQL 注入风险。@Param
注解给参数命名,以在 SQL 语句中引用参数。注意避免使用无意义的参数名,保持可读性。如果方法只有一个参数,可以省略 @Param
注解,MyBatis 会自动将该参数命名为 "arg0"。总之,使用 MyBatis 注解时,要确保注解的正确性,避免常见错误,同时合理使用缓存以提高性能,注意错误处理和异常情况的处理。根据具体的业务场景和性能需求,灵活选择注解和 XML 的混用,以及合适的缓存策略。
MyBatis 提供了两级缓存机制。
缓存可以有效地减少数据库查询次数,提高系统性能。但是,缓存也可能导致数据不一致的问题,因为在某些情况下,缓存中的数据可能与数据库中的数据不一致。为了避免数据不一致的问题,MyBatis 对缓存的管理是非常谨慎的,确保在合适的时机进行缓存的更新和清空。
可以通过在 MyBatis 配置文件中进行相关配置来调整缓存的行为,例如开启/关闭二级缓存、选择不同的缓存实现等。同时,在 Mapper XML 文件中也可以使用
标签来对某个 Mapper 的缓存进行更细粒度的配置。
请注意,虽然缓存可以提高性能,但在某些场景下,缓存可能会带来不必要的复杂性和问题,所以在使用缓存时,需要根据具体的业务需求和数据访问模式来合理配置和使用。
com.github.pagehelper
pagehelper
5.2.0
com.github.jsqlparser
jsqlparser
3.2
// 在查询方法前调用 PageHelper.startPage 方法放入分页参数
// pageNum:当前传入的页码
// pageSize:分页的页大小
PageHelper.startPage(pageNum, pageSize);
// 执行查询语句,MyBatis 将自动进行分页查询
List userList = userMapper.selectUsers();
// 将查询结果放入PageInfo对象中,获取分页结果
PageInfo pageInfo = new PageInfo<>(userList);
org.mybatis.generator
mybatis-generator-core
1.4.2
http://mybatis.org/dtd/mybatis-generator-config_1.0.dtd
若是上述代码爆红,则代表文件缺失,可以先查询是否正确引入了依赖。若已引入了依赖但仍然无法解决,则可以通过以下两个方法:
package com.jay.utils;
import org.apache.ibatis.io.Resources;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.exception.InvalidConfigurationException;
import org.mybatis.generator.exception.XMLParserException;
import org.mybatis.generator.internal.DefaultShellCallback;
import java.io.IOException;
import java.io.InputStream;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
/**
* @Author jay_mosu
* @Date 2023/8/5 0005 20:29
* @PackageName com.jay.utils
* @ClassName GeneratorUtil
* @Description TODO
* @Version 1.0
*/
public class GeneratorUtil {
public static void generateCode() throws SQLException, IOException, InterruptedException, InvalidConfigurationException, XMLParserException {
List warnings = new ArrayList<>();
boolean overwrite = true;
// Load the MyBatis Generator configuration file
InputStream configFile = Resources.getResourceAsStream("GeneratorConfig.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
}
}
package com.jay.test;
import com.jay.utils.GeneratorUtil;
import org.junit.Test;
/**
* @Author jay_mosu
* @Date 2023/8/5 0005 21:01
* @PackageName com.jay.test
* @ClassName GeneratorTest
* @Description TODO
* @Version 1.0
*/
public class GeneratorTest {
@Test
public void name() {
try {
GeneratorUtil.generateCode();
System.out.println("Code generation completed successfully.");
} catch (Exception e) {
e.printStackTrace();
System.out.println("Code generation failed.");
}
}
}
mybatis_1
org.mybatis.generator
mybatis-generator-maven-plugin
1.4.2
true
true
mysql
mysql-connector-java
8.0.28
在开发过程中,为了减少编写的代码量,使用mybatis逆向工程可以省略大部分代码的编写,如果想增加其他操作,只需要在其基础上添加新的mapper接口方法来满足操作需求。其具体的一些配置可以参考官网mybatis逆向生成官方文档。
以上是关于MyBatis的一些介绍和相关使用方法,下面是一些链接: