本文详细介绍了Mybatis持久层框架项目实战的相关内容,包括基础概念、工作原理、优势和应用场景。文章还涵盖了环境搭建、CRUD操作详解、动态SQL使用、与Spring集成以及高级特性等实用技术。通过本文的学习,读者可以全面掌握Mybatis的使用方法和高级特性。
Mybatis持久层框架项目实战入门教程 Mybatis基础概念介绍Mybatis简介
Mybatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。与JDBC相比,Mybatis提供了更多面向对象的API,使得操作数据库更加便捷。Mybatis通过XML或注解的方式将查询语句和Java方法进行映射。它是一种半自动化的ORM框架,可以通过半自动化的手段来完成数据持久层操作,降低了开发者的负担。Mybatis的核心目标是提供一种持久化操作的解决方案,将面向对象的概念与数据库的存储方式相结合,使得在面向对象的应用中,实现持久化操作变得更加容易。Mybatis的灵活性和易用性在很多项目中得到了广泛的应用。
Mybatis的工作原理
Mybatis的工作原理主要分为以下几步:
- 加载配置文件:Mybatis从配置文件中读取数据库连接信息、映射文件路径等信息。
- 读取映射文件:配置文件中定义了映射文件的位置,Mybatis读取这些文件,解析其中的SQL语句和映射关系。
- 创建会话对象:Mybatis通过SqlSessionFactory创建SqlSession,SqlSession是一个会话对象,它提供了执行SQL查询、提交事务等操作的方法。
- 执行SQL语句:通过SqlSession对象执行SQL语句,可以是增删改查等操作。
- 结果映射:将查询结果映射到Java对象中。
- 关闭会话对象:操作完成后关闭SqlSession对象,释放资源。
Mybatis的优势和应用场景
优势
- 灵活的SQL支持:Mybatis允许使用原始的SQL语句,对于复杂查询有很好的支持。
- 高性能:Mybatis直接操作数据库,避免了ORM框架中复杂的对象映射过程,提高了性能。
- 面向应用:Mybatis不是全自动化的ORM框架,它允许用户在代码中直接编写SQL语句,增强了程序的灵活性和控制力。
- 轻量级:Mybatis的配置文件和映射文件都是纯XML格式,易于维护,方便学习和使用。
应用场景
- 复杂查询:适用于需要进行复杂SQL查询的场景,如分页查询、关联查询等。
- 性能敏感:对于性能要求较高的系统,Mybatis可以直接操作数据库,避免了ORM框架带来的对象映射开销。
- 灵活性:对于灵活性要求较高的项目,Mybatis提供了直接编写SQL语句的能力,可以更好地控制数据库操作细节。
开发环境准备
为了搭建Mybatis的开发环境,你需要以下工具和库:
- Java JDK
- IDE(如 IntelliJ IDEA、Eclipse)
- Maven(依赖管理和构建工具)
- 数据库(如 MySQL)
Maven项目构建
- 创建一个新的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.26</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
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/mydb"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/example/mapper/UserMapper.xml"/>
</mappers>
</configuration>
数据库连接配置
确保你已经创建了数据库和需要的表。例如,创建一个名为mydb
的数据库,并创建一个User
表:
CREATE DATABASE mydb;
USE mydb;
CREATE TABLE User (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50),
password VARCHAR(50)
);
Mybatis CRUD操作详解
增加数据
首先定义一个映射文件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">
<insert id="insertUser">
INSERT INTO User (username, password) VALUES (#{username}, #{password})
</insert>
</mapper>
在Java代码中,定义一个接口UserMapper
,并使用SqlSession执行插入操作。
public interface UserMapper {
int insertUser(User user);
}
public class MybatisExample {
public static void main(String[] args) {
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
SqlSession session = factory.openSession();
try {
UserMapper mapper = session.getMapper(UserMapper.class);
User user = new User("testUser", "testPassword");
int rows = mapper.insertUser(user);
session.commit();
} finally {
session.close();
}
}
}
查询数据
定义查询数据的SQL语句。
<select id="getUserById" resultType="com.example.model.User">
SELECT id, username, password FROM User WHERE id = #{id}
</select>
在Java代码中,定义一个查询方法并执行。
public interface UserMapper {
User getUserById(int id);
}
public class MybatisExample {
public static void main(String[] args) {
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
SqlSession session = factory.openSession();
try {
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.getUserById(1);
System.out.println(user);
} finally {
session.close();
}
}
}
更新数据
定义更新数据的SQL语句。
<update id="updateUser">
UPDATE User SET username = #{username}, password = #{password} WHERE id = #{id}
</update>
在Java代码中,定义一个更新方法并执行。
public interface UserMapper {
int updateUser(User user);
}
public class MybatisExample {
public static void main(String[] args) {
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
SqlSession session = factory.openSession();
try {
UserMapper mapper = session.getMapper(UserMapper.class);
User user = new User(1, "newUsername", "newPassword");
int rows = mapper.updateUser(user);
session.commit();
} finally {
session.close();
}
}
}
删除数据
定义删除数据的SQL语句。
<delete id="deleteUserById">
DELETE FROM User WHERE id = #{id}
</delete>
在Java代码中,定义一个删除方法并执行。
public interface UserMapper {
int deleteUserById(int id);
}
public class MybatisExample {
public static void main(String[] args) {
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
SqlSession session = factory.openSession();
try {
UserMapper mapper = session.getMapper(UserMapper.class);
int rows = mapper.deleteUserById(1);
session.commit();
} finally {
session.close();
}
}
}
批量操作
定义批量插入数据的SQL语句。
<insert id="insertUsers">
INSERT INTO User (username, password) VALUES
<foreach item="item" index="index" collection="list" separator="," open="(" close=")">
#{item.username}, #{item.password}
</foreach>
</insert>
在Java代码中,定义一个批量插入方法并执行。
public interface UserMapper {
int insertUsers(List<User> users);
}
public class MybatisExample {
public static void main(String[] args) {
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
SqlSession session = factory.openSession();
try {
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> users = Arrays.asList(
new User("user1", "password1"),
new User("user2", "password2")
);
int rows = mapper.insertUsers(users);
session.commit();
} finally {
session.close();
}
}
}
Mybatis动态SQL使用
if标签
使用if
标签可以条件性地包含SQL语句片段。
<select id="selectUser" resultType="com.example.model.User">
SELECT id, username, password FROM User
<where>
<if test="id != null">
AND id = #{id}
</if>
<if test="username != null">
AND username = #{username}
</if>
</where>
</select>
在Java代码中,定义一个查询方法并执行。
public interface UserMapper {
User selectUser(int id, String username);
}
public class MybatisExample {
public static void main(String[] args) {
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
SqlSession session = factory.openSession();
try {
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.selectUser(1, "testUser");
System.out.println(user);
} finally {
session.close();
}
}
}
choose标签
使用choose
标签可以实现多条件分支。
<select id="selectUser" resultType="com.example.model.User">
SELECT id, username, password FROM User
<where>
<choose>
<when test="id != null">
AND id = #{id}
</when>
<when test="username != null">
AND username = #{username}
</when>
<otherwise>
AND password = #{password}
</otherwise>
</choose>
</where>
</select>
foreach标签
使用foreach
标签可以实现循环遍历集合。
<update id="updateUsers">
UPDATE User SET username = #{username}, password = #{password}
WHERE id IN
<foreach item="item" index="index" collection="ids" separator="," open="(" close=")">
#{item}
</foreach>
</update>
在Java代码中,定义一个更新方法并执行。
public interface UserMapper {
int updateUsers(List<Integer> ids, String username, String password);
}
public class MybatisExample {
public static void main(String[] args) {
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
SqlSession session = factory.openSession();
try {
UserMapper mapper = session.getMapper(UserMapper.class);
List<Integer> ids = Arrays.asList(1, 2);
int rows = mapper.updateUsers(ids, "newUsername", "newPassword");
session.commit();
} finally {
session.close();
}
}
}
set和trim标签
使用set
标签可以实现自动过滤更新字段。
<update id="updateUser">
UPDATE User
<set>
<if test="username != null">username = #{username},</if>
<if test="password != null">password = #{password},</if>
</set>
WHERE id = #{id}
</update>
使用trim
标签可以实现SQL语句的前缀和后缀处理。
<select id="selectUser" resultType="com.example.model.User">
SELECT id, username, password FROM User
<where>
<trim prefix="WHERE" prefixOverrides="AND |OR ">
<if test="id != null">AND id = #{id}</if>
<if test="username != null">AND username = #{username}</if>
</trim>
</where>
</select>
Mybatis与Spring集成
Mybatis与Spring整合简介
Mybatis与Spring集成可以方便地使用Spring的依赖注入和事务管理。通过Spring的SqlSessionFactoryBean
和MapperScannerConfigurer
可以简化配置。
配置DataSource
在Spring配置文件中配置DataSource。
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</bean>
配置SqlSessionFactory
使用SqlSessionFactoryBean
配置SqlSessionFactory。
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
使用Mapper接口
Mapper接口不需要单独配置,使用MapperScannerConfigurer
自动扫描。
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.mapper"/>
</bean>
事务管理
使用Spring的DataSourceTransactionManager
进行事务管理。
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
在Mapper接口中添加事务注解。
public interface UserMapper {
@Transactional
int updateUser(User user);
}
在Service中使用Mapper接口。
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public User getUserById(int id) {
return userMapper.selectUser(id);
}
@Transactional
public int updateUser(User user) {
return userMapper.updateUser(user);
}
}
Mybatis高级特性
结果集映射
结果集映射可以将查询结果映射到Java对象中。
<select id="selectUser" resultType="com.example.model.User">
SELECT id, username, password FROM User WHERE id = #{id}
</select>
在Java代码中,定义一个查询方法并执行。
public interface UserMapper {
User selectUser(int id);
}
public class MybatisExample {
public static void main(String[] args) {
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
SqlSession session = factory.openSession();
try {
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.selectUser(1);
System.out.println(user);
} finally {
session.close();
}
}
}
分页查询
分页查询可以通过插件实现。
public class PagePlugin implements Interceptor {
@Override
public Object intercept(Invocation invocation) {
// 实现分页插件逻辑
return invocation.proceed();
}
}
在配置文件中添加插件配置。
<configuration>
<plugins>
<plugin interceptor="com.example.plugin.PagePlugin">
<property name="dialect" value="mysql"/>
</plugin>
</plugins>
</configuration>
扩展插件
插件可以通过实现Interceptor
接口实现Mybatis的扩展。
public class MybatisPlugin implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
// 实现插件逻辑
return invocation.proceed();
}
}
在配置文件中添加插件配置。
<configuration>
<plugins>
<plugin interceptor="com.example.plugin.MybatisPlugin">
<property name="property" value="value"/>
</plugin>
</plugins>
</configuration>
二级缓存
二级缓存可以提高查询性能。
<cache/>
在配置文件中添加缓存配置。
<configuration>
<cache-ref default="true" />
</configuration>
在Mapper文件中启用缓存。
<mapper namespace="com.example.mapper.UserMapper">
<cache />
</mapper>
在Java代码中,定义一个查询方法并执行。
public interface UserMapper {
User selectUser(int id);
}
public class MybatisExample {
public static void main(String[] args) {
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
SqlSession session = factory.openSession();
try {
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.selectUser(1);
System.out.println(user);
} finally {
session.close();
}
}
}
通过以上步骤,你可以全面了解和掌握Mybatis的使用方法和高级特性。希望这个教程对你有所帮助。
共同学习,写下你的评论
评论加载中...
作者其他优质文章