本文详细介绍了MyBatis学习的全过程,涵盖从环境搭建到核心配置,再到映射文件的编写和动态SQL的使用。文章深入探讨了MyBatis的高级特性,如缓存机制和插件机制,帮助读者全面掌握MyBatis。MyBatis学习不仅涉及基础操作,还包括了注解开发和实战案例,旨在帮助新手快速上手并应用于实际项目。
MyBatis学习:新手入门到上手实战指南 MyBatis简介与环境搭建MyBatis的基本概念
MyBatis 是一个优秀的持久层框架,支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解进行配置和原始映射,将接口和 Java 的 POJOs(普通的 Java 对象)映射成数据库中的记录。
开发环境搭建
安装JDK和Maven
- 下载并安装JDK。
- 安装Maven,并确保Maven已经添加到系统的
PATH
环境变量中。可以通过命令mvn -v
来验证Maven是否安装成功。
创建Maven项目
使用IntelliJ IDEA或Eclipse创建一个新的Maven项目。
- 在项目中创建
src/main/java
和src/main/resources
两个目录。 - 在
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.23</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
``
#### 配置数据库
- 创建一个MySQL数据库,例如`mybatis_db`。
- 创建一个用户表`users`。
```sql
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(255) NOT NULL,
password VARCHAR(255) NOT NULL
);
- 向
users
表中插入一些数据。
INSERT INTO users (id, username, password) VALUES (1, 'admin', '123456');
INSERT INTO users (id, username, password) VALUES (2, 'user', 'password');
第一个MyBatis程序
编写第一个MyBatis程序,包括创建User
类和UserMapper
接口。
- 创建
User
类。
public class User {
private int id;
private String username;
private String password;
// Getter and Setter methods
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;
}
}
- 创建
UserMapper
接口。
public interface UserMapper {
User selectUser(int id);
}
- 创建
MyBatisConfig.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_db"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
- 创建
UserMapper.xml
映射文件。
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectUser" resultType="com.example.model.User">
SELECT id, username, password FROM users WHERE id = #{id}
</select>
</mapper>
- 编写测试类
MyBatisTest
。
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.io.InputStream;
public class MyBatisTest {
public static void main(String[] args) throws IOException {
String resource = "MyBatisConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
try (SqlSession session = sqlSessionFactory.openSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.selectUser(1);
System.out.println(user.getUsername());
}
}
}
MyBatis核心配置
配置文件详解
MyBatis的配置文件MyBatisConfig.xml
是整个MyBatis配置的核心。它主要包含以下配置信息:
- 数据库连接信息
- MyBatis的运行配置
- 映射器的映射文件
数据库连接配置
配置数据源和数据库连接信息。
<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_db"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
SqlSessionFactory配置
配置SqlSessionFactory
的创建。
<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_db"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
MyBatis映射文件详解
映射文件的基本结构
MyBatis映射文件定义了SQL语句和映射规则,常见的标签有<select>
、<insert>
、<update>
、<delete>
。
示例代码
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectUser" resultType="com.example.model.User">
SELECT id, username, password FROM users WHERE id = #{id}
</select>
<insert id="insertUser">
INSERT INTO users (id, username, password) VALUES (#{id}, #{username}, #{password})
</insert>
<update id="updateUser">
UPDATE users SET username = #{username}, password = #{password} WHERE id = #{id}
</update>
<delete id="deleteUser">
DELETE FROM users WHERE id = #{id}
</delete>
</mapper>
SQL语句的编写
MyBatis映射文件中定义的SQL语句可以直接使用数据库支持的SQL语法。
示例代码
<insert id="insertUser">
INSERT INTO users (id, username, password) VALUES (#{id}, #{username}, #{password})
</insert>
结果集的映射
结果集的映射通过<select>
标签的resultType
属性来实现。
示例代码
<select id="selectUser" resultType="com.example.model.User">
SELECT id, username, password FROM users WHERE id = #{id}
</select>
动态SQL的使用
条件查询
动态SQL可以根据条件自动生成SQL语句。
示例代码
<if test="username != null">
AND username = #{username}
</if>
分支语句
使用<choose>
、<when>
和<otherwise>
标签来实现分支条件。
示例代码
<choose>
<when test="id != null">
AND id = #{id}
</when>
<when test="username != null">
AND username = #{username}
</when>
<otherwise>
AND password = #{password}
</otherwise>
</choose>
循环语句
使用<foreach>
标签来实现循环。
示例代码
<select id="selectUsers" resultType="com.example.model.User">
SELECT id, username, password FROM users WHERE id IN
<foreach item="item" index="index" collection="ids" open="(" separator="," close=")">
#{item}
</foreach>
</select>
MyBatis与注解开发
注解的基本使用
MyBatis提供了一系列注解,可以在Mapper接口中使用。
示例代码
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Update;
import org.apache.ibatis.annotations.Delete;
public interface UserMapper {
@Select("SELECT id, username, password FROM users WHERE id = #{id}")
User selectUser(int id);
@Insert("INSERT INTO users (id, username, password) VALUES (#{id}, #{username}, #{password})")
void insertUser(User user);
@Update("UPDATE users SET username = #{username}, password = #{password} WHERE id = #{id}")
void updateUser(User user);
@Delete("DELETE FROM users WHERE id = #{id}")
void deleteUser(int id);
}
注解与XML配置的对比
- 注解开发的代码更简洁。
- XML配置更加灵活,适用于复杂的场景。
实战案例
创建测试类
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.io.InputStream;
import java.util.List;
public class MyBatisAnnotatedTest {
public static void main(String[] args) throws IOException {
String resource = "MyBatisConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
try (SqlSession session = sqlSessionFactory.openSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.selectUser(1);
System.out.println(user.getUsername());
User newUser = new User();
newUser.setId(3);
newUser.setUsername("newUser");
newUser.setPassword("newPassword");
mapper.insertUser(newUser);
session.commit();
List<User> users = mapper.selectUsers();
for (User u : users) {
System.out.println(u.getUsername());
}
}
}
}
MyBatis高级特性
缓存机制
MyBatis提供了一级缓存和二级缓存。
示例代码
<cache />
使用缓存
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
public class CacheTest {
public static void main(String[] args) throws IOException {
String resource = "MyBatisConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
try (SqlSession session1 = sqlSessionFactory.openSession(); SqlSession session2 = sqlSessionFactory.openSession()) {
UserMapper mapper1 = session1.getMapper(UserMapper.class);
UserMapper mapper2 = session2.getMapper(UserMapper.class);
User user1 = mapper1.selectUser(1);
User user2 = mapper2.selectUser(1);
System.out.println(user1 == user2); // 输出 true,因为它们来自同一 SqlSession 的缓存
}
}
}
分页处理
使用MyBatis的RowBounds
类来实现分页。
示例代码
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
import java.util.List;
public class PaginationTest {
public static void main(String[] args) throws IOException {
String resource = "MyBatisConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
try (SqlSession session = sqlSessionFactory.openSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> users = mapper.selectUsers(new RowBounds(0, 10));
for (User u : users) {
System.out.println(u.getUsername());
}
}
}
}
插件机制
MyBatis插件允许对MyBatis的执行过程进行拦截,可以用于实现日志记录、性能统计等。
示例代码
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 java.util.Properties;
public class MyPlugin implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
Object[] args = invocation.getArgs();
MappedStatement mappedStatement = (MappedStatement) args[0];
Object parameter = args[1];
BoundSql boundSql = mappedStatement.getBoundSql(parameter);
String sql = boundSql.getSql();
System.out.println("Executing SQL: " + sql);
return invocation.proceed();
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
// 设置插件属性
}
}
<plugins>
<plugin interceptor="com.example.interceptor.MyPlugin">
<property name="property1" value="value1"/>
</plugin>
</plugins>
``
通过以上内容,你可以系统地学习和掌握MyBatis的基本概念和高级特性,为实际项目开发打下坚实的基础。
共同学习,写下你的评论
评论加载中...
作者其他优质文章