MyBatis是一个优秀的持久层框架,支持定制化SQL、存储过程和高级映射,简化了数据库操作并提高了性能。本文将详细介绍如何搭建MyBatis环境,配置数据库连接,并进行基本的CRUD操作。此外,还将探讨动态SQL的使用和MyBatis与Spring的集成。
MyBatis简介MyBatis是什么
MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的POJO (Plain Old Java Object) 映射成数据库中的记录。
MyBatis的优点
- 简化数据库操作:MyBatis通过XML或注解进行配置,可以将复杂的SQL语句映射成Java代码,简化了数据库操作。
- 灵活性:MyBatis使用XML或注解来配置SQL语句,可以非常灵活地进行SQL调整和优化。
- 支持复杂查询:MyBatis支持存储过程和动态SQL,可以非常方便地进行复杂查询。
- 性能优越:MyBatis通过直接映射到数据库中的表,省去了繁琐的对象关系映射,提高了性能。
- 易于学习:MyBatis的学习曲线平缓,容易上手,易于维护。
下载MyBatis
首先,访问MyBatis的官方GitHub仓库地址,下载MyBatis的最新版本:
https://github.com/mybatis/mybatis-3/releases
下载完成后,解压文件,就可以使用其中的jar包进行开发了。
创建项目并引入MyBatis依赖
创建一个Java项目。在项目中引入MyBatis的相关依赖。这里以Maven项目为例,通过在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>
</dependencies>
配置数据库连接
在项目的resources
目录下创建一个数据库连接配置文件db.properties
,用于存储数据库连接信息:
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis
username=root
password=123456
初始化SqlSessionFactory
在Java代码中,我们需要初始化SqlSessionFactory
,这可以通过读取配置文件来实现。以下是一个示例代码:
public SqlSessionFactory getSqlSessionFactory() {
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
return sqlSessionFactory;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
MyBatis核心配置
mybatis-config.xml配置文件详解
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="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- 配置映射文件的位置 -->
<mappers>
<mapper resource="com/example/mapping/UserMapper.xml"/>
</mappers>
</configuration>
指定数据源和事务管理器
在配置文件中,environments
标签下定义了不同的环境配置,每个环境配置包括一个transactionManager
和一个dataSource
。transactionManager
可以设置为JDBC
、MANAGED
或UNMANAGED
。dataSource
可以设置为UNPOOLED
、POOLED
或JNDI
。
示例代码:
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(Resources.getResourceAsReader("mybatis-config.xml"));
CRUD操作详解
创建数据表和示例数据
首先,创建一个简单的数据库表user
,表结构如下:
CREATE TABLE user (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50),
password VARCHAR(50),
email VARCHAR(50)
);
然后,插入一些示例数据:
INSERT INTO user (username, password, email) VALUES ('john', 'password', 'john@example.com');
INSERT INTO user (username, password, email) VALUES ('jane', 'password', 'jane@example.com');
编写Mapper接口和XML映射文件
定义一个UserMapper
接口,该接口映射了数据库操作方法:
public interface UserMapper {
List<User> selectAllUsers();
User selectUserById(int id);
void insertUser(User user);
void updateUser(User user);
void deleteUser(int id);
}
然后,创建对应的XML映射文件UserMapper.xml
:
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectAllUsers" resultType="com.example.entity.User">
SELECT * FROM user
</select>
<select id="selectUserById" resultType="com.example.entity.User">
SELECT * FROM user WHERE id = #{id}
</select>
<insert id="insertUser">
INSERT INTO user (username, password, email) VALUES (#{username}, #{password}, #{email})
</insert>
<update id="updateUser">
UPDATE user SET username=#{username}, password=#{password}, email=#{email} WHERE id=#{id}
</update>
<delete id="deleteUser">
DELETE FROM user WHERE id=#{id}
</delete>
</mapper>
执行增删改查操作
通过SqlSession
对象执行数据库操作:
public class UserMapperTest {
private SqlSessionFactory sqlSessionFactory;
private SqlSessionFactory getSqlSessionFactory() {
return new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
}
public List<User> selectAllUsers() {
try (SqlSession session = getSqlSessionFactory().openSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
return mapper.selectAllUsers();
}
}
public User selectUserById(int id) {
try (SqlSession session = getSqlSessionFactory().openSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
return mapper.selectUserById(id);
}
}
public void insertUser(User user) {
try (SqlSession session = getSqlSessionFactory().openSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
mapper.insertUser(user);
session.commit();
}
}
public void updateUser(User user) {
try (SqlSession session = getSqlSessionFactory().openSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
mapper.updateUser(user);
session.commit();
}
}
public void deleteUser(int id) {
try (SqlSession session = getSqlSessionFactory().openSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
mapper.deleteUser(id);
session.commit();
}
}
}
动态SQL的使用
条件查询
MyBatis通过<if>
、<choose>
、<when>
、<otherwise>
等标签来实现动态SQL。
示例配置文件UserMapper.xml
:
<select id="selectUserByCondition" resultType="com.example.entity.User">
SELECT * FROM user
WHERE 1=1
<if test="username != null">
AND username = #{username}
</if>
<if test="email != null">
AND email = #{email}
</if>
</select>
示例代码:
public List<User> selectUserByCondition(String username, String email) {
try (SqlSession session = getSqlSessionFactory().openSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
Map<String, Object> params = new HashMap<>();
params.put("username", username);
params.put("email", email);
return mapper.selectUserByCondition(params);
}
}
多表关联查询
MyBatis通过<resultMap>
和<association>
标签来实现多表关联查询。
假设我们有一个role
表和user_role
表,以及它们之间的关系:
CREATE TABLE role (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50)
);
CREATE TABLE user_role (
user_id INT,
role_id INT,
PRIMARY KEY (user_id, role_id),
FOREIGN KEY (user_id) REFERENCES user(id),
FOREIGN KEY (role_id) REFERENCES role(id)
);
在UserMapper.xml
中添加多表关联查询:
<resultMap id="UserResultMap" type="com.example.entity.User">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="password" column="password"/>
<result property="email" column="email"/>
<association property="roles" javaType="java.util.List" column="id" select="selectRolesByUserId"/>
</resultMap>
<select id="selectAllUsersWithRoles" resultMap="UserResultMap">
SELECT * FROM user
</select>
<select id="selectRolesByUserId" resultType="com.example.entity.Role">
SELECT r.* FROM role r JOIN user_role ur ON r.id = ur.role_id WHERE ur.user_id = #{id}
</select>
示例代码:
public class UserMapperTest {
private SqlSessionFactory sqlSessionFactory;
public List<User> selectAllUsersWithRoles() {
try (SqlSession session = getSqlSessionFactory().openSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
return mapper.selectAllUsersWithRoles();
}
}
}
MyBatis与Spring集成
配置Spring集成MyBatis
在Spring项目中,可以通过配置SqlSessionFactoryBean
和MapperScannerConfigurer
来实现MyBatis与Spring的集成。
示例applicationContext.xml
配置文件:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<property name="basePackage" value="com.example.mapper"/>
</bean>
使用注解简化开发流程
在Spring项目中,可以通过@Mapper
注解来简化Mapper接口的配置:
@Mapper
public interface UserMapper {
List<User> selectAllUsers();
User selectUserById(int id);
void insertUser(User user);
void updateUser(User user);
void deleteUser(int id);
List<User> selectUserByCondition(@Param("username") String username, @Param("email") String email);
}
在applicationContext.xml
中,可以通过<context:component-scan>
标签来扫描带有@Mapper
注解的接口:
<context:component-scan base-package="com.example"/>
示例代码:
public class UserMapperTest {
private ApplicationContext context;
public UserMapperTest() {
this.context = new ClassPathXmlApplicationContext("applicationContext.xml");
}
public List<User> selectAllUsers() {
UserMapper mapper = context.getBean(UserMapper.class);
return mapper.selectAllUsers();
}
public List<User> selectUserByCondition(String username, String email) {
UserMapper mapper = context.getBean(UserMapper.class);
return mapper.selectUserByCondition(username, email);
}
}
通过以上步骤,您已经掌握了MyBatis的基本使用方法,包括环境搭建、核心配置、CRUD操作、动态SQL的使用以及与Spring的集成。希望本文能帮助您更好地理解和使用MyBatis框架。