Mybatis是一款优秀的持久层框架,支持定制化SQL和存储过程,能够将Java类直接映射到数据库记录。本文将详细介绍Mybatis的基本概念、优势、环境搭建以及常用操作,帮助读者全面了解Mybatis持久层框架学习入门。
Mybatis简介MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 通过 XML 或注解配置描述来将 Java 类映射成数据库中的记录。它通过使用简单的 Java 操作来完成以前繁复的 JDBC 操作。
MyBatis 通过定义 XML 映射文件或注解来配置 SQL,能够将 SQL 执行结果映射为 Java 对象,使得 Java 对象与数据库的关系映射更加直接和灵活。
优势:
应用场景:
要使用 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.21</version> </dependency> </dependencies>
在 Maven 项目的 pom.xml 文件中添加 MyBatis 和数据库驱动的依赖:
<dependencies> <!-- 添加 MyBatis 依赖 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version> </dependency> <!-- 添加 MySQL 驱动依赖 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.21</version> </dependency> </dependencies>
MyBatis 的配置文件 mybatis-config.xml
通常包含以下内容:
<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> <typeAliases> <typeAlias type="com.example.entity.User" alias="User" /> </typeAliases> <mappers> <mapper resource="com/example/mapper/UserMapper.xml" /> </mappers> </configuration>
假设我们有一个名为 users
的表,其结构如下:
CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50), password VARCHAR(50) );Mybatis核心概念
SqlSessionFactory
用于创建 SqlSession
,而 SqlSession
用于执行数据库操作。
// 创建 SqlSessionFactory SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml")); // 使用 SqlSessionFactory 创建 SqlSession SqlSession session = factory.openSession();
映射文件通常定义 SQL 语句和结果映射,而 Mapper 接口定义了数据库操作方法。
<!-- UserMapper.xml --> <mapper namespace="com.example.mapper.UserMapper"> <select id="selectUserById" resultType="User"> SELECT * FROM users WHERE id = #{id} </select> </mapper>
// UserMapper.java public interface UserMapper { User selectUserById(int id); }
<select id="selectUserByIdWithDynamicSql" resultType="User"> SELECT * FROM users WHERE id = #{id} </select> <select id="selectUserByIdWithDynamicSql2" resultType="User"> SELECT * FROM users WHERE id = ${id} </select>
在 XML 配置文件中使用 #{...}
和 ${...}
的示例:
<update id="updateUserById"> UPDATE users SET username = #{username}, password = #{password} WHERE id = #{id} </update> <update id="updateUserByIdWithDynamicSql"> UPDATE users SET username = ${username}, password = ${password} WHERE id = ${id} </update>Mybatis常用操作
CRUD 操作指的是数据库的增删查改操作。下面我们将详细介绍 MyBatis 的 CRUD 操作。
<!-- UserMapper.xml --> <insert id="insertUser"> INSERT INTO users (id, username, password) VALUES (#{id}, #{username}, #{password}) </insert>
// UserMapper.java public interface UserMapper { int insertUser(User user); }
<delete id="deleteUserById"> DELETE FROM users WHERE id = #{id} </delete>
// UserMapper.java public interface UserMapper { int deleteUserById(int id); }
<select id="selectUserById" resultType="User"> SELECT * FROM users WHERE id = #{id} </select>
// UserMapper.java public interface UserMapper { User selectUserById(int id); }
<update id="updateUserById"> UPDATE users SET username = #{username}, password = #{password} WHERE id = #{id} </update>
// UserMapper.java public interface UserMapper { int updateUserById(User user); }
分页查询可以通过设置 RowBounds
来实现。
// 分页查询示例 List<User> users = session.selectList("com.example.mapper.UserMapper.selectUsersByPage", new User(), new RowBounds(0, 10));
MyBatis 通过 <if>
, <choose>
, <when>
, <otherwise>
标签来实现动态 SQL。
<select id="selectUserByCondition" resultType="User"> SELECT * FROM users <where> <if test="id != null"> AND id = #{id} </if> <if test="username != null"> AND username = #{username} </if> </where> </select>
假设我们有一个用户管理系统,包含增删查改操作和分页功能。
// UserMapper.java public interface UserMapper { int insertUser(User user); int deleteUserById(int id); User selectUserById(int id); int updateUserById(User user); List<User> getUsersByPage(int offset, int limit); }
<!-- UserMapper.xml --> <insert id="insertUser"> INSERT INTO users (id, username, password) VALUES (#{id}, #{username}, #{password}) </insert> <delete id="deleteUserById"> DELETE FROM users WHERE id = #{id} </delete> <select id="selectUserById" resultType="User"> SELECT * FROM users WHERE id = #{id} </select> <update id="updateUserById"> UPDATE users SET username = #{username}, password = #{password} WHERE id = #{id} </update> <select id="getUsersByPage" resultType="User"> SELECT * FROM users LIMIT #{offset}, #{limit} </select>Mybatis与Spring整合
Spring 是一个轻量级的企业级应用框架,它简化了 Java 应用程序的开发。Spring 对 MyBatis 的支持使我们能够方便地使用 MyBatis 的核心功能,包括依赖注入、AOP 支持、事务管理等。
<dependencies> <dependency> <groupId>org.mybatis.spring</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.6</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.3.10</version> </dependency> </dependencies>
<!-- applicationContext.xml --> <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/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="mapperLocations" value="classpath*:mapper/*.xml" /> </bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.example.mapper" /> <property name="sqlSessionFactory" ref="sqlSessionFactory" /> </bean>
@Mapper public interface UserMapper { @Select("SELECT * FROM users WHERE id = #{id}") User selectUserById(int id); @Insert("INSERT INTO users (id, username, password) VALUES (#{id}, #{username}, #{password})") void insertUser(User user); }Mybatis高级特性
MyBatis 提供了一级缓存和二级缓存,可以提高查询效率。
<cache/>
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
MyBatis 允许通过插件拦截特定的调用,以实现自定义的功能。
@Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})}) public class MyPlugin implements Interceptor { public Object intercept(Invocation invocation) throws Throwable { // 自定义逻辑 return invocation.proceed(); } }
批量操作可以提高数据库操作效率。
<insert id="insertUsers"> INSERT INTO users (id, username, password) VALUES <foreach item="item" index="index" collection="list" separator=","> (#{item.id}, #{item.username}, #{item.password}) </foreach> </insert>
@InsertProvider(type = UserMapperProvider.class, method = "insertUsers") int insertUsers(@Param("list") List<User> users);
通过以上详细介绍,我们可以看到 MyBatis 是一个非常强大和灵活的持久层框架,适用于各种复杂的应用场景。通过合理使用 MyBatis 的各种特性,可以极大提高数据库操作的效率和灵活性。