Mybatis是一个优秀的持久层框架,它通过XML或注解的方式将SQL语句和Java代码分离,简化了数据访问层的开发。本文将详细介绍Mybatis持久层框架入门的相关内容,包括其基本概念、特点、应用场景以及核心配置等。
Mybatis简介 Mybatis的基本概念Mybatis 是一个支持普通 SQL 查询、存储过程和高级映射的优秀持久层框架。它通过 XML 或注解的方式将 SQL 语句和 Java 代码分离。Mybatis 既解决了 JDBC 代码冗余的问题,又简化了数据访问层的开发,使得 Java 程序员能够以最小的代价将传统 DAO 层代码转换为 DAO 层的持久化对象。
Mybatis 的特点如下:
- 简单易学:Mybatis 是一个非常易于上手的持久层框架。
- 灵活的 SQL 语句:Mybatis 允许使用原始的 SQL 来执行查询,支持编写复杂的 SQL 语句。
- 支持存储过程:可以使用存储过程来封装复杂的业务逻辑。
- 支持高级映射:支持一对一、一对多、多对多的关联映射。
- 支持自定义类型处理器:可以处理数据库的特殊类型。
- 支持延迟加载:可以与第三方缓存框架结合使用,提高查询速度。
- 配置简单:Mybatis 采用 XML 方式编写,配置文件易于维护。
Mybatis的优势
- 减少数据库相关操作代码:Mybatis 通过 XML 或注解的方式将 SQL 语句和 Java 代码分离,降低了数据库操作的复杂度。
- 支持复杂查询:Mybatis 支持复杂的 SQL 查询和存储过程,可以轻松地处理复杂的数据库操作。
- 支持动态 SQL:Mybatis 提供了动态 SQL 的功能,可以根据不同的条件生成不同格式的 SQL 语句,提高了代码的灵活性。
- 支持高级映射:Mybatis 支持一对一、一对多、多对多的关联映射,可以轻松地处理复杂的数据关系。
- 支持自定义类型处理器:Mybatis 支持自定义类型处理器,可以处理数据库的特殊类型,如自定义的日期类型、枚举类型等。
- 支持第三方缓存:Mybatis 支持与第三方缓存框架结合使用,可以提高查询速度,降低数据库压力。
Mybatis的应用场景
- 需要复杂 SQL 语句处理的项目:例如商业智能系统、数据仓库系统等。
- 需要动态 SQL 语句处理的项目:例如 CRM、ERP 系统等。
- 需要高性能查询的项目:例如电子商务系统、金融系统等。
下载 Mybatis
Mybatis 的最新版本可以在其官方网站或 Maven 中央仓库中找到。以 Mybatis 3.5.7 版本为例,下载后,需要解压到指定目录,以方便后续的使用。
Mybatis的集成
Mybatis 的集成可以通过 Maven、Gradle 或者手动添加 JAR 包来完成。这里以 Maven 为例,以下是 Maven 的依赖配置:
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
</dependencies>
手动添加 JAR 包的示例如下:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
Mybatis核心配置
Mybatis核心配置文件详解
核心配置文件结构
Mybatis 的核心配置文件是一个 XML 文件,通常命名为 mybatis-config.xml
。该配置文件主要包括以下几个部分:
- 数据库环境配置:配置数据库连接信息。
- 设置:配置 Mybatis 的运行环境。
- 映射文件:配置映射文件的位置。
- 类型别名:配置常用的类型别名。
- 映射器:配置映射器的位置。
一个典型的 Mybatis 配置文件结构如下:
<?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.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/example/mapper/UserMapper.xml"/>
</mappers>
</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/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environment>
数据库连接池的使用
数据库连接池可以显著提升应用程序的性能和效率。Mybatis 支持多种数据库连接池,如 POOLED
、JNDI
等。下面是一个使用 POOLED
连接池的示例:
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
其中 driver
、url
、username
和 password
分别表示数据库驱动类名、URL、用户名和密码。
设置部分
Mybatis 的运行环境配置可以通过 <settings>
标签进行设置,例如:
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
映射文件配置
映射文件通常定义在 mappers
标签中,如下:
<mappers>
<mapper resource="com/example/mapper/UserMapper.xml"/>
</mappers>
类型别名配置
类型别名可以通过 <typeAliases>
标签进行配置,如下:
<typeAliases>
<typeAlias alias="User" type="com.example.model.User"/>
<typeAlias alias="Order" type="com.example.model.Order"/>
</typeAliases>
Mybatis映射文件解析
映射文件的基本结构
Mybatis 的映射文件定义了 SQL 语句的执行方式和结果集的映射关系。一个典型的映射文件结构如下:
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectUserById" resultType="com.example.model.User">
SELECT * FROM user WHERE id = #{id}
</select>
<insert id="insertUser">
INSERT INTO user (id, name, age) VALUES (#{id}, #{name}, #{age})
</insert>
<update id="updateUser">
UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}
</update>
<delete id="deleteUserById">
DELETE FROM user WHERE id = #{id}
</delete>
</mapper>
SQL语句的编写与执行
Mybatis 支持 SELECT
、INSERT
、UPDATE
、DELETE
等基本 SQL 语句的编写与执行。
示例:插入用户信息
<insert id="insertUser">
INSERT INTO user (id, name, age) VALUES (#{id}, #{name}, #{age})
</insert>
示例:更新用户信息
<update id="updateUser">
UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}
</update>
示例:删除用户信息
<delete id="deleteUserById">
DELETE FROM user WHERE id = #{id}
</delete>
结果集映射配置
Mybatis 支持结果集的自动映射,可以将查询结果映射到 Java 对象中。例如,以下 SQL 语句查询用户信息:
<select id="selectUserById" resultType="com.example.model.User">
SELECT * FROM user WHERE id = #{id}
</select>
其中 resultType
属性指定了查询结果映射到哪个 Java 类。
示例:一对一映射
<resultMap id="User" type="com.example.model.User">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
<association property="address" javaType="com.example.model.Address">
<id column="address_id" property="id"/>
<result column="address_name" property="name"/>
</association>
</resultMap>
<select id="selectUserWithAddress" resultMap="User">
SELECT user.id, user.name, user.age, address.address_id, address.address_name
FROM user
LEFT JOIN address ON user.id = address.user_id
</select>
示例:一对多映射
<resultMap id="Order" type="com.example.model.Order">
<id column="order_id" property="id"/>
<result column="order_name" property="name"/>
<collection property="items" javaType="java.util.List" ofType="com.example.model.Item">
<id column="item_id" property="id"/>
<result column="item_name" property="name"/>
</collection>
</resultMap>
<select id="selectOrderWithItems" resultMap="Order">
SELECT order.order_id, order.order_name, item.item_id, item.item_name
FROM order
LEFT JOIN item ON order.id = item.order_id
</select>
Mybatis CRUD操作
基本的增删改查操作
Mybatis 提供了丰富的 SQL 语句支持,可以轻松地实现增删改查操作。
示例:查询用户信息
<select id="selectUserById" resultType="com.example.model.User">
SELECT * FROM user WHERE id = #{id}
</select>
示例:插入用户信息
<insert id="insertUser">
INSERT INTO user (id, name, age) VALUES (#{id}, #{name}, #{age})
</insert>
示例:更新用户信息
<update id="updateUser">
UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}
</update>
示例:删除用户信息
<delete id="deleteUserById">
DELETE FROM user WHERE id = #{id}
</delete>
动态SQL的使用
Mybatis 提供了动态 SQL 的功能,可以根据不同的条件生成不同格式的 SQL 语句。动态 SQL 通过 <if>
、<choose>
、<when>
、<otherwise>
等标签实现。
示例:动态SQL
<select id="selectUserByCondition" resultType="com.example.model.User">
SELECT * FROM user WHERE 1=1
<if test="id != null">
AND id = #{id}
</if>
<if test="name != null">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</select>
批量操作与事务处理
Mybatis 支持批量操作,可以提高批量插入、更新和删除的效率。事务处理可以确保数据的一致性。
批量操作
List<User> users = new ArrayList<>();
users.add(new User(1, "Tom", 20));
users.add(new User(2, "Jerry", 25));
users.add(new User(3, "Bob", 22));
userMapper.insertBatch(users);
事务处理
try {
sqlSession.beginTransaction();
userMapper.insertUser(new User(1, "Tom", 20));
userMapper.insertUser(new User(2, "Jerry", 25));
sqlSession.commit();
} catch (Exception e) {
sqlSession.rollback();
e.printStackTrace();
}
Mybatis与Spring集成
Spring与Mybatis整合的基本方法
Spring 与 Mybatis 的整合可以通过 Mybatis 的 SqlSessionFactory
和 SqlSessionTemplate
实现。以下是一个简单的整合示例:
@Configuration
public class MybatisConfig {
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource());
return factoryBean.getObject();
}
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/mybatis");
dataSource.setUsername("root");
dataSource.setPassword("123456");
return dataSource;
}
}
Mybatis的自动扫描与配置
Spring 支持 Mybatis 的自动扫描与配置,可以通过 MapperScannerConfigurer
实现。以下是一个简单的配置示例:
@Configuration
public class MybatisAutoScanConfig {
@Bean
public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
return factoryBean;
}
@Bean
public MapperScannerConfigurer mapperScannerConfigurer() {
MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
mapperScannerConfigurer.setBasePackage("com.example.mapper");
mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
return mapperScannerConfigurer;
}
}
Mybatis的接口方式调用
Spring 支持 Mybatis 的接口方式调用,可以通过 MapperFactoryBean
实现。以下是一个简单的接口示例:
public interface UserMapper {
User selectUserById(int id);
void insertUser(User user);
void updateUser(User user);
void deleteUserById(int id);
}
Mybatis的高级用法
分页查询
分页查询可以通过 Mybatis 的插件机制实现。以下是一个简单的插件示例:
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, new PageInterceptor());
}
@Override
public void setProperties(Properties properties) {
this.properties = properties;
}
缓存机制
Mybatis 支持一级缓存和二级缓存,可以提高查询速度,降低数据库压力。
一级缓存
一级缓存是 SqlSession 级别的缓存,每个 SqlSession 中都内置了一个缓存,用于缓存查询结果。当同一个 SqlSession 内部执行相同的查询语句时,会优先从缓存中获取数据,如果缓存中没有,再去数据库中查询。
二级缓存
二级缓存是 Mapper 级别的缓存,用于所有 SqlSession 之间的数据共享,可以缓存同一 Mapper 中的多个 SqlSession 的查询结果。二级缓存默认是关闭的,需要在配置文件中开启。
<cache/>
扩展插件使用
Mybatis 支持扩展插件机制,可以在 SQL 语句执行前后插入自定义的代码。以下是一个简单的插件示例:
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, new PerformanceInterceptor());
}
@Override
public void setProperties(Properties properties) {
this.properties = properties;
}
插件可以通过 @Intercepts
注解指定插桩的目标。
@Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})})
public class PerformanceInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
long start = System.currentTimeMillis();
Object result = invocation.proceed();
long end = System.currentTimeMillis();
System.out.println("执行时间:" + (end - start));
return result;
}
}
插件可以通过 @Signature
注解定义插桩的方法和参数。
以上是 Mybatis 的高级用法,包括分页查询、缓存机制和扩展插件使用。
共同学习,写下你的评论
评论加载中...
作者其他优质文章