Mybatis是一个强大的持久层框架,提供了动态SQL、缓存和类型映射等特性,简化了数据库操作。本文详细介绍了Mybatis的环境搭建、核心概念、CRUD操作、动态SQL以及高级用法,帮助开发者更高效地使用Mybatis。
Mybatis简介及环境搭建 Mybatis是什么Mybatis是一个强大的持久层框架,它提供了动态SQL、缓存和类型映射等特性。Mybatis简化了数据库操作,允许开发者通过简单的Java对象来操作数据库,从而减少了编写SQL语句的复杂度。
Mybatis的优势和应用场景Mybatis的优点包括:
- 简化了数据库操作,通过简单的Java对象映射到数据库表。
- 支持动态SQL,能够灵活处理复杂的查询。
- 提供了缓存机制,以提高查询性能。
- 与数据库无关,支持多种数据库。
应用场景包括:
- 需要灵活使用SQL的场景。
- 需要高效处理大数据量的场景。
- 需要简化数据库操作的项目。
- 需要动态查询的场景,如复杂的条件查询。
下载Mybatis
Mybatis的最新版本和相关文档可以从其官方网站下载。下载完成后,解压文件,将解压后的目录放到你的项目中。
创建Spring Boot项目
使用IDE创建一个新的Spring Boot项目。添加Mybatis的依赖。例如,如果你使用的是Maven,在pom.xml
中添加以下依赖:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
配置数据库连接
在application.properties
文件中配置数据库连接信息:
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
mybatis.mapper-locations=classpath:mapper/*.xml
创建数据库表
创建数据库表user
,用于存储用户信息:
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1001 DEFAULT CHARSET=utf8;
Mybatis的核心概念与配置
概念解析:SqlSessionFactory与SqlSession
- SqlSessionFactory:工厂模式,用于创建SqlSession的工厂类。
- SqlSession:代表一次会话,可以执行数据库的增删改查操作。
创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
Mybatis配置文件详解
Mybatis的核心配置文件是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="root"/>
</dataSource>
</environment>
</environments>
<!--其他配置-->
</configuration>
类型别名配置
<typeAliases>
<typeAlias alias="User" type="com.example.model.User"/>
</typeAliases>
映射文件位置配置
<mappers>
<mapper resource="com/example/mapper/UserMapper.xml"/>
</mappers>
Mybatis的配置步骤
- 创建
mybatis-config.xml
文件,配置数据库环境、类型别名、映射文件位置等。 - 创建
UserMapper.xml
文件,配置SQL语句。 - 创建
User
实体类。 - 创建
UserMapper
接口,声明SQL操作方法。 - 在主程序中,创建SqlSessionFactory和SqlSession,执行数据库操作。
// 创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
// 创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
Mybatis的CRUD操作
添加数据(Insert操作)
User实体类
public class User {
private int id;
private String username;
private String password;
// 构造函数、getters和setters省略
}
UserMapper接口
public interface UserMapper {
int insertUser(User user);
}
UserMapper.xml映射文件
<mapper namespace="com.example.mapper.UserMapper">
<insert id="insertUser">
INSERT INTO user (username, password) VALUES (#{username}, #{password})
</insert>
</mapper>
插入数据
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = new User();
user.setUsername("testUser");
user.setPassword("testPassword");
userMapper.insertUser(user);
sqlSession.commit();
sqlSession.close();
修改数据(Update操作)
UserMapper接口
public interface UserMapper {
int updateUser(User user);
}
UserMapper.xml映射文件
<update id="updateUser">
UPDATE user SET username=#{username}, password=#{password} WHERE id=#{id}
</update>
更新数据
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = new User();
user.setId(1);
user.setUsername("newUsername");
user.setPassword("newPassword");
userMapper.updateUser(user);
sqlSession.commit();
sqlSession.close();
查询数据(Select操作)
UserMapper接口
public interface UserMapper {
List<User> selectUsers();
}
UserMapper.xml映射文件
<select id="selectUsers" resultType="User">
SELECT * FROM user
</select>
查询数据
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> users = userMapper.selectUsers();
sqlSession.close();
删除数据(Delete操作)
UserMapper接口
public interface UserMapper {
int deleteUser(int id);
}
UserMapper.xml映射文件
<delete id="deleteUser">
DELETE FROM user WHERE id=#{id}
</delete>
删除数据
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
int result = userMapper.deleteUser(1);
sqlSession.commit();
sqlSession.close();
Mybatis与Mapper映射文件
使用Mapper文件的好处
使用Mapper文件可以将SQL语句和Java代码完全解耦,使代码更清晰、更易于维护。Mapper文件中定义了SQL语句,Java代码中调用Mapper接口即可。
创建Mapper文件的步骤- 创建Mapper接口。
- 创建Mapper映射文件,定义SQL语句。
- 在
mybatis-config.xml
配置Mapper文件位置。 - 在Java代码中获取Mapper接口实例,执行SQL操作。
UserMapper接口
public interface UserMapper {
int insertUser(User user);
int updateUser(User user);
List<User> selectUsers();
int deleteUser(int id);
}
UserMapper.xml映射文件
<mapper namespace="com.example.mapper.UserMapper">
<insert id="insertUser">
INSERT INTO user (username, password) VALUES (#{username}, #{password})
</insert>
<update id="updateUser">
UPDATE user SET username=#{username}, password=#{password} WHERE id=#{id}
</update>
<select id="selectUsers" resultType="User">
SELECT * FROM user
</select>
<delete id="deleteUser">
DELETE FROM user WHERE id=#{id}
</delete>
</mapper>
参数映射与结果映射
参数映射
参数映射定义了Java对象和SQL语句中的参数之间的关系。
<insert id="insertUser">
INSERT INTO user (username, password) VALUES (#{username}, #{password})
</insert>
结果映射
结果映射定义了数据库字段和Java对象属性之间的关系。
<select id="selectUsers" resultType="User">
SELECT * FROM user
</select>
Mybatis的动态SQL
动态SQL的必要性
动态SQL允许根据运行时的条件生成SQL语句,提高了SQL语句的灵活性。例如,可以根据不同的条件生成不同的查询语句。
if、choose、when、otherwise标签使用if标签
if标签用于判断某个条件是否满足,如果条件满足,则生成相应的SQL代码。
<select id="selectUsers" resultType="User">
SELECT * FROM user WHERE
<if test="username != null">
username = #{username}
</if>
<if test="password != null">
AND password = #{password}
</if>
</select>
choose、when、otherwise标签
choose标签用于实现类似于Java中的switch语句,实现多个条件的选择。
<select id="selectUsers" resultType="User">
SELECT * FROM user WHERE
<choose>
<when test="username != null">
username = #{username}
</when>
<when test="password != null">
password = #{password}
</when>
<otherwise>
id = #{id}
</otherwise>
</choose>
</select>
set、foreach标签使用
set标签
set标签用于实现动态更新,只更新满足条件的字段。
<update id="updateUser">
UPDATE user SET
<set>
<if test="username != null">username = #{username},</if>
<if test="password != null">password = #{password},</if>
</set>
WHERE id = #{id}
</update>
foreach标签
foreach标签用于遍历集合,生成多个SQL语句。
<update id="updateUsers">
UPDATE user SET
<foreach item="item" index="index" collection="users" open="(" separator="," close=")">
id = #{item.id}
</foreach>
</update>
Mybatis的高级用法
分页查询
分页查询需要使用RowBounds或PageHelper插件来实现。
RowBounds分页
List<User> users = sqlSession.selectList("com.example.mapper.UserMapper.selectUsers", null, new RowBounds(0, 10));
PageHelper分页插件
首先引入PageHelper依赖。
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.2</version>
</dependency>
配置PageHelper插件。
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.Page;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.session.SqlSessionFactory;
PageHelper pageHelper = new PageHelper();
Properties properties = new Properties();
properties.setProperty("helperDialect", "mysql");
properties.setProperty("reasonable", "true");
pageHelper.setProperties(properties);
List<Interceptor> interceptors = new ArrayList<>();
interceptors.add(pageHelper);
Configuration configuration = new Configuration();
configuration.setInterceptors(interceptors);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader, configuration);
使用PageHelper进行分页查询。
Page<User> usersPage = PageHelper.startPage(1, 10).doPageQuery();
List<User> users = usersPage.getResult();
批量插入
批量插入可以提高插入效率,通过批量插入操作,减少数据库的交互次数。
使用SqlSession批量插入
List<User> users = new ArrayList<>();
users.add(new User(1, "testUser1", "testPassword1"));
users.add(new User(2, "testUser2", "testPassword2"));
sqlSession.insert("com.example.mapper.UserMapper.batchInsertUsers", users);
sqlSession.commit();
sqlSession.close();
使用foreach标签批量插入
<insert id="batchInsertUsers">
INSERT INTO user (username, password)
<foreach item="item" index="index" collection="users" open="(" separator="," close=")">
(#{item.username}, #{item.password})
</foreach>
</insert>
使用插件
Mybatis提供了插件机制,可以通过插件扩展Mybatis的功能。
插件的创建
创建插件类,实现Interceptor
接口。
public class MybatisPlugin implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
// 在执行SQL之前的一些处理
Object result = invocation.proceed();
// 在执行SQL之后的一些处理
return result;
}
@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="property" value="value"/>
</plugin>
</plugins>
插件的使用
在需要使用插件的地方,直接使用即可。
public interface UserMapper {
int insertUser(User user);
}
插件会在每次调用Mapper接口方法时执行。
插件可以用于日志记录、数据加密、性能监控等多种用途。
以上是Mybatis的详细介绍,包括环境搭建、核心概念、CRUD操作、动态SQL、分页查询、批量插入和插件的使用。通过这些内容,你可以详细了解和掌握Mybatis框架的使用。如果你有更多的需求和疑问,可以参考慕课网上的相关课程进行深入学习。
共同学习,写下你的评论
评论加载中...
作者其他优质文章