Mybatis持久层框架教程介绍了Mybatis的基本概念、优点和应用场景,帮助开发者理解并使用Mybatis进行数据库操作。文章详细讲解了Mybatis的环境搭建、核心概念以及CRUD操作,并深入探讨了动态SQL和分页查询等高级特性。此外,还介绍了Mybatis的缓存机制和配置优化策略,以及如何使用Spring集成Mybatis。
Mybatis持久层框架教程:初学者入门指南 Mybatis简介Mybatis的基本概念
Mybatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。Mybatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。Mybatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通Java对象)映射成数据库中的记录。
Mybatis的优点和应用场景
Mybatis的优点包括:
- 灵活的SQL支持:Mybatis允许开发者直接编写SQL语句,提供了强大的SQL支持。
- 与数据库无关:Mybatis可以连接任何数据库,数据库的切换仅需修改配置。
- 映射简单:提供简单的Java对象(POJO)与数据库映射关系,易于理解。
- 性能更好:Mybatis避免了大部分的JDBC代码,减少了网络传输的数据量。
Mybatis的应用场景包括:
- 需要频繁修改SQL的项目
- 需要高灵活性的SQL查询的项目
- 需要简单的数据操作和数据库交互的项目
Mybatis与JDBC的区别
Mybatis与JDBC的主要区别在于:
- SQL执行:Mybatis提供了SQL映射文件,可以动态生成SQL语句,而JDBC需要手动编写和执行SQL。
- 结果映射:Mybatis自动将SQL查询结果映射到Java对象,而JDBC需要手动处理结果集。
- 配置方式:Mybatis可以通过XML或注解配置,而JDBC配置较为复杂。
开发环境准备
首先,准备开发环境,确保安装了Java JDK、IDE(如IntelliJ IDEA或Eclipse)和Maven。以下是安装步骤:
- 安装Java JDK:确保安装了Java JDK 8及以上版本。
- 安装IDE:选择合适的IDE,本文以IntelliJ IDEA为例。
- 安装Maven:Maven是一个强大的项目管理工具,用于构建和依赖管理。
Maven项目的配置
在IDE中创建一个新的Maven项目,并在pom.xml
文件中添加Mybatis依赖。以下是一个示例配置:
<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.23</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
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/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/example/mapper/UserMapper.xml"/>
</mappers>
</configuration>
Mybatis的核心概念
SqlSession和SqlSessionFactory
SqlSessionFactory
是Mybatis的核心接口之一,用于创建SqlSession
对象。SqlSession
提供了执行SQL语句和管理事务的方法。以下是创建SqlSessionFactory
的示例代码:
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
public class MyBatisUtil {
private static SqlSessionFactory sqlSessionFactory;
static {
String resource = "mybatis-config.xml";
InputStream inputStream = MyBatisUtil.class.getClassLoader().getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
public static SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
}
Mapper接口与XML映射文件
Mybatis使用Mapper接口来定义SQL语句,同时使用XML文件来配置SQL语句的映射。以下是一个Mapper接口和对应的XML映射文件示例:
Mapper接口
import java.util.List;
import com.example.model.User;
public interface UserMapper {
User getUser(int id);
List<User> getAllUsers();
int insertUser(User user);
int updateUser(User user);
int deleteUser(int id);
}
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">
<select id="getUser" resultType="com.example.model.User">
SELECT * FROM user WHERE id = #{id}
</select>
<select id="getAllUsers" resultType="com.example.model.User">
SELECT * FROM user
</select>
<insert id="insertUser" parameterType="com.example.model.User">
INSERT INTO user (id, name, age) VALUES (#{id}, #{name}, #{age})
</insert>
<update id="updateUser" parameterType="com.example.model.User">
UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}
</update>
<delete id="deleteUser" parameterType="int">
DELETE FROM user WHERE id = #{id}
</delete>
</mapper>
Mybatis的缓存机制
Mybatis拥有两种级别的缓存:一级缓存(本地缓存)和二级缓存(共享缓存)。一级缓存是SqlSession级别的,二级缓存是Mapper级别的。
一级缓存
一级缓存默认开启,每个SqlSession都有自己的缓存,当SqlSession执行查询时,会先检查缓存中是否有数据,如果有则直接返回。
二级缓存
二级缓存需要手动开启,可以在mybatis-config.xml
中配置:
<cache-refresher class="com.example.cache.CacheRefresher"/>
<cache>
<type>LRU</type>
<size>1000</size>
<flushInterval>60</flushInterval>
<implementation>com.example.cache.LocalCache</implementation>
</cache>
在Mapper接口中开启二级缓存:
<mapper namespace="com.example.mapper.UserMapper">
<cache/>
</mapper>
Mybatis的CRUD操作
增删改查的基本用法
Mybatis支持基本的CRUD操作,以下是一个完整的示例:
User实体类
public class User {
private int id;
private String name;
private int age;
// Getter and Setter...
}
Mapper接口
public interface UserMapper {
User getUser(int id);
List<User> getAllUsers();
int insertUser(User user);
int updateUser(User user);
int deleteUser(int id);
}
XML映射文件
<mapper namespace="com.example.mapper.UserMapper">
<select id="getUser" resultType="com.example.model.User">
SELECT * FROM user WHERE id = #{id}
</select>
<select id="getAllUsers" resultType="com.example.model.User">
SELECT * FROM user
</select>
<insert id="insertUser" parameterType="com.example.model.User">
INSERT INTO user (id, name, age) VALUES (#{id}, #{name}, #{age})
</insert>
<update id="updateUser" parameterType="com.example.model.User">
UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}
</update>
<delete id="deleteUser" parameterType="int">
DELETE FROM user WHERE id = #{id}
</delete>
</mapper>
测试代码
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import java.util.List;
public class Test {
private SqlSessionFactory sqlSessionFactory = MyBatisUtil.getSqlSessionFactory();
public void testCRUD() {
try (SqlSession session = sqlSessionFactory.openSession(true)) {
UserMapper mapper = session.getMapper(UserMapper.class);
User user = new User();
user.setId(1);
user.setName("John");
user.setAge(30);
mapper.insertUser(user);
user.setId(2);
user.setName("Jane");
user.setAge(25);
mapper.updateUser(user);
mapper.deleteUser(1);
User foundUser = mapper.getUser(2);
System.out.println(foundUser);
List<User> users = mapper.getAllUsers();
System.out.println(users);
}
}
}
动态SQL的使用
动态SQL允许根据不同的条件生成不同的SQL语句。Mybatis提供了多种标签来实现动态SQL,如<if>
、<choose>
、<when>
、<otherwise>
等。
示例:使用动态SQL查询用户
<select id="getUserByConditions" resultType="com.example.model.User">
SELECT * FROM user
<where>
<if test="id != null">
AND id = #{id}
</if>
<if test="name != null">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</where>
</select>
测试代码
public void testDynamicSQL() {
try (SqlSession session = sqlSessionFactory.openSession(true)) {
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> users = mapper.getUserByConditions(null, "John", null);
System.out.println(users);
users = mapper.getUserByConditions(1, null, 25);
System.out.println(users);
}
}
分页查询的实现
Mybatis提供了两种分页方式:使用RowBounds
和PageHelper
插件。
使用RowBounds
import org.apache.ibatis.session.RowBounds;
public void testPagination() {
try (SqlSession session = sqlSessionFactory.openSession(true)) {
UserMapper mapper = session.getMapper(UserMapper.class);
User user = new User();
user.setId(1);
user.setName("John");
user.setAge(30);
mapper.insertUser(user);
List<User> users = mapper.getAllUsers(new RowBounds(0, 10));
System.out.println(users);
}
}
使用PageHelper插件
首先在pom.xml
中添加PageHelper依赖:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.4</version>
</dependency>
在mybatis-config.xml
中配置PageHelper:
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="helperDialect" value="mysql"/>
<property name="reasonable" value="true"/>
</plugin>
</plugins>
修改Mapper接口方法:
public interface UserMapper {
List<User> getAllUsers();
}
在代码中使用PageHelper:
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
public void testPageHelper() {
try (SqlSession session = sqlSessionFactory.openSession(true)) {
UserMapper mapper = session.getMapper(UserMapper.class);
PageHelper.startPage(1, 10);
List<User> users = mapper.getAllUsers();
PageInfo<User> pageInfo = new PageInfo<>(users);
System.out.println(pageInfo);
}
}
Mybatis的高级特性
关联查询(一对一和一对多)
Mybatis支持多种关联查询,包括一对一和一对多。以下是一对一查询的示例:
User实体类
public class User {
private int id;
private String name;
private int age;
private Department department;
// Getter and Setter...
}
Department实体类
public class Department {
private int id;
private String name;
private String address;
// Getter and Setter...
}
XML映射文件
<mapper namespace="com.example.mapper.UserMapper">
<resultMap id="userResultMap" type="com.example.model.User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
<association property="department" javaType="com.example.model.Department" select="getDepartment" column="department_id"/>
</resultMap>
<select id="getUserById" resultMap="userResultMap">
SELECT * FROM user WHERE id = #{id}
</select>
<select id="getDepartment" resultType="com.example.model.Department">
SELECT * FROM department WHERE id = #{id}
</select>
</mapper>
测试代码
public void testOneToOne() {
try (SqlSession session = sqlSessionFactory.openSession(true)) {
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.getUserById(1);
System.out.println(user);
}
}
一对多查询的示例:
User实体类
public class User {
private int id;
private String name;
private int age;
private List<Department> departments;
// Getter and Setter...
}
XML映射文件
<mapper namespace="com.example.mapper.UserMapper">
<resultMap id="userResultMap" type="com.example.model.User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
<collection property="departments" javaType="java.util.List" ofType="com.example.model.Department" select="getDepartmentByUserId" column="id"/>
</resultMap>
<select id="getUserById" resultMap="userResultMap">
SELECT * FROM user WHERE id = #{id}
</select>
<select id="getDepartmentByUserId" resultType="com.example.model.Department">
SELECT * FROM department WHERE user_id = #{id}
</select>
</mapper>
测试代码
public void testOneToMany() {
try (SqlSession session = sqlSessionFactory.openSession(true)) {
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.getUserById(1);
System.out.println(user);
}
}
继承和联合主键
Mybatis支持继承和联合主键,以下是一个示例:
User实体类
public class User {
private int id;
private String name;
private int age;
// Getter and Setter...
}
UserMapper接口
public interface UserMapper {
User getUser(int id);
}
XML映射文件
<mapper namespace="com.example.mapper.UserMapper">
<select id="getUser" resultType="com.example.model.User">
SELECT * FROM user WHERE id = #{id}
</select>
</mapper>
测试代码
public void testInheritance() {
try (SqlSession session = sqlSessionFactory.openSession(true)) {
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.getUser(1);
System.out.println(user);
}
}
插入和更新时的自动主键生成
Mybatis支持在插入和更新操作中自动生成主键。以下是一个示例:
User实体类
public class User {
private int id;
private String name;
private int age;
// Getter and Setter...
}
UserMapper接口
public interface UserMapper {
int insertUser(User user);
int updateUser(User user);
}
XML映射文件
<mapper namespace="com.example.mapper.UserMapper">
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
INSERT INTO user (name, age) VALUES (#{name}, #{age})
</insert>
<update id="updateUser" parameterType="com.example.model.User">
UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}
</update>
</mapper>
测试代码
public void testAutoKeyGeneration() {
try (SqlSession session = sqlSessionFactory.openSession(true)) {
UserMapper mapper = session.getMapper(UserMapper.class);
User user = new User();
user.setName("John");
user.setAge(30);
mapper.insertUser(user);
user.setId(mapper.insertUser(user));
user.setName("Jane");
mapper.updateUser(user);
System.out.println(user);
}
}
Mybatis的事务管理与配置优化
事务控制的方式
Mybatis支持多种事务控制方式,包括编程方式和声明式事务。
编程方式
public void testTransaction() {
try (SqlSession session = sqlSessionFactory.openSession(true)) {
UserMapper mapper = session.getMapper(UserMapper.class);
User user = new User();
user.setName("John");
user.setAge(30);
mapper.insertUser(user);
session.commit();
}
}
声明式事务
在mybatis-config.xml
中配置事务管理器:
<transactionManager type="JDBC"/>
使用Spring集成Mybatis时,可以使用Spring的事务管理器。
Mybatis的配置优化策略
Mybatis的配置优化包括:
- 使用缓存:开启一级和二级缓存,提高查询性能。
- 使用动态SQL:减少SQL语句的硬编码,提高灵活性。
- 使用PageHelper插件:简化分页操作。
- 使用Mybatis Generator:自动生成Mapper接口和实体类。
使用Spring集成Mybatis
Spring可以很好地集成Mybatis,提供事务管理和依赖注入功能。以下是一个简单的Spring集成Mybatis的示例:
配置文件
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.mapper"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
<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/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</bean>
测试代码
@Autowired
private UserMapper userMapper;
public void testSpringMybatis() {
User user = new User();
user.setName("John");
user.setAge(30);
userMapper.insertUser(user);
User foundUser = userMapper.getUser(1);
System.out.println(foundUser);
}
共同學習,寫下你的評論
評論加載中...
作者其他優質文章