Mybatis持久層框架學習入門教程
Mybatis是一个持久层框架,支持自定义SQL查询和高级映射,灵活性和性能较高。本文将详细介绍Mybatis的基本概念、优势、应用场景以及与JDBC的区别。Mybatis持久层框架的学习内容包括环境搭建、基本使用、动态SQL、缓存机制、事务管理和高级应用等方面。
Mybatis简介 Mybatis的基本概念MyBatis是一个持久层框架,它支持自定义SQL查询、存储过程和高级映射。MyBatis可以将Java对象与数据库中的记录进行映射。MyBatis通过XML配置文件或注解,可以将Java方法与数据库操作关联起来,使得开发者可以灵活地定义数据访问层。
Mybatis的优势和应用场景优势
- 灵活性:MyBatis提供了非常灵活的SQL查询方式,可以通过XML配置文件或者注解来映射SQL,使得SQL的编写更加灵活。
- 性能:MyBatis的查询结果直接映射为Java对象,可以减少不必要的数据转换,提高了性能。
- 易用性:MyBatis提供了丰富的API,使得数据库操作更加简单易用。
- 可扩展性:MyBatis支持插件机制,可以方便地扩展功能。
应用场景
- 复杂SQL查询:适用于SQL查询非常复杂的场景。
- 性能敏感的应用:由于MyBatis直接操作数据库,可以减少对象映射的时间,提高性能。
- 数据库交互复杂的应用:适用于需要频繁调用存储过程或者进行复杂SQL操作的应用。
- 数据库操作频繁的应用:适用于数据库操作频繁的应用场景,通过MyBatis可以简化数据库操作的代码。
JDBC
JDBC是Java数据库连接的API,提供了访问数据库的标准接口。它直接操作数据库,提供了数据库连接、执行SQL、处理结果集等功能。
Mybatis
Mybatis是一个持久层框架,它基于JDBC,简化了JDBC的使用。Mybatis通过配置文件定义SQL查询,并将查询结果映射为Java对象。
主要区别
- SQL操作:JDBC是直接使用SQL语句,而Mybatis是通过配置文件或注解来定义SQL查询。
- 结果映射:JDBC需要手动将结果集映射为Java对象,而Mybatis可以通过配置文件自动完成映射。
- 性能:Mybatis由于减少了对象映射的过程,因此在性能上通常要优于JDBC。
- 灵活性:Mybatis提供了动态SQL和映射文件的配置,使得SQL查询更加灵活。
软件环境
- 操作系统:Windows、Linux、macOS等
- IDE:Eclipse、IntelliJ IDEA、STS等
- Java环境:JDK 1.8及以上版本
- Mybatis版本:Mybatis 3.5.6等最新版本
配置步骤
- 安装Java环境,确保Java环境变量配置正确。
- 安装IDE,例如IntelliJ IDEA或Eclipse。
- 安装数据库,例如MySQL。
创建数据库和表
CREATE DATABASE mybatis;
USE mybatis;
CREATE TABLE user (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20),
age INT
);
创建Java项目
- 打开IDE,新建一个Java项目。
- 导入Mybatis的依赖。
Java代码示例
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class DatabaseUtil {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/mybatis";
String username = "root";
String password = "password";
try {
Connection connection = DriverManager.getConnection(url, username, password);
Statement statement = connection.createStatement();
String sql = "CREATE TABLE user (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20), age INT)";
statement.executeUpdate(sql);
System.out.println("数据库和表创建成功");
} catch (Exception e) {
e.printStackTrace();
}
}
}
Maven项目配置
创建Maven项目
- 打开IDE,新建一个Maven项目。
- 在pom.xml文件中添加Mybatis的依赖。
<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> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies>
配置数据库连接信息
在src/main/resources目录下创建一个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/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
配置核心配置文件
配置Mybatis的核心配置文件
在src/main/resources目录下创建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="UserMapper.xml"/>
</mappers>
</configuration>
``
### Java代码示例
```java
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MyBatisUtil {
private static SqlSessionFactory sqlSessionFactory;
static {
String resource = "mybatis-config.xml";
try {
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
}
映射文件的编写
配置映射文件
在src/main/resources目录下创建一个UserMapper.xml文件,用于定义SQL映射。
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectUserById" resultType="com.example.model.User">
SELECT * FROM user WHERE id = #{id}
</select>
</mapper>
Java代码示例
定义Java接口和Java类:
package com.example.mapper;
import com.example.model.User;
import org.apache.ibatis.annotations.Select;
public interface UserMapper {
@Select("SELECT * FROM user WHERE id = #{id}")
User selectUserById(int id);
}
package com.example.model;
public class User {
private int id;
private String name;
private int age;
// Getters and Setters
}
CRUD操作详解
Select操作
<select id="selectUserById" resultType="com.example.model.User">
SELECT * FROM user WHERE id = #{id}
</select>
Insert操作
<insert id="insertUser" parameterType="com.example.model.User">
INSERT INTO user(name, age) VALUES (#{name}, #{age})
</insert>
Update操作
<update id="updateUser" parameterType="com.example.model.User">
UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}
</update>
Delete操作
<delete id="deleteUserById" parameterType="int">
DELETE FROM user WHERE id = #{id}
</delete>
Mybatis动态SQL
简单的动态SQL标签介绍
Mybatis提供了多种动态SQL标签,例如<if>
, <choose>
(类似于<switch>
),
<when>(类似于
<case>),
<otherwise>(类似于
<default>`)等。
使用<if>
标签
<if test="name != null">
AND name = #{name}
</if>
使用<choose>
标签
<choose>
<when test="name != null">
AND name = #{name}
</when>
<when test="age != null">
AND age = #{age}
</when>
<otherwise>
AND id = #{id}
</otherwise>
</choose>
使用动态SQL处理条件查询
示例
<select id="selectUserByCondition" resultType="com.example.model.User">
SELECT * FROM user
<where>
<if test="name != null">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</where>
</select>
解释
<where>
标签会自动处理SQL语句中的WHERE关键字,并且会自动去除第一个AND或OR。
使用<foreach>
标签
<foreach>
标签用于遍历集合。
<update id="updateUserBatch">
UPDATE user SET name = #{name} WHERE id IN
<foreach item="item" index="index" collection="ids" open="(" separator="," close=")">
#{item}
</foreach>
</update>
使用<trim>
标签
<trim>
标签用于添加SQL语句的前缀和后缀。
<select id="selectUserByCondition" resultType="com.example.model.User">
SELECT * FROM user
<trim prefix="WHERE" prefixOverrides="AND,OR">
<if test="name != null">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</trim>
</select>
动态SQL的Java代码示例
import org.apache.ibatis.session.SqlSession;
public class DynamicSQLExample {
public static void main(String[] args) {
SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.selectUserById(1);
System.out.println(user.getName());
// 动态SQL查询
User userByCondition = mapper.selectUserByCondition("John", 25);
System.out.println(userByCondition.getName());
sqlSession.close();
}
}
Mybatis与数据库交互
Mybatis的缓存机制
Mybatis有两种级别的缓存:一级缓存和二级缓存。
一级缓存
一级缓存是SqlSession级别的缓存,每个SqlSession都有一个独立的缓存,并且SqlSession默认开启缓存。
二级缓存
二级缓存是Mapper级别的缓存,多个SqlSession之间可以共享同一个Mapper的缓存。二级缓存可以通过配置开启。
缓存的使用
<cache/>
缓存的例子
<cache/>
<select id="selectUserById" resultType="com.example.model.User" cache="true">
SELECT * FROM user WHERE id = #{id}
</select>
缓存的清除
sqlSession.clearCache();
批量操作和事务管理
批量操作
Mybatis可以通过<foreach>
标签来实现批量操作。
<update id="updateUserBatch">
UPDATE user SET name = #{name} WHERE id IN
<foreach item="item" index="index" collection="ids" open="(" separator="," close=")">
#{item}
</foreach>
</update>
事务管理
Mybatis支持事务管理,事务的提交和回滚可以通过SqlSession的方法来实现。
sqlSession.commit();
sqlSession.rollback();
缓存、批量操作和事务管理的Java代码示例
import org.apache.ibatis.session.SqlSession;
public class CacheExample {
public static void main(String[] args) {
SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.selectUserById(1);
System.out.println(user.getName());
// 批量更新操作
List<Integer> ids = Arrays.asList(1, 2, 3);
mapper.updateUserBatch(ids, "John");
// 事务管理
try {
mapper.updateUser(1, "John", 30);
sqlSession.commit();
} catch (Exception e) {
sqlSession.rollback();
}
sqlSession.close();
}
}
Mybatis的高级应用
Mybatis的插件机制
Mybatis支持插件机制,可以对Mybatis的执行过程进行拦截和增强。
public class MyBatisPlugin implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
// 拦截方法的逻辑
return invocation.proceed();
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
// 设置属性
}
}
插件的配置
<plugins>
<plugin interceptor="com.example.plugin.MyBatisPlugin">
<property name="property1" value="value1"/>
<property name="property2" value="value2"/>
</plugin>
</plugins>
插件的实际应用示例
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.defaults.DefaultSqlSession;
public class MyBatisPluginExample {
public static void main(String[] args) {
SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();
((DefaultSqlSession) sqlSession).getConfiguration().addInterceptor(new MyBatisPlugin());
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.selectUserById(1);
System.out.println(user.getName());
sqlSession.close();
}
}
Mybatis的自动映射策略
Mybatis提供了多种自动映射策略,例如:
- PARTIAL:部分自动映射。
- NONE:不使用自动映射。
- FULL:完全自动映射。
自动映射策略的配置
<configuration>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
</configuration>
自动映射策略的应用示例
import org.apache.ibatis.session.SqlSession;
public class AutoMappingExample {
public static void main(String[] args) {
SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.selectUserById(1);
System.out.println(user.getName());
sqlSession.close();
}
}
Mybatis的分页处理
Mybatis支持分页查询,可以通过插件或者手动编写SQL来实现分页。
<select id="selectUserByPage" resultType="com.example.model.User">
SELECT * FROM user LIMIT #{offset}, #{limit}
</select>
使用PageHelper插件
<dependencies>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.4</version>
</dependency>
</dependencies>
使用PageHelper插件的例子
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import java.util.List;
public class PageHelperExample {
public static void main(String[] args) {
SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
PageHelper.startPage(1, 10);
List<User> users = mapper.selectAll();
PageInfo<User> pageInfo = new PageInfo<>(users);
System.out.println(pageInfo.getTotal());
sqlSession.close();
}
}
分页插件的配置
<configuration>
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="helperDialect" value="mysql"/>
<property name="reasonable" value="true"/>
</plugin>
</plugins>
</configuration>
以上教程详细介绍了Mybatis的使用方法,包括环境搭建、基本使用、动态SQL、缓存机制、事务管理和高级应用等方面的内容。希望这些内容能够帮助你更好地理解和使用Mybatis。如果你需要进一步了解Mybatis的相关内容,可以参考慕课网上的相关课程。
共同學習,寫下你的評論
評論加載中...
作者其他優(yōu)質(zhì)文章