本文详细介绍了Mybatis持久层框架项目实战,包括基础概念、环境搭建、核心API和映射文件详解等内容。文中通过实例深入讲解了CRUD操作、动态SQL和缓存配置等高级特性,并提供了完整的项目实战案例。希望读者通过本文能够掌握Mybatis的使用和优化方法,提升开发技能。mybatis持久层框架项目实战涵盖了从环境搭建到高级特性的全面指导。
Mybatis持久层框架项目实战教程 Mybatis基础概念介绍Mybatis是什么
Mybatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。Mybatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。Mybatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的POJOs(普通的Java对象)映射成数据库中的记录。
Mybatis的特点和优势
Mybatis的主要特点包括:
- 灵活性:Mybatis允许在运行时动态地生成SQL,支持存储过程调用和自定义SQL语句。
- 易用性:开发者可以使用简单的XML或注解来配置和映射。
- 性能高:Mybatis直接操作数据库,避免了中间层的阻塞。
- 扩展性:Mybatis支持自定义类型处理器、自定义动态SQL、自定义缓存等。
- 低侵入性:Mybatis的代码和业务逻辑分离,易于维护。
Mybatis的优势体现在:
- 简单易用:Mybatis的配置和映射文件是分离的,使得业务代码和SQL语句的维护更加容易。
- 灵活性:Mybatis允许在运行时动态生成SQL,支持存储过程调用和自定义SQL语句。
- 强大的映射功能:Mybatis可以将Java对象映射为数据库中的记录,反之亦然。
- 插件机制:Mybatis支持插件机制,可以自由地扩展其功能。
Mybatis与传统JDBC的区别
Mybatis与JDBC的主要区别在于:
-
使用方式:
- Jdbc:通过编写Java代码来实现SQL查询,使用Statement和PreparedStatement等来执行SQL语句。
- Mybatis:通过配置文件(XML)或注解来定义SQL语句,通过执行Mapper接口中的方法来调用SQL语句。
-
SQL语句处理:
- Jdbc:需要手动拼接SQL语句,设置参数,处理结果集。
- Mybatis:可以配置SQL语句,Mybatis会自动处理SQL参数和结果集映射。
-
灵活性:
- Jdbc:灵活性较差,SQL语句的调整需要修改代码。
- Mybatis:SQL语句的调整只需修改配置文件,不涉及代码修改。
-
性能:
- Jdbc:需要编写大量的SQL和手动处理结果集,性能相对较低。
- Mybatis:通过缓存机制和动态SQL生成技术,性能较高。
- 代码量:
- Jdbc:需要编写大量的SQL和处理结果集的代码,代码量较大。
- Mybatis:通过配置文件和Mapper接口减少代码量,使代码更加简洁。
例如,使用JDBC的典型代码如下:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class JdbcExample {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try {
// 连接数据库
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "password");
stmt = conn.createStatement();
// 执行SQL
ResultSet rs = stmt.executeQuery("SELECT * FROM users");
while (rs.next()) {
System.out.println(rs.getString("username"));
}
// 关闭资源
rs.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (stmt != null)
stmt.close();
if (conn != null)
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
使用Mybatis的典型代码如下:
import org.apache.ibatis.session.SqlSession;
import com.example.mapper.UserMapper;
public class MybatisExample {
public static void main(String[] args) {
try (SqlSession session = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("SqlMapConfig.xml")).openSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> users = mapper.selectAllUsers();
for (User user : users) {
System.out.println(user.getUsername());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Mybatis环境搭建
开发环境准备
在开始搭建Mybatis环境之前,需要准备以下开发环境:
- Java开发环境:确保已安装Java SE开发环境。
- IDE:建议使用IntelliJ IDEA或Eclipse进行开发。
- 数据库环境:安装MySQL数据库。
- Maven:Mybatis项目的构建工具。
Maven项目配置Mybatis依赖
在Maven项目中配置Mybatis依赖,编辑pom.xml
文件,添加以下依赖:
<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.23</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.4</version>
</dependency>
</dependencies>
IDEA新建Mybatis项目实例
- 在IntelliJ IDEA中创建一个新的Maven项目。
- 配置
pom.xml
文件,添加Mybatis依赖。 - 创建配置文件
SqlMapConfig.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.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/example/mapper/UserMapper.xml"/>
</mappers>
</configuration>
- 创建Mapper接口和对应的XML配置文件。
package com.example.mapper;
import com.example.entity.User;
import java.util.List;
public interface UserMapper {
List<User> selectAllUsers();
}
<?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="selectAllUsers" resultType="com.example.entity.User">
SELECT * FROM users
</select>
</mapper>
- 创建实体类
User
。
package com.example.entity;
public class User {
private int id;
private String username;
private String password;
// 实体类的getters和setters
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
Mybatis核心API详解
SqlSession和SqlSessionFactory
SqlSessionFactory
是Mybatis中最核心的接口之一,用于创建SqlSession
。SqlSession
是执行数据库操作的接口,可以获取Mapper
接口的代理实现,执行SQL语句。
// 创建SqlSessionFactory
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("SqlMapConfig.xml"));
// 使用SqlSessionFactory创建SqlSession
SqlSession session = factory.openSession();
package com.example;
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;
public class MybatisExample {
public static void main(String[] args) {
try (SqlSession session = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("SqlMapConfig.xml")).openSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> users = mapper.selectAllUsers();
for (User user : users) {
System.out.println(user.getUsername());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Mapper接口和Mapper XML配置文件
Mybatis允许定义Mapper接口,并通过XML配置文件映射SQL语句。在Mapper接口中定义方法,这些方法会被映射成对应的SQL语句。
package com.example.mapper;
import com.example.entity.User;
import java.util.List;
public interface UserMapper {
List<User> selectAllUsers();
}
<?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="selectAllUsers" resultType="com.example.entity.User">
SELECT * FROM users
</select>
</mapper>
CRUD操作的实现
Mybatis支持基本的CRUD操作(创建Create、读取Read、更新Update、删除Delete)。
插入操作:
package com.example.mapper;
public interface UserMapper {
int insert(User user);
}
<?xml version="1.0" encoding="UTF-8" ?>
<mapper namespace="com.example.mapper.UserMapper">
<insert id="insert" parameterType="com.example.entity.User">
INSERT INTO users (username, password) VALUES (#{username}, #{password})
</insert>
</mapper>
查询操作:
package com.example.mapper;
public interface UserMapper {
List<User> selectAllUsers();
}
<?xml version="1.0" encoding="UTF-8" ?>
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectAllUsers" resultType="com.example.entity.User">
SELECT * FROM users
</select>
</mapper>
更新操作:
package com.example.mapper;
public interface UserMapper {
int update(User user);
}
<?xml version="1.0" encoding="UTF-8" ?>
<mapper namespace="com.example.mapper.UserMapper">
<update id="update" parameterType="com.example.entity.User">
UPDATE users SET username = #{username}, password = #{password} WHERE id = #{id}
</update>
</mapper>
删除操作:
package com.example.mapper;
public interface UserMapper {
int delete(int id);
}
<?xml version="1.0" encoding="UTF-8" ?>
<mapper namespace="com.example.mapper.UserMapper">
<delete id="delete" parameterType="int">
DELETE FROM users WHERE id = #{id}
</delete>
</mapper>
Mybatis映射文件详解
元素详解(select, insert, update, delete)
Mybatis的映射文件中定义了多种元素,包括select
、insert
、update
、delete
等。
select:
<select id="selectAllUsers" resultType="com.example.entity.User">
SELECT * FROM users
</select>
insert:
<insert id="insert" parameterType="com.example.entity.User">
INSERT INTO users (username, password) VALUES (#{username}, #{password})
</insert>
update:
<update id="update" parameterType="com.example.entity.User">
UPDATE users SET username = #{username}, password = #{password} WHERE id = #{id}
</update>
delete:
<delete id="delete" parameterType="int">
DELETE FROM users WHERE id = #{id}
</delete>
结果映射(resultMap)
resultMap
用于定义结果集的映射规则,可以处理复杂的SQL查询结果。
<resultMap type="com.example.entity.User" id="userResultMap">
<id column="id" property="id"/>
<result column="username" property="username"/>
<result column="password" property="password"/>
</resultMap>
<select id="selectAllUsers" resultMap="userResultMap">
SELECT id, username, password FROM users
</select>
动态SQL应用
Mybatis支持动态SQL,可以根据不同的条件生成不同的SQL语句。
if:
<select id="selectUsersByCondition" resultType="com.example.entity.User">
SELECT * FROM users WHERE 1=1
<if test="username != null">
AND username = #{username}
</if>
<if test="password != null">
AND password = #{password}
</if>
</select>
choose、when
、otherwise
:
<select id="selectUsersByCondition" resultType="com.example.entity.User">
SELECT * FROM users WHERE 1=1
<choose>
<when test="username != null">
AND username = #{username}
</when>
<when test="password != null">
AND password = #{password}
</when>
<otherwise>
AND id = 1
</otherwise>
</choose>
</select>
Mybatis项目实战
实战项目需求分析
为了更好地理解Mybatis的使用,我们将实现一个简单的用户管理系统,包括用户信息的增删改查。
项目结构规划
项目的基本结构如下:
src
└──main
├──java
│ └──com.example
│ ├──entity
│ │ └──User.java
│ ├──mapper
│ │ └──UserMapper.java
│ └──MybatisExample.java
├──resources
│ ├──SqlMapConfig.xml
│ └──mapper
│ └──UserMapper.xml
分步实现项目功能
创建实体类
首先创建用户实体类User
:
package com.example.entity;
public class User {
private int id;
private String username;
private String password;
// Getters and Setters
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
创建Mapper接口
定义用户Mapper接口UserMapper
:
package com.example.mapper;
import com.example.entity.User;
import java.util.List;
public interface UserMapper {
List<User> selectAllUsers();
int insert(User user);
int update(User user);
int delete(int id);
}
创建Mapper XML配置文件
在UserMapper.xml
中配置SQL语句:
<?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="selectAllUsers" resultType="com.example.entity.User">
SELECT * FROM users
</select>
<insert id="insert" parameterType="com.example.entity.User">
INSERT INTO users (username, password) VALUES (#{username}, #{password})
</insert>
<update id="update" parameterType="com.example.entity.User">
UPDATE users SET username = #{username}, password = #{password} WHERE id = #{id}
</update>
<delete id="delete" parameterType="int">
DELETE FROM users WHERE id = #{id}
</delete>
</mapper>
创建配置文件
配置Mybatis的核心设置SqlMapConfig.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/test"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/example/mapper/UserMapper.xml"/>
</mappers>
</configuration>
编写主程序
最后,编写主程序MybatisExample
来测试各个功能:
package com.example;
import com.example.mapper.UserMapper;
import com.example.entity.User;
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.util.List;
public class MybatisExample {
public static void main(String[] args) {
try (SqlSession session = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("SqlMapConfig.xml")).openSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
// 插入操作
User user = new User();
user.setUsername("testUser");
user.setPassword("testPassword");
mapper.insert(user);
// 查询操作
List<User> users = mapper.selectAllUsers();
for (User u : users) {
System.out.println(u.getUsername());
}
// 更新操作
user.setId(1);
user.setUsername("updatedUser");
mapper.update(user);
// 删除操作
mapper.delete(1);
session.commit();
} catch (IOException e) {
e.printStackTrace();
}
}
}
通过上述步骤,我们完成了用户信息的增删改查操作,并进行了一定的测试,确保功能实现正确。
Mybatis高级特性和优化使用插件进行功能扩展
Mybatis允许通过插件机制自定义功能,可以在SqlSession执行前或执行后进行拦截和扩展。定义插件的方式如下:
package com.example.plugin;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.apache.ibatis.plugin.*;
import java.util.Properties;
@Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})})
public class MybatisPlugin implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
Executor executor = (Executor) invocation.getTarget();
MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
Object parameter = invocation.getArgs()[1];
BoundSql boundSql = mappedStatement.getBoundSql(parameter);
String sql = boundSql.getSql();
// 在这里可以对sql进行处理,比如添加日志等
System.out.println("SQL: " + sql);
return invocation.proceed();
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
}
}
在SqlMapConfig.xml
中配置插件:
<configuration>
<plugins>
<plugin interceptor="com.example.plugin.MybatisPlugin">
<property name="property1" value="value1"/>
</plugin>
</plugins>
<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/test"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/example/mapper/UserMapper.xml"/>
</mappers>
</configuration>
二级缓存的配置和使用
Mybatis支持一级和二级缓存,二级缓存可以缓存所有Mapper的查询结果,提高查询效率。
开启二级缓存:
<mapper namespace="com.example.mapper.UserMapper">
<cache/>
<select id="selectAllUsers" resultType="com.example.entity.User">
SELECT * FROM users
</select>
</mapper>
在主配置文件中配置共享缓存:
<configuration>
<cacheEnabled>true</cacheEnabled>
<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/test"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/example/mapper/UserMapper.xml"/>
</mappers>
</configuration>
数据库连接池的使用
Mybatis可以通过配置数据库连接池来优化数据库连接管理。常用的数据库连接池工具有DBCP、C3P0和Druid等。
使用Druid连接池:
<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/test"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
<property name="initialSize" value="5"/>
<property name="maxActive" value="20"/>
<property name="minIdle" value="5"/>
<property name="maxIdle" value="10"/>
<property name="timeBetweenEvictionRunsMillis" value="60000"/>
<property name="minEvictableIdleTimeMillis" value="300000"/>
<property name="validationQuery" value="SELECT 1"/>
<property name="testWhileIdle" value="true"/>
<property name="testOnBorrow" value="false"/>
<property name="testOnReturn" value="false"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/example/mapper/UserMapper.xml"/>
</mappers>
</configuration>
通过上述配置,我们可以有效地利用数据库连接池管理数据库连接,提高应用的性能和稳定性。
结语通过以上章节的学习和实践,我们详细介绍了Mybatis的基础概念、环境搭建、核心API、映射文件详解以及高级特性和优化。希望读者通过本文能够掌握Mybatis的基本用法,进一步提升自己的开发能力。更多详细的教程和实战案例可以参考Murong's Blog,该网站提供了丰富的Mybatis相关资源。