概述
Mybatis持久层框架是一种强大的数据库操作工具,它简化了Java程序员的数据库交互过程,通过配置文件或注解管理SQL语句。Mybatis框架支持灵活的SQL映射和强大的对象关系映射,显著提高查询效率并提供轻量级的数据库操作体验。
Mybatis持久层框架入门教程 Mybatis简介Mybatis是什么
Mybatis是一个强大的持久层框架,简化了数据库操作,使得Java程序员可以方便地访问数据库,避免了传统JDBC编程中大量重复的代码。Mybatis通过配置文件(通常是XML配置文件)或注解来管理数据库的交互,实现了SQL语句与程序代码的分离。
Mybatis与JDBC的区别
Mybatis与JDBC的主要区别在于处理数据库操作的方式不同:
- JDBC:
- JDBC是一种用于执行SQL语句的Java API,提供了与数据库交互的基本功能。
- 开发人员需要手动管理数据库连接、SQL语句的执行、结果集的处理等。
- 示例代码如下:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JdbcExample {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "username", "password");
String sql = "SELECT * FROM users WHERE id = ?";
ps = conn.prepareStatement(sql);
ps.setInt(1, 1);
rs = ps.executeQuery();
while (rs.next()) {
System.out.println(rs.getInt("id") + " " + rs.getString("name"));
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
} finally {
try {
if (rs != null) rs.close();
if (ps != null) ps.close();
if (conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
- Mybatis:
- Mybatis封装了JDBC代码,通过XML配置文件或注解来管理SQL语句,使开发人员只需关注业务逻辑。
- 提供了强大的映射功能,可以将Java对象与数据库记录进行自动映射。
- 示例代码如下:
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MybatisExample {
public static void main(String[] args) {
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("MybatisConfig.xml"));
SqlSession session = factory.openSession();
User user = session.selectOne("getUserById", 1);
System.out.println(user);
session.close();
}
}
Mybatis的特点和优势
Mybatis具有以下特点和优势:
- 灵活的SQL映射:可以通过XML配置文件或注解来定义SQL语句,支持动态SQL。
- 强大的对象关系映射:可以将Java对象与数据库记录进行自动映射。
- 性能优异:Mybatis避免了JDBC中的频繁类型转换,提高了查询效率。
- 轻量级框架:Mybatis没有侵入性,不影响原有数据库的使用,可以与多种数据库进行交互。
开发环境准备
Mybatis的开发环境通常需要以下组件:
- Java开发环境:需要安装JDK。
- 数据库:Mybatis支持多种数据库,如MySQL、Oracle、SQL Server等。
- 构建工具:如Maven或Gradle。
Mybatis的下载与配置
-
下载Mybatis:
- Mybatis的最新版本可以从其GitHub仓库下载:https://github.com/mybatis/mybatis-3/releases。
- 也可以通过Maven仓库直接引用。
- 配置Mybatis:
- 配置Mybatis需要两个主要的文件:
mybatis-config.xml
和数据映射文件(通常是XML文件)。 mybatis-config.xml
配置文件示例:
- 配置Mybatis需要两个主要的文件:
<?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.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
- 数据映射文件示例(如UserMapper.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="getUserById" resultType="com.example.model.User">
SELECT * FROM users WHERE id = #{id}
</select>
</mapper>
Maven项目的集成
- 添加Maven依赖:
- 在
pom.xml
文件中添加Mybatis的依赖:
- 在
<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.26</version>
</dependency>
</dependencies>
-
配置Maven项目:
- 确保项目的构建工具是Maven,并且已经正确配置了
pom.xml
文件。
- 确保项目的构建工具是Maven,并且已经正确配置了
- 编写测试代码:
- 创建一个Java类来测试Mybatis的配置是否正确。
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MybatisTest {
public static void main(String[] args) {
String resource = "mybatis-config.xml";
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader(resource));
SqlSession session = factory.openSession();
User user = session.selectOne("com.example.mapper.UserMapper.getUserById", 1);
System.out.println(user);
session.close();
}
}
Mybatis核心概念
SqlSessionFactory和SqlSession
- SqlSessionFactory:
SqlSessionFactory
是创建SqlSession
的工厂对象。SqlSessionFactory
通过解析mybatis-config.xml
文件来创建。- 示例代码如下:
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class SqlSessionFactoryExample {
public static void main(String[] args) {
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
}
}
- SqlSession:
SqlSession
是执行数据库操作的核心对象。- 通过
SqlSessionFactory
获取SqlSession
对象。 - 示例代码如下:
import org.apache.ibatis.session.SqlSession;
public class SqlSessionExample {
public static void main(String[] args) {
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
SqlSession session = factory.openSession();
}
}
Mapper接口与XML配置
- Mapper接口:
- Mapper接口定义了数据库操作的接口方法。
- 每个Mapper接口方法对应一个SQL语句。
- 示例代码如下:
public interface UserMapper {
User getUserById(int id);
}
- XML配置:
- XML配置文件定义了SQL语句及其对应的Java方法。
- 示例代码如下:
<mapper namespace="com.example.mapper.UserMapper">
<select id="getUserById" resultType="com.example.model.User">
SELECT * FROM users WHERE id = #{id}
</select>
</mapper>
{}和${}的区别与使用
- #{}`:
- 用于预编译SQL语句中的参数。
- Mybatis会自动处理类型转换。
- 示例代码如下:
<insert id="insertUser" parameterType="com.example.model.User">
INSERT INTO users (id, name, age) VALUES (#{id}, #{name}, #{age})
</insert>
- ${}`:
- 用于拼接SQL语句,不会进行类型转换。
- 使用时需谨慎,容易引起SQL注入。
- 示例代码如下:
<insert id="insertUser" parameterType="com.example.model.User">
INSERT INTO users (id, name, age) VALUES (#{id}, #{name}, ${age})
</insert>
Mybatis的基本使用
增删改查操作
- 查询操作:
- 通过
select
标签定义查询SQL语句。 - 示例代码如下:
- 通过
<select id="getUserById" resultType="com.example.model.User">
SELECT * FROM users WHERE id = #{id}
</select>
- 插入操作:
- 通过
insert
标签定义插入SQL语句。 - 示例代码如下:
- 通过
<insert id="insertUser" parameterType="com.example.model.User">
INSERT INTO users (id, name, age) VALUES (#{id}, #{name}, #{age})
</insert>
- 更新操作:
- 通过
update
标签定义更新SQL语句。 - 示例代码如下:
- 通过
<update id="updateUser" parameterType="com.example.model.User">
UPDATE users SET name = #{name}, age = #{age} WHERE id = #{id}
</update>
- 删除操作:
- 通过
delete
标签定义删除SQL语句。 - 示例代码如下:
- 通过
<delete id="deleteUser" parameterType="int">
DELETE FROM users WHERE id = #{id}
</delete>
结果集映射
- 基本映射:
- 结果集映射可以将数据库查询结果映射到Java对象。
- 示例代码如下:
<select id="getUserById" resultType="com.example.model.User">
SELECT * FROM users WHERE id = #{id}
</select>
- 复杂映射:
- 可以通过
<resultMap>
标签定义复杂的映射关系。 - 示例代码如下:
- 可以通过
<resultMap id="userResultMap" type="com.example.model.User">
<id column="user_id" property="id"/>
<result column="user_name" property="name"/>
<result column="user_age" property="age"/>
</resultMap>
<select id="getUserById" resultMap="userResultMap">
SELECT user_id AS user_id, user_name AS user_name, user_age AS user_age FROM users WHERE id = #{id}
</select>
批量操作
- 批量插入:
- 可以通过
<foreach>
标签实现批量插入。 - 示例代码如下:
- 可以通过
<insert id="batchInsertUser" parameterType="java.util.List">
INSERT INTO users (id, name, age) VALUES
<foreach item="item" index="index" collection="list" separator=",">
(#{item.id}, #{item.name}, #{item.age})
</foreach>
</insert>
- 批量更新:
- 可以通过
<foreach>
标签实现批量更新。 - 示例代码如下:
- 可以通过
<update id="batchUpdateUser" parameterType="java.util.List">
UPDATE users SET name = #{item.name}, age = #{item.age}
WHERE id = #{item.id}
<foreach item="item" index="index" collection="list" separator=";">
</foreach>
</update>
Mybatis的动态SQL
if标签
- if标签:
- 用于条件判断,根据条件决定SQL语句中的部分是否添加。
- 示例代码如下:
<update id="updateUser" parameterType="com.example.model.User">
UPDATE users SET
<if test="name != null">name = #{name},</if>
<if test="age != null">age = #{age},</if>
WHERE id = #{id}
</update>
choose标签
- choose标签:
- 类似于Java中的
switch
语句,用于多条件判断。 - 示例代码如下:
- 类似于Java中的
<update id="updateUser" parameterType="com.example.model.User">
UPDATE users SET
<choose>
<when test="name != null">name = #{name},</when>
<when test="age != null">age = #{age},</when>
<otherwise>status = 'unknown',</otherwise>
</choose>
WHERE id = #{id}
</update>
set和foreach标签
- set标签:
- 用于处理更新操作时的SQL语句。
- 示例代码如下:
<update id="updateUser" parameterType="com.example.model.User">
UPDATE users SET
<set>
<if test="name != null">name = #{name},</if>
<if test="age != null">age = #{age},</if>
</set>
WHERE id = #{id}
</update>
- foreach标签:
- 用于循环遍历集合。
- 示例代码如下:
<insert id="batchInsertUser" parameterType="java.util.List">
INSERT INTO users (id, name, age) VALUES
<foreach item="item" index="index" collection="list" separator=",">
(#{item.id}, #{item.name}, #{item.age})
</foreach>
</insert>
Mybatis的高级特性
分页查询
- 分页查询:
- Mybatis通过插件实现分页查询。
- 示例代码如下:
<select id="getUserList" resultType="com.example.model.User">
SELECT * FROM users LIMIT #{offset}, #{limit}
</select>
- 插件配置:
- 在
mybatis-config.xml
中配置分页插件。
- 在
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="helperDialect" value="mysql"/>
<property name="reasonable" value="true"/>
</plugin>
</plugins>
二级缓存
- 二级缓存:
- Mybatis支持一级和二级缓存。
- 二级缓存在所有Mapper之间共享。
- 示例代码如下:
<cache/>
- 配置缓存:
- 在Mapper XML文件中启用缓存。
<mapper namespace="com.example.mapper.UserMapper">
<cache/>
<select id="getUserById" resultType="com.example.model.User">
SELECT * FROM users WHERE id = #{id}
</select>
</mapper>
插件开发
- 插件开发:
- Mybatis支持自定义插件,可以通过拦截
SqlSession
方法来实现。 - 示例代码如下:
- Mybatis支持自定义插件,可以通过拦截
import org.apache.ibatis.plugin.*;
public class MybatisPlugin implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
System.out.println("Before method execution");
Object result = invocation.proceed();
System.out.println("After method execution");
return result;
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
}
}
- 插件配置:
- 在
mybatis-config.xml
中配置插件。
- 在
<plugins>
<plugin interceptor="com.example.plugin.MybatisPlugin">
<property name="propertyName" value="propertyValue"/>
</plugin>
</plugins>
通过以上各个部分的介绍与示例代码,相信你已经对Mybatis持久层框架有了全面的了解和掌握。希望这篇文章能帮助你在实际项目中更好地应用Mybatis。
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦