MyBatis的XML整体介绍
MyBatis 的 XML 配置文件结构如下:
configuration 配置
properties 属性
settings 设置
typeAliases 类型命名
typeHandlers 类型处理器
objectFactory 对象工厂
plugins 插件
environments 环境
environment 环境变量
transactionManager 事务管理器
dataSource 数据源
databaseIdProviderchinese?
mappers 映射器
一、整体配置文件介绍
<properties resource="jdbc.property">
<property name="password" value="123456"/>
</properties>
<?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>
<properties resource="jdbc.property">
<property name="password" value="123456"/>
</properties>
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="logImpl" value="log4j"/>
</settings>
<typeAliases>
<package name="package.mybatis.bean"/>
</typeAliases>
<mappers>
<mapper resource="package/mybatis/mapper/StudentMapper.xml"/>
<mapper class="package.mybatis.dao.StudentDao"/>
<package name="package.mybatis.dao"/>
</mappers>
</configuration>
二、Mybatis拦截器【不做要求】
拦截器名 |
作用 |
Executor |
拦截执行器的方法 |
ParameterHandler |
拦截参数的处理 |
ResultHandler |
拦截结果集的处理 |
StatementHandler |
拦截Sql语法构建的处理 |
实际上、Executor就能处理所有、其他的并不怎么好用
参考案例
@Intercepts({
@Signature(type = Executor.class, method = "update", args = { MappedStatement.class,Object.class }),
@Signature(type = Executor.class, method = "query", args = { MappedStatement.class,Object.class,RowBounds.class,ResultHandler.class })
})
public class MyPlugin implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
if ("update".equals(invocation.getMethod().getName())) {
MappedStatement mstt = (MappedStatement) invocation.getArgs()[0];
Object object = invocation.getArgs()[1];
Student info=(Student)object;
info.setName("我不是汉武帝");
}
System.out.println("方法执行");
return invocation.proceed();
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
}
}
<!--配置文件-->
<plugins>
<plugin interceptor="package.plugin.MyPlugin">
<property name="name" value="admin"/>
</plugin>
</plugins>
三、缓存
一级缓存 session级别、【默认开启】、增删改默认刷新一级缓存(一定要commit哦)
一级缓存是SqlSession级别的缓存。在操作数据库时需要构造 sqlSession对象,mybatis 使用HashMap 来存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap),所以是互不影响的
二级缓存【默认是关闭、不常用】
是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的
使用步骤
1、修改mybatis-config.xml的setting设置
<setting name="cacheEnabled" value="true"/>
2、Mapper.XML:加入:<cache/>
3、缓存的bean要实现序列化接口 Serializable
4、一定要关闭第一个sqlSession
//SqlSession:连接对象Connection、mybatis的session并不是会话,指的就是Sql的Connection
SqlSession session1 = sqlSessionFactory.openSession();
SqlSession session2 = sqlSessionFactory.openSession();
//为了使用缓存、sql语句一定要统一规范
StudentDao dao1=session1.getMapper(StudentDao.class);
System.out.println("查询一次数据");
List<Student> list1 = dao1.getStudentAll();
for (Student student : list1) {
System.out.println(student);
}
session1.close();
System.out.println("第二次查询数据");
Thread.sleep(10000);
StudentDao dao2=session2.getMapper(StudentDao.class);
System.out.println("查询一次数据");
List<Student> list2 = dao2.getStudentAll();
for (Student student : list2) {
System.out.println(student);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构