Mybatis是一款优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射,避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。本文详细介绍了Mybatis的工作原理、优势以及如何搭建开发环境。此外,还涵盖了Mybatis的基本操作、高级特性和与Spring框架的集成。
Mybatis持久层框架入门教程 Mybatis简介Mybatis是什么
Mybatis是一款优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。Mybatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。Mybatis可以使用XML或注解进行配置和原始映射,将接口和Java的POJOs(普通的Java对象)映射成数据库中的记录。
Mybatis的工作原理
Mybatis的工作原理可以归纳为以下步骤:
- 加载配置文件:Mybatis会加载用户提供的配置文件,该文件通常包含数据库连接信息、映射器等配置。
- 构建SqlSessionFactory:通过配置文件构建SqlSessionFactory,这是创建SqlSession的工厂。
- 创建SqlSession:使用SqlSessionFactory创建SqlSession,SqlSession是Mybatis中最重要的接口,它允许执行预定义的SQL映射语句。
- 执行SQL映射语句:SqlSession执行映射语句,并返回结果。这些映射语句可以是预定义的SQL语句或动态SQL语句。
- 处理结果集:结果集由Mybatis处理并映射为Java对象,然后返回给用户。
- 关闭SqlSession:当完成数据库操作后,关闭SqlSession以释放资源。
Mybatis的优势
- 灵活的SQL映射:Mybatis支持自定义SQL语句,允许使用存储过程和高级映射。
- 轻量级:Mybatis没有侵入式的框架结构,代码简洁,避免了ORM框架的复杂性。
- 与数据库兼容性好:Mybatis可以灵活地与多种数据库进行交互。
- 支持动态SQL:Mybatis允许在运行时动态生成SQL语句,增强了灵活性。
- 强大的社区支持:Mybatis拥有活跃的社区,提供了大量的文档和示例。
开发环境准备
在搭建Mybatis环境之前,需要准备以下开发环境:
- Java环境:确保已经安装了JDK。
- IDE:建议使用IntelliJ IDEA或Eclipse。
- 数据库:MySQL或其他关系型数据库。
- 构建工具:Maven或Gradle。
创建Maven项目并引入Mybatis依赖
创建一个Maven项目,并在pom.xml
文件中引入Mybatis依赖。下面是一个基本的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-example</artifactId>
<version>1.0-SNAPSHOT</version>
<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.23</version>
</dependency>
<!-- JUnit测试依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Mybatis的基本配置
Mybatis的基本配置包括配置数据库连接信息、映射文件等。下面是一个基本的Mybatis配置文件mybatis-config.xml
示例:
<?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.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>
<mappers>
<mapper resource="com/example/mapper/UserMapper.xml"/>
</mappers>
</configuration>
Mybatis核心概念解析
SqlSessionFactory和SqlSession
SqlSessionFactory:SqlSessionFactory是创建SqlSession的工厂。它是线程不安全的,但可以安全地在全局范围内访问。以下是创建SqlSessionFactory的代码示例:
// 创建SqlSessionFactory
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession:SqlSession提供了执行SQL语句的接口,它允许我们执行预定义的映射语句,也可以执行自定义的SQL语句。SqlSession是线程不安全的,因此在使用时应尽量避免重复创建。以下是使用SqlSession执行SQL语句的代码示例:
// 打开SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 使用SqlSession执行SQL语句
List<User> users = sqlSession.selectList("com.example.mapper.UserMapper.selectAllUsers");
Mapper接口和Mapper XML文件
Mapper接口:Mapper接口是定义了实际映射的方法接口。这些接口通常与映射器XML文件中的映射语句相对应。下面是一个简单的Mapper接口示例:
public interface UserMapper {
List<User> selectAllUsers();
}
Mapper XML文件:映射器XML文件定义了SQL映射语句,这些语句与Mapper接口中的方法相对应。下面是一个简单的Mapper XML文件示例:
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectAllUsers" resultType="com.example.User">
SELECT * FROM users
</select>
</mapper>
{}和${}的区别
在SQL映射语句中,#
和$
有不同的用途:
- #{}`:用于预编译参数,避免SQL注入攻击。
- ${}`:用于字符串拼接,直接替换占位符。
示例:
<select id="getUserById" resultType="com.example.User">
SELECT * FROM users WHERE id = #{id}
</select>
<select id="getUserById" resultType="com.example.User">
SELECT * FROM users WHERE id = ${id}
</select>
Mybatis基本操作
CRUD操作详解
CRUD操作指的是数据库中的基本操作,即创建(Create)、读取(Retrieve)、更新(Update)和删除(Delete)。下面是一个简单的CRUD示例:
创建(create)用户
public interface UserMapper {
int insertUser(User user);
}
<insert id="insertUser">
INSERT INTO users (name, email) VALUES (#{name}, #{email})
</insert>
读取(retrieve)用户
public interface UserMapper {
User getUserById(int id);
}
<select id="getUserById" resultType="com.example.User">
SELECT * FROM users WHERE id = #{id}
</select>
更新(update)用户
public interface UserMapper {
int updateUser(User user);
}
<update id="updateUser">
UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}
</update>
删除(delete)用户
public interface UserMapper {
int deleteUser(int id);
}
<delete id="deleteUser">
DELETE FROM users WHERE id = #{id}
</delete>
ResultMap的使用
ResultMap用于定义列名到Java对象属性的映射关系。它允许我们更灵活地处理复杂的映射关系。下面是一个简单的ResultMap示例:
<resultMap id="userResultMap" type="com.example.User">
<id column="user_id" property="id"/>
<result column="user_name" property="name"/>
<result column="user_email" property="email"/>
</resultMap>
使用ResultMap进行复杂查询
<select id="getUserByIdWithResultMap" resultMap="userResultMap">
SELECT user_id, user_name, user_email FROM users WHERE id = #{id}
</select>
一对多和多对多关联查询
一对多关联查询
一对多关联查询用于处理一个父对象与多个子对象的关系。下面是一个简单的例子:
public class User {
private int id;
private String name;
private String email;
private List<Address> addresses;
}
<resultMap id="userWithAddressResultMap" type="com.example.User">
<id column="user_id" property="id"/>
<result column="user_name" property="name"/>
<result column="user_email" property="email"/>
<collection property="addresses" ofType="com.example.Address">
<id column="address_id" property="id"/>
<result column="address_name" property="name"/>
</collection>
</resultMap>
多对多关联查询
多对多关联查询用于处理多个父对象与多个子对象的关系。下面是一个简单的例子:
public class User {
private int id;
private String name;
private String email;
private List<Role> roles;
}
<resultMap id="userWithRolesResultMap" type="com.example.User">
<id column="user_id" property="id"/>
<result column="user_name" property="name"/>
<result column="user_email" property="email"/>
<collection property="roles" ofType="com.example.Role">
<id column="role_id" property="id"/>
<result column="role_name" property="name"/>
</collection>
</resultMap>
Mybatis高级特性
分页查询
分页查询允许我们分批次地获取数据,而不是一次性加载所有数据。Mybatis提供了rowBounds
参数来进行分页查询。
public interface UserMapper {
List<User> getUsersByRowBounds(RowBounds rowBounds);
}
<select id="getUsersByRowBounds" resultType="com.example.User"
parameterType="com.example.RowBounds">
SELECT * FROM users
</select>
使用RowBounds进行分页
RowBounds rowBounds = new RowBounds(page * pageSize, pageSize);
List<User> users = sqlSession.selectList("com.example.mapper.UserMapper.getUsersByRowBounds", rowBounds);
动态SQL
动态SQL允许在运行时根据条件生成SQL语句。Mybatis提供了多种动态SQL标签,如if
、choose
、when
、otherwise
等。以下是一个动态生成SQL的示例:
<select id="getUserByCondition" resultType="com.example.User">
SELECT * FROM users
<where>
<if test="name != null">
AND name = #{name}
</if>
<if test="email != null">
AND email = #{email}
</if>
</where>
</select>
插入、更新时的主键回写
插入时的主键回写
<insert id="insertUser" keyProperty="id" useGeneratedKeys="true">
INSERT INTO users (name, email) VALUES (#{name}, #{email})
</insert>
更新时的主键回写
<update id="updateUser" useGeneratedKeys="true" keyProperty="id">
UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}
</update>
Mybatis与Spring集成
Spring和Mybatis集成的必要性
Spring框架提供了一种管理和配置Mybatis的方式,使得Mybatis的操作更加简洁和灵活。通过Spring管理SqlSessionFactory和SqlSession,可以简化Mybatis的集成,并提供事务管理等高级功能。
使用Spring管理SqlSessionFactory
在Spring配置文件中配置SqlSessionFactory。
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
</bean>
数据源配置
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" 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"/>
</bean>
使用注解驱动的Mapper
通过Spring的MapperScannerConfigurer
自动扫描并配置Mapper接口。
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.mapper"/>
</bean>
使用Mapper接口
@Autowired
private UserMapper userMapper;
示例代码
public interface UserMapper {
List<User> selectAllUsers();
}
public class UserService {
@Autowired
private UserMapper userMapper;
public List<User> getAllUsers() {
return userMapper.selectAllUsers();
}
}
共同学习,写下你的评论
评论加载中...
作者其他优质文章