Mybatis是一款优秀的持久层框架,支持自定义SQL、存储过程以及高级映射,简化了数据库操作。本文将详细介绍Mybatis的安装与配置、核心概念、环境搭建以及CRUD操作等内容,帮助读者掌握Mybatis持久层框架学习。
Mybatis基础介绍Mybatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。Mybatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集,使用简单的 XML 或注解进行配置和原始映射,并将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)进行映射,将数据库返回的记录转换成易于操作的 Java 对象。
Mybatis的核心概念和术语Mybatis 的核心概念和术语如下:
- SqlSessionFactory:工厂模式,用于创建 SqlSession 的类。
- SqlSession:数据库会话对象,用于执行数据库操作。
- Mapper:映射接口,包含持久化操作的接口。
- Executor:执行器,负责管理和执行映射语句。
- Configuration:配置信息,封装了配置文件中的所有配置信息。
- MappedStatement:映射语句,封装了映射文件中的 SQL 语句。
- ParameterMapping:SQL 语句中的参数映射。
- ResultMap:定义了 SQL 语句结果集的映射规则。
- ResultSetHandler:结果集处理器,负责将数据库查询结果转换为 Java 对象。
示例代码
Java 类示例:
package com.example.dao;
public class User {
private int id;
private String name;
private int age;
// 构造器、getters 和 setters 方法
}
映射接口示例:
package com.example.mapper;
public interface UserMapper {
int insert(User user);
int delete(int id);
int update(User user);
List<User> selectAll();
}
Mybatis的安装与配置
安装步骤
- 下载 Mybatis 软件包,解压后放到需要使用的项目中。
- 配置 Mybatis 的全局配置文件
mybatis-config.xml
,该文件位于项目的resources
目录下。 - 配置数据库连接信息,创建数据库连接池。
- 配置数据映射文件
mapper.xml
,该文件用于描述 SQL 语句的执行。
全局配置文件
一个典型的 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>
<properties resource="db.properties"/>
<typeAliases>
<typeAlias type="com.example.dao.User" alias="User"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/example/dao/UserMapper.xml"/>
</mappers>
</configuration>
数据库连接池配置
数据库连接信息通常放在 db.properties
文件中,如下所示:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis
username=root
password=root
在 mybatis-config.xml
中引用该文件。
在开发工具中创建一个新的 Java 项目,例如使用 IntelliJ IDEA 或 Eclipse。需要安装 JDK,然后在开发工具中创建一个新的 Java 项目。
Maven项目的创建与配置
使用 Maven 管理项目依赖及构建,示例项目结构如下:
project-root
|-- pom.xml
|-- src
|-- main
|-- java
|-- resources
|-- db.properties
|-- mybatis-config.xml
|-- mapper
|-- UserMapper.xml
|-- test
|-- java
|-- com.example.test
|-- UserMapperTest.java
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>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
</dependencies>
</project>
Mybatis的项目集成
- 将 Mybatis 的配置文件
mybatis-config.xml
放在resources
目录下。 - 引用配置文件中的数据库连接信息并配置 Mybatis 映射文件。
- 创建 Java 类,定义持久化对象的映射接口。
增加数据
创建数据库表:
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
Java 代码示例:
package com.example.dao;
public class User {
private int id;
private String name;
private int age;
// 构造器、getters 和 setters 方法
}
package com.example.mapper;
import com.example.dao.User;
public interface UserMapper {
int insert(User user);
}
Mapper XML:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">
<insert id="insert" parameterType="com.example.dao.User">
INSERT INTO user(name, age) VALUES (#{name}, #{age})
</insert>
</mapper>
删除数据
Java 代码示例:
package com.example.mapper;
public interface UserMapper {
int delete(int id);
}
Mapper XML:
<delete id="delete" parameterType="int">
DELETE FROM user WHERE id = #{id}
</delete>
修改数据
Java 代码示例:
package com.example.mapper;
public interface UserMapper {
int update(User user);
}
Mapper XML:
<update id="update" parameterType="com.example.dao.User">
UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}
</update>
查询数据
Java 代码示例:
package com.example.mapper;
import java.util.List;
public interface UserMapper {
List<User> selectAll();
}
Mapper XML:
<select id="selectAll" resultType="com.example.dao.User">
SELECT * FROM user
</select>
映射文件中的标签解析
<insert>
:插入数据。<delete>
:删除数据。<update>
:更新数据。<select>
:查询数据。
映射文件的基本结构
映射文件 UserMapper.xml
的结构如下:
<mapper namespace="com.example.mapper.UserMapper">
<insert id="insert" parameterType="com.example.dao.User">
INSERT INTO user(name, age) VALUES (#{name}, #{age})
</insert>
<delete id="delete" parameterType="int">
DELETE FROM user WHERE id = #{id}
</delete>
<update id="update" parameterType="com.example.dao.User">
UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}
</update>
<select id="selectAll" resultType="com.example.dao.User">
SELECT * FROM user
</select>
</mapper>
如何编写映射文件
namespace
:映射文件对应的接口。id
:映射文件中的 SQL 语句的唯一标识符。parameterType
:SQL 语句中参数的数据类型。resultType
:结果集映射的 Java 类型。
映射文件中的标签解析
<insert>
:插入数据。<delete>
:删除数据。<update>
:更新数据。<select>
:查询数据。
动态SQL的基本使用
动态 SQL 是 Mybatis 的一个强大特性,它允许你根据条件动态生成 SQL 语句。
Java 代码示例:
package com.example.mapper;
import java.util.List;
public interface UserMapper {
List<User> selectByCondition(User condition);
}
Mapper XML:
<select id="selectByCondition" parameterType="com.example.dao.User" resultType="com.example.dao.User">
SELECT * FROM user
<where>
<if test="name != null">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</where>
</select>
if标签的应用
Java 代码示例:
package com.example.mapper;
import java.util.List;
public interface UserMapper {
List<User> selectByCondition(User condition);
}
Mapper XML:
<select id="selectByCondition" parameterType="com.example.dao.User" resultType="com.example.dao.User">
SELECT * FROM user
<where>
<if test="name != null">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</where>
</select>
choose标签的应用
Java 代码示例:
package com.example.mapper;
import java.util.List;
public interface UserMapper {
List<User> selectByCondition(User condition);
}
Mapper XML:
<select id="selectByCondition" parameterType="com.example.dao.User" resultType="com.example.dao.User">
SELECT * FROM user
<where>
<choose>
<when test="name != null">
AND name = #{name}
</when>
<when test="age != null">
AND age = #{age}
</when>
<otherwise>
AND id = 1
</otherwise>
</choose>
</where>
</select>
foreach标签的应用
Java 代码示例:
package com.example.mapper;
import java.util.List;
import java.util.ArrayList;
public interface UserMapper {
List<User> selectByIds(ArrayList<Integer> ids);
}
Mapper XML:
<select id="selectByIds" parameterType="java.util.List" resultType="com.example.dao.User">
SELECT * FROM user WHERE id IN
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
</select>
Mybatis的高级特性
结果集的处理
Mybatis 支持多种结果集的处理方式,例如:
Java 代码示例:
package com.example.mapper;
import java.util.List;
public interface UserMapper {
List<User> selectUsers();
}
Mapper XML:
<select id="selectUsers" resultMap="UserResultMap">
SELECT id, name, age FROM user
</select>
<resultMap id="UserResultMap" type="com.example.dao.User">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
</resultMap>
分页查询
可以使用 Mybatis 的 RowBounds
类进行简单的分页查询。
Java 代码示例:
package com.example.mapper;
import java.util.List;
import org.apache.ibatis.session.RowBounds;
public interface UserMapper {
List<User> selectByRowBounds(User condition, RowBounds rowBounds);
}
Mapper XML:
<select id="selectByRowBounds" parameterType="java.lang.Integer" resultType="com.example.dao.User">
SELECT * FROM user
<if test="offset != null and limit != null">
LIMIT #{offset}, #{limit}
</if>
</select>
事务管理
Mybatis 支持事务管理,可以通过配置文件或编程方式来管理事务。
在 mybatis-config.xml
中配置事务管理器:
<transactionManager type="JDBC"/>
在 Java 代码中执行事务:
package com.example.test;
import com.example.mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class UserMapperTest {
private SqlSessionFactory sqlSessionFactory;
public UserMapperTest() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
public void testTransaction() {
try (SqlSession session = sqlSessionFactory.openSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
mapper.insert(new User(1, "Tom", 20));
mapper.insert(new User(2, "Jerry", 25));
// 提交事务
session.commit();
} catch (Exception e) {
e.printStackTrace();
}
}
}
以上是 Mybatis 的基本概念和一些高级特性,通过这些内容,你可以更深入地了解和掌握 Mybatis 的使用。