本文将详细介绍Mybatis的工作原理、环境搭建、核心配置以及CRUD操作等,旨在帮助开发者更好地理解和使用Mybatis持久层框架。
Mybatis简介Mybatis 是一个优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。Mybatis 可以将 Java 对象和数据库表进行映射,使得 Java 对象可以直接操作数据库表,而无需编写复杂的 SQL 语句。这大大简化了数据库操作,并提高了开发效率。
Mybatis 是一个持久层框架,遵循了“开放源代码”的原则,可以与各种数据库系统兼容。它通过 XML 配置文件或注解来实现数据库的持久化操作。Mybatis 相对于其他 ORM(Object-Relational Mapping)框架,如 Hibernate,提供了更多的灵活性和可控性,使得开发者可以自由地编写 SQL 语句,而不需要局限于框架提供的预定义方法。
Mybatis 的主要优势和特点如下:
Mybatis 的工作原理可以概括为以下几个步骤:
在开始使用 Mybatis 之前,需要准备好开发环境。以下是所需的开发环境:
为了简化依赖管理,我们使用 Maven 来创建 Mybatis 项目。以下是具体的步骤:
File -> New -> Project
,选择 Maven,填写 Group ID 和 Artifact ID。pom.xml
文件中配置项目信息。<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>mybatis-demo</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.7</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.23</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.14.0</version> </dependency> </dependencies> </project> `` ### 添加Mybatis依赖 在 `pom.xml` 文件中添加 Mybatis 依赖。以下是示例代码: ```xml <dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.7</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.23</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.14.0</version> </dependency> </dependencies> `` 上述代码中,添加了 Mybatis、MySQL 连接器和 Log4j 依赖。 ### 手动配置数据库连接 除了使用 Maven 依赖管理,还可以手动配置数据库连接。以下是一个示例配置: ```java public class JdbcUtils { private static final String URL = "jdbc:mysql://localhost:3306/mydatabase"; private static final String USERNAME = "root"; private static final String PASSWORD = "password"; public static SqlSessionFactory getSqlSessionFactory() throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); return sqlSessionFactory; } }Mybatis核心配置
Mybatis 的核心配置文件通常是 mybatis-config.xml
,该文件用于配置数据库连接、环境配置、类型处理器等。以下是一些常用的配置元素:
数据库连接配置通常包含数据库驱动、URL、用户名和密码等信息。以下是一个示例配置:
<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/mydatabase"/> <property name="username" value="root"/> <property name="password" value="password"/> </dataSource> </environment> </environments> </configuration>
映射文件通常用于定义 SQL 语句和 Java 对象之间的映射关系。映射文件通常放在 src/main/resources
目录下。以下是一个示例映射文件 UserMapper.xml
:
<mapper namespace="com.example.mapper.UserMapper"> <select id="selectUserById" resultType="com.example.entity.User"> SELECT * FROM users WHERE id = #{id} </select> </mapper>Mybatis CRUD操作
Mybatis 提供了丰富的 CRUD 操作,包括增删改查等。以下是一些常用的 CRUD 操作示例:
public int insertUser(User user) { SqlSession session = sqlSessionFactory.openSession(); try { session.insert("com.example.mapper.UserMapper.insertUser", user); session.commit(); } finally { session.close(); } return user.getId(); }
public void deleteUser(int id) { SqlSession session = sqlSessionFactory.openSession(); try { session.delete("com.example.mapper.UserMapper.deleteUserById", id); session.commit(); } finally { session.close(); } }
public void updateUser(User user) { SqlSession session = sqlSessionFactory.openSession(); try { session.update("com.example.mapper.UserMapper.updateUser", user); session.commit(); } finally { session.close(); } }
public User selectUserById(int id) { SqlSession session = sqlSessionFactory.openSession(); try { return session.selectOne("com.example.mapper.UserMapper.selectUserById", id); } finally { session.close(); } }
SQL 映射配置文件 UserMapper.xml
用于定义 SQL 语句和 Java 对象之间的映射关系。以下是示例配置:
<mapper namespace="com.example.mapper.UserMapper"> <insert id="insertUser" parameterType="com.example.entity.User"> INSERT INTO users (name, age) VALUES (#{name}, #{age}) </insert> <delete id="deleteUserById" parameterType="int"> DELETE FROM users WHERE id = #{id} </delete> <update id="updateUser" parameterType="com.example.entity.User"> UPDATE users SET name = #{name}, age = #{age} WHERE id = #{id} </update> <select id="selectUserById" resultType="com.example.entity.User"> SELECT * FROM users WHERE id = #{id} </select> </mapper>
动态 SQL 用于根据运行时条件生成不同的 SQL 语句。以下是示例配置:
<mapper namespace="com.example.mapper.UserMapper"> <select id="selectUserByCondition" resultType="com.example.entity.User"> SELECT * FROM users WHERE 1=1 <if test="name != null"> AND name = #{name} </if> <if test="age != null"> AND age = #{age} </if> </select> </mapper>Mybatis与XML映射文件
映射文件用于定义 SQL 语句和 Java 对象之间的映射关系。映射文件通常放在 src/main/resources
目录下,并以 .xml
为扩展名。
映射文件的编写规则如下:
Mybatis 支持多表关联查询,可以通过嵌套查询或嵌套结果集来实现。以下是示例配置:
<mapper namespace="com.example.mapper.UserMapper"> <resultMap id="userResultMap" type="com.example.entity.User"> <id property="id" column="id"/> <result property="name" column="name"/> <association property="address" javaType="com.example.entity.Address"> <id property="id" column="address_id"/> <result property="street" column="street"/> </association> </resultMap> <select id="selectUserWithAddress" resultMap="userResultMap"> SELECT u.*, a.* FROM users u LEFT JOIN addresses a ON u.address_id = a.id </select> </mapper>Mybatis高级特性
Mybatis 提供了多种结果集处理方式,包括嵌套查询和嵌套结果集。以下是示例配置:
<mapper namespace="com.example.mapper.UserMapper"> <select id="selectUserWithAddress" resultMap="userResultMap"> SELECT u.* FROM users u </select> <resultMap id="userResultMap" type="com.example.entity.User"> <id property="id" column="id"/> <result property="name" column="name"/> <association property="address" column="address_id" select="selectAddressById"/> </resultMap> <select id="selectAddressById" resultType="com.example.entity.Address"> SELECT * FROM addresses WHERE id = #{id} </select> </mapper>
<mapper namespace="com.example.mapper.UserMapper"> <select id="selectUserWithAddress" resultMap="userResultMap"> SELECT u.*, a.* FROM users u LEFT JOIN addresses a ON u.address_id = a.id </select> <resultMap id="userResultMap" type="com.example.entity.User"> <id property="id" column="u.id"/> <result property="name" column="u.name"/> <association property="address" javaType="com.example.entity.Address" column="address_id" select="selectAddressById"/> </resultMap> <select id="selectAddressById" resultType="com.example.entity.Address"> SELECT * FROM addresses WHERE id = #{id} </select> </mapper>
Mybatis 提供了一级缓存和二级缓存机制。
一级缓存是 Session 级别的缓存,当同一个 Session 中执行相同 SQL 语句时,Mybatis 会从缓存中直接返回结果,而不会重复执行 SQL 语句。
二级缓存是 Mapper 级别的缓存,可以跨 Session 使用。当不同的 Session 中执行相同 SQL 语句时,Mybatis 会从缓存中直接返回结果,而不会重复执行 SQL 语句。
以下是一个启用二级缓存的示例配置:
<cache />
Mybatis 提供了多种分页处理方式,包括使用 RowBounds 和 Mybatis 插件 Mybatis-Pagination。
public List<User> selectUserWithRowBounds(int offset, int limit) { SqlSession session = sqlSessionFactory.openSession(); try { return session.selectList("com.example.mapper.UserMapper.selectUser", null, new RowBounds(offset, limit)); } finally { session.close(); } }
Mybatis-Pagination 是一个 Mybatis 插件,用于简化分页操作。以下是示例配置:
<plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <property name="helperDialect" value="mysql"/> <property name="reasonable" value="true"/> </plugin> </plugins>
public List<User> selectUserWithPageHelper(int pageNum, int pageSize) { PageHelper.startPage(pageNum, pageSize); SqlSession session = sqlSessionFactory.openSession(); try { return session.selectList("com.example.mapper.UserMapper.selectUser"); } finally { session.close(); } }
通过以上配置和代码示例,可以更好地理解和使用 Mybatis 框架。希望这些内容能够帮助你快速上手 Mybatis 开发。