各位帅哥美女,编辑不易,动动发财小手,来个三连加关注,后续会有更加优秀的推文推出~
学会编写基本的mapper对数据进行CRUD操作,掌握一对多和多对一的关系,会编写动态SQL(工作中编写mapper对数据的查询操作较多,特别是对多表进行查询操作能极大的提高效率,一定要掌握)
目录
1. 介绍MyBatis
MyBatis 是一个开源的持久层框架,它简化了数据库操作和SQL语句的处理。相较于传统的JDBC,MyBatis更加灵活,并提供了一种将Java对象和数据库中的数据进行映射的方式。
2. MyBatis核心概念
2.1 映射文件(Mapper XML)
MyBatis通过映射文件定义了SQL语句以及将数据库字段映射到Java对象的规则。一个典型的Mapper XML文件包含了数据库表的各种操作,如查询、插入、更新、删除等。
<!-- UserMapper.xml -->
<mapper namespace="com.example.mapper.UserMapper">
<select id="getUserById" parameterType="int" resultType="com.example.model.User">
SELECT * FROM users WHERE id = #{id}
</select>
</mapper>
2.2 数据模型(Model)
数据模型是Java对象,用于映射数据库表中的数据。在MyBatis中,模型对象的字段和数据库表的列一一对应。
// User.java
public class User {
private int id;
private String username;
private String email;
// 省略getter和setter方法
}
2.3 映射接口(Mapper Interface)
映射接口定义了数据库操作的方法,通过注解或XML方式指定SQL语句。MyBatis会动态生成接口的实现类。
// UserMapper.java
public interface UserMapper {
User getUserById(int id);
}
2.4 配置文件
MyBatis的配置文件包含了框架的全局配置信息,如数据库连接、映射文件的位置、插件等。
<!-- mybatis-config.xml -->
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydatabase"/>
<property name="username" value="username"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/example/mapper/UserMapper.xml"/>
</mappers>
</configuration>
3. MyBatis基本用法
3.1 配置文件加载
首先,需要创建 MyBatis 的配置文件,通常是一个 XML 文件,其中包含数据库连接信息、映射文件的位置等配置。
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
3.2映射文件
映射文件定义了 SQL 语句和 Java 对象之间的映射关系。每个映射文件对应一个数据模型(Java 对象)。
<!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="getUserById" parameterType="int" resultType="com.example.model.User">
SELECT * FROM users WHERE id = #{id}
</select>
</mapper>
3.3. 数据模型
数据模型是 Java 对象,用于映射数据库表中的数据。
public class User {
private int id;
private String username;
private String email;
// 省略 getter 和 setter 方法
}
3.4. 配置文件加载
在代码中加载 MyBatis 的配置文件,构建 SqlSessionFactory
。
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class MyBatisExample {
public static void main(String[] args) {
try {
// 加载 MyBatis 配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 构建 SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 使用 SqlSessionFactory 创建 SqlSession
// TODO: 进行数据库操作...
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.5 获取Mapper对象
在 SqlSession
中获取映射器(Mapper)对象,用于执行 SQL 语句。
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
3.6 执行SQL语句
通过映射器对象执行 SQL 语句。
User user = userMapper.getUserById(1);
3.7 提交事务
在进行数据库操作后,需要提交事务并关闭 SqlSession
。
sqlSession.commit();
3.8 关闭SqlSession
sqlSession.close();
4. 参数传递与结果映射
4.1 参数传递
MyBatis支持多种参数传递方式,包括基本类型、POJO对象、Map等。
<!-- UserMapper.xml -->
<select id="getUserByUsernameAndEmail" parameterType="map" resultType="com.example.model.User">
SELECT * FROM users WHERE username = #{username} AND email = #{email}
</select>
4.2 结果映射
MyBatis可以将查询结果映射到Java对象,支持自动映射和手动映射。
<!-- UserMapper.xml -->
<select id="getUserById" parameterType="int" resultType="com.example.model.User">
SELECT * FROM users WHERE id = #{id}
</select>
5. 动态SQL
MyBatis提供了强大的动态SQL功能,可以根据条件动态生成SQL语句。
<!-- UserMapper.xml -->
<select id="getUserByCondition" parameterType="map" resultType="com.example.model.User">
SELECT * FROM users
<where>
<if test="username != null">AND username = #{username}</if>
<if test="email != null">AND email = #{email}</if>
</where>
</select>
// UserMapper.java
User getUserByCondition(Map<String, String> condition);
6. MyBatis插件
MyBatis允许通过插件方式扩展其功能,例如自定义拦截器。
// MyPlugin.java
@Intercepts({
@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})
})
public class MyPlugin implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
// 在方法执行前进行拦截处理
return invocation.proceed();
}
@Override
public Object plugin(Object target) {
// 包装目标对象,返回一个代理对象
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
// 设置插件的属性
}
}
7. MyBatis与Spring集成
MyBatis可以与Spring框架集成,通过Spring提供的事务管理等功能简化开发流程。
<!-- applicationContext.xml -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydatabase"/>
<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 id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="com.example.mapper.UserMapper"/>
<property name="sqlSessionTemplate" ref="sqlSessionTemplate"/>
</bean>
8. 缓存机制
MyBatis提供了一级缓存和二级缓存机制,可以提高查询性能。
<!-- UserMapper.xml -->
<select id="getUserById" parameterType="int" resultType="com.example.model.User" useCache="true">
SELECT * FROM users WHERE id = #{id}
</select>
9. 动态代理
MyBatis使用动态代理技术生成Mapper接口的实现类。
// UserMapperProxy.java
public class UserMapperProxy implements InvocationHandler {
private SqlSession sqlSession;
public UserMapperProxy(SqlSession sqlSession) {
this.sqlSession = sqlSession;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 通过动态代理调用SqlSession的方法
return sqlSession.selectOne(method.getDeclaringClass().getName() + "." + method.getName(), args[0]);
}
}
10. 总结
MyBatis作为一款优秀的持久层框架,提供了丰富的功能和灵活的配置,使得Java开发者能够更轻松地与数据库进行交互。从基本的配置、映射到高级的动态SQL、插件和缓存机制,本篇博客对MyBatis的技术全面介绍。希望读者通过学习MyBatis,能够更加高效地进行数据库访问,提升项目的开发效率。